
ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし、
各コンボボックスへ銀行名、支店名を入力すると銀行コートを「TextBox1」へ支店コードを「TextBox2」へ
表示するため、下記コードで書いてみました。
しかし、2つのコンボボックスが連動していないため、複数銀行で同一支店名を入力すると図のように他銀行の支店コードを表示してしまします。
*みずほ銀行の品川支店の支店コードは、「195」なのに、連動の仕方が解らず
りそな銀行、品川支店の支店コード「306」を表示してしまします。
お手数ですが連動させるにはどのような修正を加えたらよいかお知恵を貸していただけませんでしょか。
宜しくお願い致します。
Private Sub UserForm_Initialize()
With Worksheets("銀行別支店コード")
For i = 4 To .Cells(Rows.Count, 1).End(xlUp).Row
ComboBox1.AddItem .Cells(i, 1).Value
ComboBox2.AddItem .Cells(i, 3).Value
Next
End With
End Sub
・・・・・
Private Sub ComboBox1_Change()
Dim r As Range
Set r = Worksheets("銀行別支店コード").Columns("A:A").Find _
(ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
TextBox1.Value = r.Offset(0, 1).Value
Else
TextBox1.Value = ""
End If
End Sub
・・・・
Private Sub ComboBox2_Change()
Dim r As Range
Set r = Worksheets("銀行別支店コード").Columns("C:C").Find _
(ComboBox2.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
TextBox2.Value = r.Offset(0, 1).Value
Else
TextBox2.Value = ""
End If
Private Sub UserForm_Initialize()
With Worksheets("銀行別支店コード")
For i = 4 To .Cells(Rows.Count, 1).End(xlUp).Row
ComboBox1.AddItem .Cells(i, 1).Value
ComboBox2.AddItem .Cells(i, 3).Value
Next
End With
End Sub
・・・・・
Private Sub ComboBox1_Change()
Dim r As Range
Set r = Worksheets("銀行別支店コード").Columns("A:A").Find _
(ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
TextBox1.Value = r.Offset(0, 1).Value
Else
TextBox1.Value = ""
End If
End Sub
・・・・
Private Sub ComboBox2_Change()
Dim r As Range
Set r = Worksheets("銀行別支店コード").Columns("C:C").Find _
(ComboBox2.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
TextBox2.Value = r.Offset(0, 1).Value
Else
TextBox2.Value = ""
End If
End Sub

No.3ベストアンサー
- 回答日時:
Private Sub UserForm_Initialize()
のようなコードで重複しない銀行名リストでComboBox1を設定して
ComboBox2には値を与えないようにします
ComboBox1のChangeで
TextBox1の値を代入(行われています)と同時に
選択している値を基にComboBox2を設定します
一例では、ComboBox1の設定する時に店舗名と支店番号を同時に取得する方法を取っています。
ComboBox2ChangeでシンプルにTextBox2に値を代入する事が出来ます
処理の各箇所にはやり方が色々ありますが一例です
ユーザーフォームの書き出しで追加のご相談
ユーザーフォームの値をシートに書き出す際、コードが表示される。
2つのコンボボックスを連動させるコードを教えていただき、その後、ユーザーフォームを書き出すコードを作成しました。
しかしコンボボックスに表示された値と連動させたテキストボックスの値が書き出されてしまいます。
追加の質問で恐縮ですがコード上どこを修正したら良いかご教示いただけませんでしょうか?
よろしくお願いいたします。
Private Sub CommandButton1_Click()
Dim i As Long
Dim lastRow As Long
With Worksheets("Sheet1")
lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
.Cells(lastRow, 2).Value = ComboBox1
.Cells(lastRow, 3).Value = TextBox1.Text
.Cells(lastRow, 4).Value = ComboBox2
.Cells(lastRow, 5).Value = TextBox2.Text
End With
End Sub
No.4
- 回答日時:
すみません、以前のご質問で回答させていただいた時の様に
1文字入力時に実行されないようにExitイベントを使う方が良かったかもしれません
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
また、入力銀行名が見つからない場合、dic.Countは0でdic.Count-1としているのでエラー9が返るのだと思われます
従って、dicに登録できない事を想定して
End With
If dic.Count < 1 Then Exit Sub
ReDim arrList(dic.Count - 1, 1)
でいかがでしょうか
Exit Subだと何も起こらなかったようになってしまいますので
Msgboxなどで入力確認を促して、フォーカスを戻す等するのが良いかも知れません
入力自体をさせないようにするのは、面倒なようですので
選択のみ有効にするのはあまり良くないのかなと思いました
あまりにも選択種が多い場合、よくあるATMの様に頭文など文字入力ごとに
選択リストを絞って行く方法なども考えられますね
この場合は見やすさを考えるとチェックボックスやTextBoxとListBoxの連携になりますでしょうか・・
条件でリストを絞るやり方を覚えると色々出来そうですね
時間のある時に色々やってみてください
昨夜は遅くまでありがとうございます。
完璧なご解答に感謝です。
私もQchan1962さんのような仕事ができるよう身を正します。素晴らしい!
No.2
- 回答日時:
こんばんは
やぱりComboBoxですよね。やり方は色々あります
現行だと同じ銀行名に複数支店があるとComboBox1に同じ銀行名が複数出来ると思います。
文字数オーバーの為説明は再投稿します
Unique関数が使える環境でしたら
Private Sub UserForm_Initialize()
Dim 銀行List, i As Long
ComboBox2.Clear
With Worksheets("銀行別支店コード")
銀行List = WorksheetFunction.Unique(.Range("A4", .Cells(.Rows.Count, "A").End(xlUp)))
For i = 1 To UBound(銀行List)
ComboBox1.AddItem 銀行List(i, 1)
Next
End With
End Sub
Private Sub ComboBox1_Change()
Dim i As Long
Dim r As Range
Dim dic As Object
Dim 支店名, 支店番号
Dim arrList()
With Worksheets("銀行別支店コード")
'銀行コード
Set r = .Columns("A:A").Find _
(ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
TextBox1.Value = r.Offset(0, 1).Value
Else
TextBox1.Value = ""
End If
'クリアー時の処理
Controls("ComboBox" & 2).Clear
If ComboBox1 = "" Then Exit Sub
'ComboBox2のデータ取得加工
Set dic = CreateObject("Scripting.Dictionary")
For i = 4 To .Cells(Rows.Count, 1).End(xlUp).Row
If Not dic.Exists(.Cells(i, 3).Value) _
And ComboBox1.Value = .Cells(i, 1).Value Then
dic.Add .Cells(i, 3).Value, .Cells(i, 4).Value
End If
Next
End With
ReDim arrList(dic.Count - 1, 1)
支店名 = dic.Keys '念のため
支店番号 = dic.items
For i = 0 To dic.Count - 1
arrList(i, 0) = 支店名(i)
arrList(i, 1) = 支店番号(i)
Next
'ComboBox2の設定
With ComboBox2
.ColumnCount = 1 '表示列数
.TextColumn = 1 'Textで取得する列
.BoundColumn = 2 'Valueで取得する列
.List = arrList '参照List
End With
End Sub
Private Sub ComboBox2_Change()
'ComboBox2.Valueを設定(Textは支店名)
TextBox2.Value = ComboBox2.Value
End Sub
No.1
- 回答日時:
こんにちは
「銀行別支店コード」というシートの構成がわかりませんけれど、1行が
A列 銀行名
B列 銀行コード
C列 支店名
D列 支店コード
という構成で、全てのセルが埋められているとするなら・・
ComboBox2_Change で、単にC列だけを検索すると最初に見つかった支店名が一致する行を返しますので、ご質問のような状態になります。
支店名を探す時には、銀行名、支店名ともに一致する行を探す必要があるのではないでしょうか?
対策としては、
・現行の方法のままで行うなら、Findでヒットした際に、A列(銀行名)が一致しているかをチェックし、違っていたら次の支店名をFindで検索する。
あるいは、
・先に、銀行名でシートにフィルタをかけておいてから、Findを実行する。
(非表示の行はFindでヒットしませんので、現状のロジックでもそのまま使えると思います。)
(シートのフィルタの方法は、マクロの記録である程度分かると思います)
※ シートのレイアウトが違う場合は、上記の方法では求められない可能性がありますけれど・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォームで銀行に対応した支店コードの入力ができません Sheet1のA列に銀行名、B列に銀行 5 2022/07/28 17:50
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Excel(エクセル) マクロで列を加えたら上手くいかなくなりました。 2 2022/05/23 17:59
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
videopadについて
-
access2021 VBA メソッドまたは...
-
コンパイルエラー 変数が定義...
-
【VB6】実行ファイルとした後、...
-
VBA リストボックス(複数条件...
-
1日に1人がこなせるプログラム...
-
2つの住所録の照合
-
1、Rstudioで回帰直線を求める...
-
エクセルに見えない文字(JISX0...
-
JANコードとPOSコードは同じ?
-
コマンドボタンを押したときに...
-
SQL
-
メッシュコードからマップを作...
-
VB2005 RowFilterのパラメータ...
-
Exel VBA 別ブックから該当デ...
-
VB6のComboBox関連の書き方をVB...
-
エクセル VBA 同じ内容のセル...
-
VB6.0にてStreamReaderを使用...
-
マクロでピボットテーブルを作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1日に1人がこなせるプログラム...
-
JANコードとPOSコードは同じ?
-
access2021 VBA メソッドまたは...
-
Excel VBA素人です。VBAで図形...
-
Exel VBA 別ブックから該当デ...
-
access2003 クエリSQL文に...
-
エクセルに見えない文字(JISX0...
-
Nullの使い方が不正です。
-
【VB6】実行ファイルとした後、...
-
VBAでファイルオープン後にコー...
-
オートフィルタで抽出結果に 罫...
-
PreviewKeyDownイベントが2回...
-
JavaScriptの定数名が取り消し...
-
Excel VBAでOpenTextのFieldInf...
-
COBOLの文法
-
ACCESSユニオンクエリでORDER B...
-
Access DCountでの連番について
-
VBA リストボックス(複数条件...
-
C# コードビハインドについて
おすすめ情報
ありがとうございます。
素晴らしい、コンボボックス2に該当支店しか表示しないなんて夢のようです。
あと1点だけ教えてください。
コンボボックス1へプルダウンを選ばず(登録銀行が24行と多いため)直接銀行名を入力しようとすると
「ReDim arrList(dic.Count - 1, 1)」がエラーになります。
回避することができますでしょうか?
よろしくお願い致します。