EXCEL 複数条件でリストから選択するドロップダウンリストを作成する方法

スポンサーリンク
050-VBA

へっぽこヘタレエセシステム管理者の管理人です。

さて、先日は・・・

全銀フォーマットのエクセルマクロでてこずったところですが、

人間なんて我儘なもので・・・

さらに追加要求がきました。

要求内容は・・・

銀行名を入力したら、該当する銀行の支店リストから選択できるようにしてほしいと・・・

べつに手で入力すればいいじゃんと思うのですが、

これがACCESSだったらSQLを使えば簡単にできるのですが、

エクセルだったらどうやるのか???

とちょっと調べてみたくなったので、引き受けることにしました。

銀行と支店の一覧は、次の様なDB形式で持っています。

ACCESSだったら、入力された銀行名でクエリを掛けて、

できたクエリから選択するリストを作ればよいだけなのですが・・・

セクセルでは簡単にはできないようでした。

マクロ付きエクセルはこちらから

で、ネットやらAIを駆使して調べて結果、

とりあえず、下の図様に・・・

縦でも横でも良いのですが・・・

銀行と支店の表を変換しなければなりません。

まず、これが面倒くさい。

銀行が少なければ問題ないのですが、数が多いので、

これを手作業でやるとなると、見ただけでやりたくありません。

ということで、これはマクロを作って変換させます。

面倒くさいのでかなり適当に作りましたが、

思っとおりには動いてくれたので、良しとします。

銀行DBというDB形式のシートから

銀行リストというシートを作るマクロです。

Sub henkan()

    Dim maxrow As Long

        '最大行の取得
        maxrow = Cells(Rows.Count, "A").End(xlUp).Row
        
    '変数の設定
    Dim columnA As Long
    Dim rowA As Long
        
    columnA = 1 'シート_銀行リストの列
    rowA = 2    'シート_銀行リストの行
    
    Dim X As Worksheet
    Dim Y As Worksheet
    
    Set X = Worksheets("銀行DB")
    Set Y = Worksheets("銀行リスト")
    
    
    Y.Cells(1, 1) = X.Cells(2, 1)   '銀行リスト1行目の設定
    
    For i = 2 To maxrow
    
        If X.Cells(i, 1) = X.Cells(i + 1, 1) Then   '銀行DBの銀行名が次の行と同じなら
        
            Y.Cells(rowA, columnA) = X.Cells(i, 2)  '支店名を取得
            rowA = rowA + 1 '銀行リストの行を1増やす
        
        Else
            Y.Cells(rowA, columnA) = X.Cells(i, 2)  '銀行DBの銀行名が次の行と異なる場合に最後の支店名を取得
        
            rowA = 1    '銀行リストの行を1に戻す
            Y.Cells(rowA, columnA + 1) = X.Cells(i + 1, 1)  '次の銀行名を取得
            columnA = columnA + 1   '銀行リストの列を1増やす
            rowA = rowA + 1 '銀行リストの行を1増やす
        
        End If
                    
    Next i
    
    

End Sub

これで、下図のようなリストができます。

マクロの作成に1時間くらいかかったのですが、

おそらく手作業よりは早かったと思いたい・・・

そこから、全選択して、名前の管理から名前を付けます。

ただ、この方法だと・・・

支店名が最大件数の銀行に行数がそろってしまうので・・・

支店のドロップダウンリストを開いたときに・・・

空白行がある銀行がたくさんできるという問題が発覚しました。

自動で、空白行は削除してくれないようです。

ということで・・・

これも1列1列手作業でやれば、きれいなモノができるのですが・・・

さすがに面倒くさいので、マクロでやっつけることにしました。

スポンサーリンク

こちらのマクロは簡単です。

数分でできました。

単純に操作の記録をやって、

列だけ移動して繰り返すマクロです。

銀行数(列の最大数)だけ繰り返します。

Sub Macro1()
'
' Macro1 Macro
'

'

For i = 1 To 289

    Cells(1, i).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.CreateNames Top:=True, Left:=False, Bottom:=False, Right:= _
        False

    
    i = i + 1
    
Next i
    
        
End Sub

次に・・・

ブログランキングにご協力ください!
ブログランキング・にほんブログ村へ

入力規則から、銀行名を入力するセルに銀行一覧から

選択するドロップダウンリストを作ります。

シート銀行リストの1行目が銀行名なので、これを全選択ですね。

次に支店名を入力するセルに、

銀行名から該当する支店だけのリストが表示されるようにします。

同じく入力規則で、下図のように・・・

【=indirect(銀行名のセル)】

を入力します。

これで完成です。

なんでもそうですが・・・

知ってしまえば、簡単なことですが、

知らないと時間が掛かります。

ただ、この仕組みは、やってみましたが、あまり利便性は感じませんでした。

ACCESSだったら・・・

簡単に銀行名を入力したら銀行CDを取得・・・

反対に、銀行CDを入力したら銀行名を取得・・・

さらに、支店コードまたは支店名を入力したら・・・

支店名または支店コードを取得するというフォームが簡単に作れます。

EXCELではこういうわけにはいかないので、

やはりデータを入力するなら、ACCESSの方が簡単です。

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました