VBA初心者ながら、顧客管理用に入力フォームなどを作っています。
検索フォームを作成し、名前や住所などをキーワードに実行ボタンを押して検索すると、顧客シートからデータを引っ張ってきて、検索フォームの下に対象リストが表示されます。(今回の場合は顧客シートのNo1、12、17のデータを引っ張ってきています。)
そこから、イメージとしては、画像のように3件結果が出力された内、一番上の検索結果をクリックすると、入力フォームに選択した対象者の情報が表示されるようなことをしたいのですが、何から手をつけたらよいかがわかりません・・・。
ちなみに、検索フォームに表示される値は、実際の入力フォームに入力する項目より少ない(例えば、入力フォームでは「ふりがな」がありますが、検索フォームに検索結果としては「ふりがな」は表示されていません。)
かなり大雑把な質問ですが、アドバイスなど頂けると幸いです。
No.2ベストアンサー
- 回答日時:
リストで選択したデータが存在する行番号が rowNumber に正しく取得できていますか?
私のサンプルで想定している環境は以下のように想定しています。
・ データ群が書き込まれているシートの 1行目が項目名になっていて、2行目からデータが入力されている。
・ 1つのデータは 1行で完結する。
・ 1列目(A列)には抜けもれなく通し番号が振ってある。(1件目の A2 が 1 で、 2件目の A2 が2、以下 1ずつ増えていっている)
・ 検索フォームのリストボックスの 1列目は、データ群のシートの A列の値(通し番号)が表示されている。
という状況なので、
1. 検索結果のリストから 1つのクリックする。
2. クリックされたリスト項目の 1列目の値をもとに、元の場所の行番号を割り出す。(元のデータのシートは 2行目からデータが始まっているのでリスト項目 1列目の値に 1 を加算すれば元の行番号になる)
もし以下のような環境だと、選択したリスト項目の内容から元のデータの行番号を推察することができません。
・ データ群のシートの 1列目は ID となっていて、改廃されていくと番号が飛ぶこともある。
・ 検索フォームのリストの 1列目は ID の値である。
この場合はリストボックスの 1列目に隠し列を作って起き、元の行番号を表示させておくのはどうでしょうか。
1列目の列幅を 0 pt にすれば見えません。(ColumnWidth プロパティ)
御礼が遅くなってしまって申し訳ござません。
一応、条件としては問題無いようなんですが、初心者なので教えて頂いた点以外に問題があるかもしれません・・・。
教えて頂いた点を参考にもう一度、トライしてみます。
色々とありがとうございました。勉強になりました!
No.3
- 回答日時:
こんにちわ
ユーザーフォーム1の質問ではないと思いますが、
入力項目が多いので、簡単にしてみました。
'"顧客シート"のA列~Q列にデータがある
'氏名は2(B)列、住所は4(D)列、電話番号は6(F)列、メールアドレスは8(G)列
'ColumnWidthsが、0だと表示しない(ふりがな)
'xyLIst配列は、一次元目が列、二次元目が行になっている。
'Me.ListBox1.Column() = xyLIstで行列入れ替えている。
'UserForm1にはTextBox1、CommandButton1、CommandButton2、
'CommandButton3、CommandButton4、ListBox1が有る。
'ここからUserForm1のコード
Const cSheetName As String = "顧客シート"
Private Sub UserForm_Initialize()
Me.CommandButton1.Caption = "氏名で検索"
Me.CommandButton2.Caption = "住所で検索"
Me.CommandButton3.Caption = "電話番号で検索"
Me.CommandButton4.Caption = "メールアドレス検索"
Me.ListBox1.ColumnCount = 10
Me.ListBox1.ColumnWidths = _
"30;50;0;150;150;50;50;150;50;50"
End Sub
Private Sub CommandButton1_Click() '氏名で検索
'氏名は2(B)列、住所は4(D)列、電話番号は6(F)列、メールアドレスは8(G)列
Call 検索(2)
End Sub
Private Sub CommandButton2_Click() '住所で検索
'氏名は2(B)列、住所は4(D)列、電話番号は6(F)列、メールアドレスは8(G)列
Call 検索(4)
End Sub
Private Sub CommandButton3_Click() '電話番号で検索
'氏名は2(B)列、住所は4(D)列、電話番号は6(F)列、メールアドレスは8(G)列
Call 検索(6)
End Sub
Private Sub CommandButton4_Click() 'メールアドレス検索
'氏名は2(B)列、住所は4(D)列、電話番号は6(F)列、メールアドレスは8(G)列
Call 検索(8)
End Sub
Private Sub 検索(ByVal 検索列 As Long)
Dim xyLIst As Variant
Dim Ws As Worksheet, xText As String
Dim i As Long, j As Long, k As Long, n As Long
Dim iCol As Long, iRow As Long
xText = Me.TextBox1.Text
If xText = "" Then
MsgBox "TextBoxに入力してください。"
Exit Sub
End If
Set Ws = Sheets(cSheetName)
iCol = Ws.Range("A1").CurrentRegion.Columns.Count
iRow = Ws.Range("A1").CurrentRegion.Rows.Count
ReDim xyLIst(1 To iCol, 1 To 1)
n = 0
For i = 2 To iRow
If InStr(Ws.Cells(i, 検索列).Value, xText) Then
n = n + 1
ReDim Preserve xyLIst(1 To iCol, 1 To n)
For j = 1 To iCol
xyLIst(j, n) = Ws.Cells(i, j).Value
Next j
End If
Next i
If n = 0 Then Exit Sub
Me.ListBox1.Column() = xyLIst
End Sub
使用方法
まず、テキストボックスに入力します。
その後、検索ワードの種類に会ったコマンドボタンをクリックする。
No.1
- 回答日時:
検索用フォームの名前が UserForm1 で入力用フォームの名前を UserForm2 として
例えば UserForm1 の ListBox の 1列目の値から 「選択したデータが元のワークシートの何行目にあるか」 を推測できるとします。
UserForm2 の Initialize イベントの中で UserForm1 の 「ListBox で選択されている行の 1列目の値」 を取得し、この値を元にオリジナル データのシート上での行番号を算出する。
その行番号を元にしてシート上に格納されている各列のデータを UserForm2 の各種コントロールに入れ込む。
という感じ。
Form2 のコード
------------------------------
Option Explicit
Dim rowNumber As Long ' オリジナルデータが書き込まれている行番号
Private Sub UserForm_Initialize()
' UserForm1 の ListBox で選択されている行のデータから行番号を算出。
' 「+ 1」 とかはシートのヘッダー行数に合わせて適宜調整。
rowNumber = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 0) + 1
' データを読み込んでフォーム上のコントロールに配置する
Call ReadData(rowNumber)
End Sub
Private Sub ReadData(rowNumber As Long)
' ブックやシートの参照方法はお好きに
Dim dataSheet As Worksheet
Set dataSheet = ThisWorkbook.Worksheets(1)
Me.TextBox1.Text = dataSheet.Cells(rowNumber, 1).Value
Me.TextBox2.Text = dataSheet.Cells(rowNumber, 2).Value
Me.TextBox3.Text = dataSheet.Cells(rowNumber, 3).Value
End Sub
ありがとうございます。
教えて頂いた通りやってみたのですが、どうしても一覧リストに表示された検索結果をクリックしても、入力フォームに表示されません・・・。
こちらのオブジェクトの名前などにしてみたのですが、これがそもそもちがうのかもしれません。
Private Sub UserForm_Initialize()
'検索フォーム の ListBox で選択されている行のデータから行番号を算出。 ' 「+ 1」 とかはシートのヘッダー行数に合わせて適宜調整。
rowNumber = 検索フォーム.一覧リストボックス.List(検索フォーム.一覧リストボックス.ListIndex, 0) + 1
' データを読み込んでフォーム上のコントロールに配置する
Call ReadData(rowNumber)
End Sub
Private Sub ReadData(rowNumber As Long)
' ブックやシートの参照方法はお好きに
Dim dataSheet As Worksheet
Set dataSheet = ThisWorkbook.Worksheets("相談者情報")
Me.IDラベル = dataSheet.Cells(rowNumber, 1).Value
Me.初回月テキストボックス.Text = dataSheet.Cells(rowNumber, 2).Value
Me.氏名テキストボックス.Text = dataSheet.Cells(rowNumber, 3).Value
Me.ふりがなテキストボックス.Text = dataSheet.Cells(rowNumber, 4).Value
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
エクセルで検索結果をユーザーフォームに表示したいのですが
Excel(エクセル)
-
VBAでユーザーフォームにセル値を表示させるには
Visual Basic(VBA)
-
-
4
エクセルVBAリストボックスに表示された検索結果をクリックして、該当するセルをアクティブセルにしたい
Excel(エクセル)
-
5
Excel VBAのリストボックスの値を他のフォームに反映させる方法を教えてください。
Visual Basic(VBA)
-
6
VBA リストボックス(複数条件)で検索し、転記方法についてご教示ください。
Visual Basic(VBA)
-
7
Excel VBA ユーザーフォーム内のラベルにテキストボックスの小計を出す方法
Visual Basic(VBA)
-
8
エクセルVBA 複数列のリストボックス内を検索して値を複数列表示したい
Excel(エクセル)
-
9
UserForm1.Showでエラーになります。
工学
-
10
検索結果の指定列をリストボックスに反映したい
Excel(エクセル)
-
11
ユーザーフォームで別シートを検索できますか
Excel(エクセル)
-
12
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
URLのリンク切れをマクロを使っ...
-
VBAのFind関数で結合セルを検索...
-
マクロ 最終列をコピーして最終...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
vba 2つの条件が一致したら...
-
VBAで、離れた複数の列に対して...
-
VBA 何かしら文字が入っていたら
-
ExcelのVBAで下線部分の取得・...
-
Changeイベントでの複数セルの...
-
VBAでのリスト不一致抽出について
-
ダブルクリック 条件 分岐
-
複数の列の値を結合して別の列...
-
VBAで重複データを確認したい
-
エクセルVBAで『A列』に新...
-
Cellsのかっこの中はどっちが行...
-
複数csvを横に追加していくマク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
セルに値が入っていた時の処理
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
おすすめ情報