へっぽこヘタレエセシステム管理者の管理人です。
さて、先日は・・・
全銀フォーマットのエクセルマクロでてこずったところですが、
人間なんて我儘なもので・・・
さらに追加要求がきました。
要求内容は・・・
銀行名を入力したら、該当する銀行の支店リストから選択できるようにしてほしいと・・・
べつに手で入力すればいいじゃんと思うのですが、
これが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の方が簡単です。



コメント