[[20220526132851]] 『ドロップダウンリストの初期値を表示させる』(みえ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ドロップダウンリストの初期値を表示させる』(みえ)

お世話になります。

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.