プロが教える店舗&オフィスのセキュリティ対策術

VBA初心者ながら、顧客管理用に入力フォームなどを作っています。

検索フォームを作成し、名前や住所などをキーワードに実行ボタンを押して検索すると、顧客シートからデータを引っ張ってきて、検索フォームの下に対象リストが表示されます。(今回の場合は顧客シートのNo1、12、17のデータを引っ張ってきています。)

そこから、イメージとしては、画像のように3件結果が出力された内、一番上の検索結果をクリックすると、入力フォームに選択した対象者の情報が表示されるようなことをしたいのですが、何から手をつけたらよいかがわかりません・・・。

ちなみに、検索フォームに表示される値は、実際の入力フォームに入力する項目より少ない(例えば、入力フォームでは「ふりがな」がありますが、検索フォームに検索結果としては「ふりがな」は表示されていません。)

かなり大雑把な質問ですが、アドバイスなど頂けると幸いです。

「Excel VBA 検索した値を入力フォ」の質問画像

A 回答 (3件)

リストで選択したデータが存在する行番号が 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 プロパティ)
    • good
    • 0
この回答へのお礼

御礼が遅くなってしまって申し訳ござません。
一応、条件としては問題無いようなんですが、初心者なので教えて頂いた点以外に問題があるかもしれません・・・。
教えて頂いた点を参考にもう一度、トライしてみます。
色々とありがとうございました。勉強になりました!

お礼日時:2016/06/13 11:51

こんにちわ



ユーザーフォーム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


使用方法
まず、テキストボックスに入力します。
その後、検索ワードの種類に会ったコマンドボタンをクリックする。
    • good
    • 1
この回答へのお礼

御礼が遅くなってしまってもうしわけございません。
ありがとうございました。参考にさせて頂きます。

お礼日時:2016/06/13 11:31

検索用フォームの名前が 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
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えて頂いた通りやってみたのですが、どうしても一覧リストに表示された検索結果をクリックしても、入力フォームに表示されません・・・。

こちらのオブジェクトの名前などにしてみたのですが、これがそもそもちがうのかもしれません。

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

お礼日時:2016/06/10 00:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A