[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ドロップダウンリストの初期値を表示させる』(みえ)
お世話になります。
Excel2016でドロップダウンリストを設定して、そのリストの先頭の値を表示させておくことは出来るのでしょうか?
関数やVBAなどいろいろ調べましたが、そもそも関数やVBAの知識が無い為コピペして少しいじる感じでやってみましたが、うまく機能せず今回はお手上げな為おわかりになる方、どうかご教授頂けないでしょうか。
やりたい事は
A1 B1
『ああ』 『aa』
『いい』 『bb』
『うう』 『cc』
とA1、B1にそれぞれドロップダウンリストが設定されています。
A1が『ああ』『いい』を選択した時は初期値を『aa』、『うう』を選択した時は『cc』というようにA1の選択によってB1のリスト内容を変更し、そのリストの先頭の値を初期値として表示させたいのです。
A1の選択によってB1のリストの選択範囲を指定出来る事は承知しています。
初期値を表示する方法を色々検索しやってみましたが、例えば数式をB1に入れてしまうとドロップダウンリストをいじった時点で数式が消えてしまいその後機能しなくなってしまいます。
VBAでも『A1がああならaa』『A2がああならaa』と一行ずつ対応するよう入力して作りましたが、B1の『aa』をリストから『bb』に変更した後、A2を入力するとVBAが働きB1が『aa』に戻ってしまいます。
なので、ドロップダウンリストの選択範囲を変える設定をし、初期値としてリストの先頭がB1に表示されれば一番簡単で問題は解決すると思うのですがどうでしょうか。
設定したい行数は15行あります。
宜しくお願い致します。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>VBAでも『A1がああならaa』『A2がああならaa』と一行ずつ対応するよう入力して作りましたが そのコードを提示されるとより良い回答があると思いますけど。 (しが) 2022/05/26(木) 15:26
私が検索しまくって似た処理をするVBAがこれしか見つけられず、ものすごく手間ですが下記コードでやってみました。
Sub Macro1()
If Cells(1, 1) = "ああ" Then
Cells(1, 2) = "aa" ElseIf Cells(1, 1) = "いい" Then Cells(1, 2) = "aa" ElseIf Cells(1, 1) = "うう" Then Cells(1, 2) = "cc" End If End Sub
です。これを15行分繰り返しコード入力をして作成しました。
これだと、A1を選択した時点でB1に初期値の『aa』が表示されますが、『aa』からドロップダウンリストで『bb』に変更後、A2を選択するとB1がまた『aa』に戻ってしまいます。
このコードじゃそりゃそーだよなってわかっているのですが、コードを一から書くことが出来ない為自分ではどうすれば良いのかさっぱりわかりません...
(みえ) 2022/05/26(木) 15:54
B1 のドロップダウンリストは何のためにあるんですか。 質問内容から見ると必要ないような気がしてなりません。 15行分とはリストが15項目あるというとですか。 ドロップダウンリストは先頭から順番に、それとも順不同で選択するのどちらでしょうか。 (しが) 2022/05/26(木) 17:05
A1:A15にこの機能が必要だとした場合 まず、リストの元データを何処かに作成する(例では、D1:G3)
<サンプル> 行 __A__ _B_ _C_ __D__ _E_ _F_ _G_ 1 ああ aa ああ aa bb zz 2 うう dd いい 3 ああ bb うう cc dd 4 いい aa
次に、下のコードを当該シートの「シートモジュール」に貼り付ける 重要:「標準モジュール」ではない。
Private Sub Worksheet_Change(ByVal Target As Range) Dim pos, rw, list
If Intersect(Target, Range("A1:A15")) Is Nothing Then Exit Sub ElseIf Target.CountLarge > 1 Then Exit Sub End If
pos = Application.Match(Target, Range("D1", Cells(10000, "D").End(xlUp)), 0)
If IsError(pos) Then Target.Offset(, 1) = Empty Exit Sub ElseIf IsEmpty(Cells(pos, "E")) Then rw = Cells(pos, "D").End(xlUp).Row Else rw = pos End If
With Application list = Join(.Transpose(.Transpose(Range(Cells(rw, "E"), Cells(rw, 1000).End(xlToLeft)))), ",") End With
With Target.Offset(, 1).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=list .InCellDropdown = True End With
Application.EnableEvents = False Target.Offset(, 1) = Cells(rw, "E").Value 'リストの先頭値を入力する Target.Offset(, 1).Select Application.EnableEvents = True End Sub
(半平太) 2022/05/26(木) 19:40
選択肢が1つしか無い場合にトラブりますので、以下に変更します。(上のコードは 後刻 削除します)
Private Sub Worksheet_Change(ByVal Target As Range) Dim pos, rw, ListAdrs As String
If Intersect(Target, Range("A1:A15")) Is Nothing Then Exit Sub ElseIf Target.CountLarge > 1 Then Exit Sub End If
pos = Application.Match(Target, Range("D1", Cells(10000, "D").End(xlUp)), 0)
If IsError(pos) Then Target.Offset(, 1) = Empty Exit Sub ElseIf IsEmpty(Cells(pos, "E")) Then rw = Cells(pos, "D").End(xlUp).Row Else rw = pos End If
ListAdrs = Range(Cells(rw, "E"), Cells(rw, 1000).End(xlToLeft)).Address
With Target.Offset(, 1).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=" & ListAdrs .InCellDropdown = True End With
Application.EnableEvents = False Target.Offset(, 1) = Cells(rw, "E").Value 'リストの先頭値を入力する Target.Offset(, 1).Select Application.EnableEvents = True End Sub
(半平太) 2022/05/26(木) 20:35
ご返信ありがとうございます!
(しがさま) B1のリストは基本は『aa』ですが、たまに『cc』になる事もあります。 Excelがほとんど使えない上司の為に最小限の手間になるよう作成するのが目的です。
(半平太さま) コードを書いて下さりありがとうございます。 またトラブルなど考慮し再考下さり大変感謝致します。 会社に行かないとPCがないので(すみません…)、明日やってみます! リストの元データは別シートに作成してあるのでそこだけ変えてやってみますね! またご報告させて頂きます!! (みえ) 2022/05/26(木) 21:03
>B1のリストは基本は『aa』ですが、たまに『cc』になる事もあります。
間違えました。基本は『aa』ですが、たまに『bb』になる事があります。 (みえ) 2022/05/26(木) 21:13
>B1のリストは基本は『aa』ですが、たまに『cc』になる事もあります。 >Excelがほとんど使えない上司の為に最小限の手間になるよう作成するのが目的です。 そんなことを聞いているのではありません。 読み返してください。 (しが) 2022/05/26(木) 22:11
(半平太さま) お世話になります。 今日早速やってみてVBAはきちんと機能してくれましたが、A1を選択すると、B1のドロップダウンリストが一つだけになってしまい、 他を選ぶことが出来ませんでした。 『ああ』→『aa』のみ、『いい』→『bb』のみ、『うう』→『cc』のみというような感じです。
私の説明が悪く伝わりづらくて申し訳ありません... 応用してやってみようといじってみましたが、やはり私には出来ませんでした。
もしまたお時間頂けるようならご再考お願い出来ませんでしょうか。 こちらも引き続き調べつついじってみます。
直接使用する言葉、シート、セル名で書かせて頂きますね。
ドロップダウンリストの元データは別シート「Sheet1」A1〜A7、B1〜B6にあり。(このシートは通常非表示)
シート≪Sheet1≫非表示
__A_____B__ 1|基礎 |加工・組立 2|土間 |加工 3|デッキ |組立 4|RC |"空白" 5|外構 |大型2t 6|運搬費 |大型3t 7|ブロック代|
シート「A表」C13〜C27に基礎、土間などのドロップダウンリストを設定。 D13〜D27に加工・組立、加工などのリストを設定。 このブックを開けば基本が表示されている。 いろいろいじって使用後はマクロボタンで基本に戻るよう作成済み。
シート≪A表≫
基本 __C____D__ 13|基礎 |加工・組立 14|土間 |加工・組立 15|デッキ |加工・組立 16|運搬費 | 17| |
の形。
それが例えば、 __C_____D__ 13|土間 |加工・組立 14|外構 |加工・組立 15|デッキ |加工・組立 16|RC |加工・組立 17|運搬費 |
__C_____D__ 13|基礎 |加工・組立 14|土間 |加工・組立 15|運搬費 | 16|ブロック代| 17| |
のようにC列が減ったり増えたりする。
C列のドロップダウンリスト項目『基礎〜外構』までに対するD列のドロップダウンリストの項目は『加工・組立〜組立』 同じく『運搬費、ブロック代』に対するD列の項目は『"空白"、大型2t、大型3t』
C列が選択された時点でD列には初期値『加工・組立』または『"空白"』を表示。 D列の『加工・組立』は状況により『加工』や『組立』になるのでその時はドロップダウンリストから都度選択する。 同じく『"空白"』は『大型2t』や『大型3t』になる場合がある。
例 __C_____D__ 13|基礎 |加工 14|土間 |加工・組立 15|デッキ |組立 16|外構 |加工・組立 17|運搬費 |大型3t
というような感じです。 長々と下手な説明申し訳ありません。
おわかりになりましたら再度宜しくお願い致します。 何度もお手数お掛けして誠に申し訳ありません... (みえ) 2022/05/27(金) 14:25
>今日早速やってみてVBAはきちんと機能してくれましたが、 >A1を選択すると、B1のドロップダウンリストが一つだけになってしまい、 >他を選ぶことが出来ませんでした。
私のコードは、Sheet1が以下のレイアウトになっている想定なので、まともに動かないハズです。
<Sheet1 シート> 行 _____A_____ _____B_____ ___C___ ___D___ 1 基礎 加工・組立 加工 組立 2 土間 3 デッキ 4 RC 空白 大型2t 大型3t 5 外構 6 運搬費 7 ブロック代
ただ、現在の状態で、そちら独自のマクロが既に動いているなら、 私にはどんな仕掛けがあるのか分かりませんので、お役に立てません。m(__)m
(半平太) 2022/05/27(金) 15:04
そもそもリストの作り方が間違えてたんですね! すみませんでした...
半平太さんの作り方でまっさらなExcelで作成してみたところ、 きちんと初期値が表示され、ドロップダウンリストも選択出来ました! ただ、運搬費、ブロック代のところを、どこに何をどう設定すればいいのかわからず、 運搬費、ブロック代も『加工・組立』のリストになってしまいます...すみません...
もしこちらで設定しているマクロがなければやり方はありますか?
無知で丸投げ状態で本当に本当に申し訳ありません... まだ助けてやろうというお気持ちがありましたら宜しくお願い致しますm(,_,)m (みえ) 2022/05/27(金) 16:01
>『"空白"、大型2t、大型3t』 ↑ これは、文字の「空白」じゃなく、本当の空白(Empty)なんですね?
Emptyであるとすると、プログラムはそのセルをスルーしてもっと上を見に行くので、 「基礎」リストまで行っちゃいます。
なので、B列に何か埋める必要があります。(何でもいいですが、例ではtopと入れました)
<Sheet1 サンプル> 行 _____A_____ _B_ _____C_____ ___D___ ___E___ 1 基礎 top 加工・組立 加工 組立 2 土間 3 デッキ 4 RC top 大型2t 大型3t 5 外構 6 運搬費 7 ブロック代
A表のシートモジュールに↓
Private Sub Worksheet_Change(ByVal Target As Range) Dim rw, ListAdrs As String Dim WsList As Worksheet
If Intersect(Target, Range("C13:C27")) Is Nothing Then Exit Sub ElseIf Target.CountLarge > 1 Then Exit Sub End If
Set WsList = Worksheets("Sheet1")
rw = Application.Match(Target, WsList.Range("A1:A1000"), 0)
If IsError(rw) Then Application.EnableEvents = False Target.Offset(, 1) = Empty Application.EnableEvents = True Exit Sub ElseIf IsEmpty(WsList.Cells(rw, "B")) Then '空白なら上にあるリストを見に行く rw = WsList.Cells(rw, "B").End(xlUp).Row End If
ListAdrs = WsList.Range(WsList.Cells(rw, "C"), WsList.Cells(rw, 1000).End(xlToLeft)).Address(, , , True)
With Target.Offset(, 1).Validation ’入力規則を設定する .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=" & ListAdrs .InCellDropdown = True End With
Application.EnableEvents = False Target.Offset(, 1) = WsList.Cells(rw, "C").Value 'Topの右の値を入力する Target.Offset(, 1).Select Application.EnableEvents = True End Sub
(半平太) 2022/05/27(金) 17:06
ご返信本当にありがとうございます!!
そうです、空白は本当の空白のことです! 再度コードを書いて頂き感謝感謝です(T ^ T)
お願いしておいて確認出来るのが火曜日になってしまうのですが、 再度ご報告させて頂きますので、お時間がありましたらご一読頂けたら嬉しいですm(_ _)m
本当に本当にありがとうございます!! (みえ) 2022/05/27(金) 19:39
お世話になります。
半平太さん!バッチリ出来ました!! 思った通りの処理をしてくれました!!
本当に本当にありがとうございました(T_T) 助かりました。 私も少しずつでも勉強していくよう頑張ります!
この度は何度も何度もお手数お掛けしてしまって 申し訳ありませんでした。 ほんとーーーーーーっにありがとうございました☆ (みえ) 2022/05/31(火) 10:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.