出産前後の痔にはご注意!

はじめまして、ゴールデンウィーク中にVBAを勉強していますが、上手くいきません。内容は、「UserForm1を使って別シートにあるデーターから検索を行い、ListBox1に抽出されたリストを選択すると個別のTextBox2に関連する詳細を表示させる」というものです。別シートには「顧客データ」があり、A列より「担当、氏名、カタナカ、住所、電話番号・・・」とデーターが並んでいます。中途半端な状態ですが、これ以上進めません。だれか助けてください。


Private Sub CommandButton1_Click()
Dim Namae As String
Dim MeNamae As Object
Dim ken As String

Namae = TextBox1.Text
Set MeNamae = UserForm1
Call 検索(Namae, MeNamae)

End Sub
'受付画面に検索画面窓を出し、顧客データから検索した結果を出すマクロ
Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object)
Dim Nagasa As Integer
Dim i As Long
Dim MaxRows As Long
Dim kensaku As Object
Dim KensakuChar As String
Dim ListNamae As String
Dim ListChar As String
Dim KBanme As Integer
Dim LBanme As Integer

Set kensaku = Worksheets("顧客データ")
MaxRows = kensaku.UsedRange.Rows.Count
Nagasa = Len(Namae)

MeNamae.ListBox1.Clear

For i = 3 To MaxRows
ListNamae = kensaku.Cells(i, 3)
KBanme = 0
LBanme = 0
Do
Do While Nagasa >= KBanme
KBanme = KBanme + 1
KensakuChar = Mid(Namae, KBanme, 1)
If KensakuChar <> " " Then
Exit Do
End If
Loop
Do While Nagasa >= LBanme
LBanme = LBanme + 1
ListChar = Mid(ListNamae, LBanme, 1)
If ListChar <> " " Then
Exit Do
End If
Loop

If KensakuChar = ListChar Then
If Nagasa = KBanme Then
With MeNamae
.ListBox1.AddItem (ListNamae)
End With
End If
Else
Exit Do
End If
Loop Until Nagasa <= KBanme
Next

End Sub

Private Sub ListBox1_Click()
With ListBox1
If .ListIndex > -1 Then
TextBox2.Value = .List(.ListIndex, 0)’←これでは何の意味も無い
' TextBox2.Value = kensaku.Cells(kensakuIndex, 3)
' TextBox2.Value = kensaku.Cells(kensaku, 3)
' TextBox2.Text = kokyaku.Hoken4
'      TextBox2.Text = kokyaku.Cells(i, 5)

End If
End With

End Sub

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんな方法はどうでしょうか?



見つけた名前をリストに追加する時に、その行も記録します。
.ListBox1.AddItem (ListNamae)
の次の行に
.ListBox1.List(.ListBox1.ListCount - 1, 1) = i
を追加します。
これで、名前リストを見つけた行も記録します。
List()の引数は0から始まるので.ListBox1.ListCount-1に記録します。
プロパティウインドウでTextBox2のMultiLineをTrueにして、ListBox1_Click()の部分を以下にしてみてください。
Private Sub ListBox1_Click()
Dim r As Long
With ListBox1
If .ListIndex > -1 Then
r = .List(.ListIndex, 1) '選択した名前の行
TextBox2.Value = Worksheets("顧客データ").Cells(r, 4) & vbCrLf & Worksheets("顧客データ").Cells(r, 5)
End If
End With
End Sub

p.s.
Dim MeNamae As Object
Dim kensaku As Object
Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object)
の、As Objectは、できるだけ避けた方がいいと思います。
Dim MeNamae As UserForm
Dim kensaku As Worksheet
Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm)
にすれば、VBEの入力支援機能が機能して、入力が楽になり、エラーも見つけやすくなると思います。

この回答への補足

早速のお返事とても感謝いたしております。
記述を以下のように変更いたしましたが、「TextBox2」に表示もされずまた、終了もされません。まだ何か間違いなどありますでしょうか?
大変お手数ですが、再度お返事よろしくお願い致します。


Private Sub CommandButton1_Click()
Dim Namae As String
Dim MeNamae As UserForm
Dim ken As String

Namae = TextBox1.Text
Set MeNamae = UserForm1
Call 検索(Namae, MeNamae)

End Sub
Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm)
Dim Nagasa As Integer
Dim i As Long
Dim MaxRows As Long
Dim kensaku As Worksheet
Dim KensakuChar As String
Dim ListNamae As String
Dim ListChar As String
Dim KBanme As Integer
Dim LBanme As Integer

Set kensaku = Worksheets("顧客データ")
MaxRows = kensaku.UsedRange.Rows.Count
Nagasa = Len(Namae)

MeNamae.ListBox1.Clear

For i = 3 To MaxRows
ListNamae = kensaku.Cells(i, 3)
KBanme = 0
LBanme = 0
Do
Do While Nagasa >= KBanme
KBanme = KBanme + 1
KensakuChar = Mid(Namae, KBanme, 1)
If KensakuChar <> " " Then
Exit Do
End If
Loop
Do While Nagasa >= LBanme
LBanme = LBanme + 1
ListChar = Mid(ListNamae, LBanme, 1)
If ListChar <> " " Then
Exit Do
End If
Loop

If KensakuChar = ListChar Then
If Nagasa = KBanme Then
With MeNamae
.ListBox1.AddItem (ListNamae)
.ListBox1.List(.ListBox1.ListCount - 1, 1) = i
End With
End If
Else
Exit Do
End If
Loop Until Nagasa <= KBanme
Next

End Sub
Private Sub ListBox1_Click()
Dim r As Long
With ListBox1
If .ListIndex > -1 Then
r = .List(.ListIndex, 1) '選択した名前の行
TextBox2.Value = Worksheets("顧客データ").Cells(r, 4) & vbCrLf & Worksheets("顧客データ").Cells(r, 5)
End If
End With
End Sub

補足日時:2008/05/04 21:57
    • good
    • 0
この回答へのお礼

こちらの手違いでした。動作は完璧です。まさに理想通りにうごきました。動かないと思っていたのはテキストボックスが小さかった為見えなかったからでした。大変失礼いたしました。すみませんでした。また、大変感謝いたしております。

お礼日時:2008/05/04 22:27

もう判ったようだが、折角やってみたので載せておく。


自分の作ったコードのコピーを貼り付けて、読者に読み解かせるのでなく
下記のような解説が必要と思う。
ーー
顧客データシート
担当会社所在地業種年商
係A山田産業喜多町衣類販売20
係B小池商事本町食料品卸35
課長北野新宿町紙製品15
係C近藤組諏訪町建設解体10
係A北村機械北公園輸送機械25
課長南塗料新町塗料卸8
係B島田製菓八幡町菓子製造15
係A北モータス学園町クルマ修理7
係A西食品本郷食品加工25
ーーーー
(道具だて)
UserForm1を1つ挿入する。
その上のコントロールは
検索語を入力用ーーーテキストボックス
選択用アイテム表示ーリストボックス
検索開始のトリガーーコマンドボタン
リストボックス選択後の内容表示用ーーテキストボックス3つ
ーーーー
(処理の流れ)
textBox1に検索語を入れる
コマンドボタンクリック
顧客データシート検索
候補リストをリストボックスのアイテムとして表示
リストボックスにリストから選択
決定内容(顧客データ)の特定の行の項目をテキスト
ボックスに表示
ーーー
(コード)
標準モジュールに
Public gyo(10)
を入れる
ーーー
リストボックスの選択の前まで
Private Sub CommandButton1_Click()
Dim Namae As String
Dim MeNamae As Object
Dim ken As String

Namae = TextBox1.Text
Set MeNamae = UserForm1
Call 検索(Namae, MeNamae)

End Sub
'---
Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object)
Dim Nagasa As Integer
Dim i As Long
Dim MaxRows As Long
Dim kensaku As Worksheet
Dim KensakuChar As String
Dim ListNamae As String
Dim ListChar As String
Dim KBanme As Integer
Dim LBanme As Integer

Set kensaku = Worksheets("顧客データ")
MaxRows = kensaku.UsedRange.Rows.Count
Nagasa = Len(Namae)
MsgBox MaxRows
MeNamae.ListBox1.Clear
j = 0

For i = 2 To MaxRows + 1
If kensaku.Cells(i, "A") = Namae Then
With MeNamae.ListBox1
.AddItem
.List(j, 0) = kensaku.Cells(i, "B")
.List(j, 1) = kensaku.Cells(i, "C")
' & kensaku.Cells(i, "B") & kensaku.Cells(i, "C")
j = j + 1
End With
End If
Next i

End Sub
ーーー
選択後の詳細データ表示は
(1)再検索法
(2)Public変数に保持法
(3)ListBoxの列に保持法
(4)配列データ引数引渡し
など考えられるが、本件は(2)でやった。
ーー
Private Sub ListBox1_Click()
Set kensaku = Worksheets("顧客データ")
With ListBox1
If .ListIndex > -1 Then
x = ListBox1.ListIndex
'MsgBox x
MsgBox gyo(x + 1)
TextBox2.Value = .List(.ListIndex, 0)
TextBox3.Value = .List(.ListIndex, 1)
TextBox4.Value = kensaku.Cells(gyo(x + 1), 4)
TextBox5.Value = kensaku.Cells(gyo(x + 1), 5)
End If
End With
End Sub
ーーー
(操作例)
テキストに「係A」と入力
リストボックスに
山田産業
北村機機械
北モータース
西食品
が出る
例えば北村機械をクリックすると、各テキストボックスに
北村機械
北公園
輸送機械
25
が出る。
    • good
    • 0
この回答へのお礼

親切な回答ありがとうございます。詳しければ詳しいほど初心者である私には今後につなげることができます。これからも詳しい回答を期待しております。この度はありがとうございました。

お礼日時:2008/05/19 09:08

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexcelのリストボックスで選択した項目をアクティブセルに入力方法

もしかしたら既出かもしれませんが・・・
フォームコントロールのリストボックスで入力範囲の指定したリストをリンクするセルをワークシート上にクリックしたセルに入力させる方法はありますか?
もし、不可能でしたら、ActiveXコントロールのリストボックスでも構いません。よろしくお願いいたします。

Aベストアンサー

そのリストボックスの、コードの表示で
Private Sub ListBox1_Click()
ActiveCell = ListBox1.List(ListBox1.ListIndex)
End Sub
と入れるだけ。
コントロールツールボックスのコントロールを、ワークシートに直接
貼り付けた場合。
WEBや解説書で、ListboxとかListindexなど調べましたか。

Q検索結果の指定列をリストボックスに反映したい

ユーザーフォームにTextbox、検索ボタン、Listboxを配置しました。
Textboxに「E列」の大分類(例:「35」)を入力して、検索ボタンを押すと、「35」のレコードのA列とB列だけListboxに反映させるようにしたいです。
皆さん、教えて下さい!宜しくお願いします。

 A列     B列    C列      D列    E列
商品コード/商品名/仕入先コード/仕入先名/大分類
123456 りんご 011 AAA 35
456789 ばなな 012 BBB 35
234567    テーブル  013 CCC 23

Aベストアンサー

元データはSheet1にあるとして

private sub CommandButton1_Click()
 dim r as long
 if me.textbox1 = "" then exit sub
 me.listbox1.clear
 me.listbox1.columncount = 2

 with worksheets("Sheet1")
 for r = 2 To .range("E65536").end(xlUp).row
  if cstr(.cells(r, "E").value) = me.textbox1.value then
   me.listbox1.additem .cells(r, "A").value
   me.listbox1.list(me.listbox1.listcount - 1, 1) = .cells(r, "B").value
  end if
 next r
 end with
end sub

ぐらいで,逐一追加していくのが一番簡単かと思います。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QExcel VBA 検索した値を入力フォームに表示

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

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

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

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

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

Aベストアンサー

リストで選択したデータが存在する行番号が 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 プロパティ)

リストで選択したデータが存在する行番号が rowNumber に正しく取得できていますか?
私のサンプルで想定している環境は以下のように想定しています。

・ データ群が書き込まれているシートの 1行目が項目名になっていて、2行目からデータが入力されている。
・ 1つのデータは 1行で完結する。
・ 1列目(A列)には抜けもれなく通し番号が振ってある。(1件目の A2 が 1 で、 2件目の A2 が2、以下 1ずつ増えていっている)
・ 検索フォームのリストボックスの 1列目は、データ群のシートの A列の値(通し番号)...続きを読む

QVBA・リストボックスの内容をセルに反映

 ListBox1からListBox2に追加した項目を、コマンドボタンを押すと、Sheet3のA1から下に並べていくようにしたいのですが、どうもうまくいきません。
リストボックスのプロパティにLinkedCellというのがあるらしいのですが、使っているバージョンには無いみたいです。
もう何日も頭をひねっているのですが、初心者なのでわかりやすく教えて頂けませんでしょうか?よろしくお願いします。

Aベストアンサー

思い違いはあるかと思いますが、こんなのではどうでしょう?
ユーザーフォームにリストボックスを2つ、ボタンを1つ貼り付け、ボタンを押すとリスト1で選択された値がリスト2にAddItemされ、かつ、リスト2の内容がシート3のA列に出力するようにしてみました。

----------------------------------------------
Option Explicit

'フォームイニシャライズ
Private Sub UserForm_Initialize()
'リスト1のRowSourceをシート1のA1からA4に設定
Me.ListBox1.RowSource = "Sheet1!A1:A4"
End Sub

'ボタン押下時
Private Sub CommandButton1_Click()
Dim i As Integer
'リスト1で選択された項目をリスト2へAddItem
With Me.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) Then
Me.ListBox2.AddItem .List(i)
End If
Next i
End With
'シート3のA列へ転記するプロシージャを実行
Call Disp
End Sub

'シート3にリスト2の値を出力するサブプロシージャ
Private Sub Disp()
Dim i As Integer
Dim row As Integer

'一旦A1を含むエリアをクリア
Sheet3.Range("A1").CurrentRegion.Clear
'リスト2の値を出力
row = 1
For i = 0 To Me.ListBox2.ListCount - 1
Sheet3.Range("A" & row).Value = Me.ListBox2.List(i)
row = row + 1
Next i
End Sub
----------------------------------------------

思い違いはあるかと思いますが、こんなのではどうでしょう?
ユーザーフォームにリストボックスを2つ、ボタンを1つ貼り付け、ボタンを押すとリスト1で選択された値がリスト2にAddItemされ、かつ、リスト2の内容がシート3のA列に出力するようにしてみました。

----------------------------------------------
Option Explicit

'フォームイニシャライズ
Private Sub UserForm_Initialize()
'リスト1のRowSourceをシート1のA1からA4に設定
Me.ListBox1.RowSource = "Sheet1!A1:A4"
End ...続きを読む

Qユーザーフォームのリストボックス選択

ユーザーフォームのコマンドボタンをクリックすると、アクティブシートのD列を検索して、リストボックスへ抽出するようになっています。
ここで知恵を頂き下記コードになっています。

更に下記を実行できるようにしたいと考えています。
リストボックスに抽出されたデータをクリック(または選択してコマンドボタン)すると
ラベル1へ→選択したデータの行のB列のデータを表示
ラベル2へ→選択したデータの行のE列のデータを表示

マクロは超初心者なので、とても無理なことなのかもしれませんがご教授頂ければ助かります。

Private Sub UserForm_Activate()
Worksheets("シート1").Activate
End Sub

Private Sub CommandButton1_Click()
Worksheets("メニュー").Select
UserForm2.Hide
End Sub

Private Sub CommandButton2_Click()
Dim myFirst As Range, myFound As Range
If TextBox3 = "" Then Exit Sub
Set myFound = Range("D:D").Find(what:=TextBox3, LookIn:=xlValues, lookat:=xlPart)
If Not myFound Is Nothing Then
ListBox1.Clear
Set myFirst = myFound
ListBox1.AddItem myFound
Do
Set myFound = Range("D:D").FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
ListBox1.AddItem myFound
Loop
Else
MsgBox "該当データなし"
End If
End Sub

ユーザーフォームのコマンドボタンをクリックすると、アクティブシートのD列を検索して、リストボックスへ抽出するようになっています。
ここで知恵を頂き下記コードになっています。

更に下記を実行できるようにしたいと考えています。
リストボックスに抽出されたデータをクリック(または選択してコマンドボタン)すると
ラベル1へ→選択したデータの行のB列のデータを表示
ラベル2へ→選択したデータの行のE列のデータを表示

マクロは超初心者なので、とても無理なことなのかもしれませんがご教授頂...続きを読む

Aベストアンサー

こんばんは!

>リストボックスに抽出されたデータをクリック(または選択してコマンドボタン)すると・・・

「リストボックスのデータをクリックすると」・・・にしてみました。
デザインモードにして、ListBox1をダブルクリックして↓のコードにしてみてください。

Private Sub ListBox1_Click()
Dim c As Range
Set c = Range("D:D").Find(what:=ListBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
Label1.Caption = Cells(c.Row, "B").Value
Label2.Caption = Cells(c.Row, "E").Value
End Sub

※ 当然のことながらD列に重複データは存在しないという前提です。m(_ _)m

Qエクセル VBA ユーザーフォーム リストボックスで選択した値をテキストボックスに自動表示

エクセル初心者です。
ユーザーフォームで検索窓を作成しリストボックスへ表示
         ↓
リストから選択すると同じユーザーフォーム内のテキストボックスに値が自動で表示
         
というフォームを作りたいのですがご教授お願いします。

A列   B列  C列   D列   E列
番号 / 品名 / 品番 / 原価 / メーカー
1    A   20×20  100  A社
2    A   20×30  150  A社
3    B   50×50  100  B社


下図のようなフォーマットで考えています。

Aベストアンサー

回答が付かないようなので、とりあえず・・・です。
シートの内容(A2:E4)をリストに表示し、そこで選択された行の内容をラベル?(A列・・・E列と表示されているところ)に表示するVBAを書いてみました。参考になりますかね?
もしかしたら、検索結果のみをリストに表示したいのでしょうか?
正直なところ、やりたいことがよくわからないので、適切な回答になっていないと思います。必要出れば追加で質問することをお勧めします。

以下、サンプルです。コードはユーザフォームの下に張り付けて下さい。
リストボックス名「ListBox1」
ラベル名「LabelA,LabelB,LabelC,LabelE」

Private Sub ListBox1_Click()
LabelA.Caption = ListBox1.List(ListBox1.ListIndex, 0)
LabelB.Caption = ListBox1.List(ListBox1.ListIndex, 1)
LabelC.Caption = ListBox1.List(ListBox1.ListIndex, 2)
LabelE.Caption = ListBox1.List(ListBox1.ListIndex, 4)
End Sub

Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 5
ListBox1.RowSource = "Sheet1!A2:E4"
ListBox1.ListIndex = 0
End Sub

回答が付かないようなので、とりあえず・・・です。
シートの内容(A2:E4)をリストに表示し、そこで選択された行の内容をラベル?(A列・・・E列と表示されているところ)に表示するVBAを書いてみました。参考になりますかね?
もしかしたら、検索結果のみをリストに表示したいのでしょうか?
正直なところ、やりたいことがよくわからないので、適切な回答になっていないと思います。必要出れば追加で質問することをお勧めします。

以下、サンプルです。コードはユーザフォームの下に張り付けて下さい。
リストボックス...続きを読む

Qエクセル リストボックスにセルの値を表示したい

Sheet1に
A1 a
A2 i
A3 u
と入力されています。

フォームのリストボックスにこの3つのセルを表示したいのですが
Private Sub UserForm_Initialize()
UserForm1.ListBox1.ControlSource = Sheets("Sheet1").Range(Cells(1, 1), Cells(1, 3))
End Sub
ではうまく行きません。

デバッグしてもなにも引っかからないのですが
実行すると
「実行時エラー13
型が一致しません」
となります。

「ControlSource」を「RowSource」に変えても同じでした。
※列が移動するため列番号を変数で取得したいのでCellsを使用しています。

ご教授よろしくお願いします。

Aベストアンサー

回答4、onlyromです。
大事なことを言い忘れ。。

ROWSOURCEプロパティを使うときは、リストに使う値がアクティブシートにない場合は、シート名を付けないとエラーになります。
ということで改めて回答です。


R = 5

UserForm1.ListBox1.RowSource = "Sheet1!A1:A" & R

UserForm1.ListBox1.RowSource = "Sheet1!" & Range(Cells(1, 1), Cells(R, 1)).Address

UserForm1.ListBox1.List = Sheets("Sheet1").Range("A1:A" & R).Value

UserForm1.ListBox1.List = Sheets("Sheet1").Range(Cells(1, 1), Cells(R, 1)).Value
 
このどれかを使えますが、セルの値を使うときは、Listプロパティをお勧めします。
 

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Qリストボックスをクリックすると、他フォームに値代入

データベース超初心者です。VBAの知識がほとんどないので、初歩的な質問だと思いますが、よろしくお願いします。
フォームは2つ「入力」と、「コード選択」

(1)フォーム「入力」にあるテキストボックス「商品コード」をダブルクリックすると、フォーム「コード選択」を開く

(2)フォーム「コード選択」にあるリストボックス「コードリスト」をダブルクリックすると、商品コードが、フォーム「入力」のテキストボックス「商品コード」に代入される。

ちなみに、コードリストは、2列で、商品コードと商品名が表示されるようになっています。

わかりにくい質問かもしれませんが、どうぞよろしくお願いします。

Aベストアンサー

コード選択画面のリストボックスの値の保持の仕方によって多少変更が必要になりますが、

入力画面側で

Private Sub テキスト_DblClick(Cancel As Integer)
DoCmd.OpenForm "コード選択" '「コード選択」フォームを開く
End Sub

で「コード選択」フォームを開き、
「コード選択」フォームで

Private Sub リスト_DblClick(Cancel As Integer)
Forms![入力]!テキスト = Me.リスト.Value  '.Text?
  DoCmd.Close acForm, Me.Name '自分のフォームを閉じる
End Sub

こんな感じでしょうか?


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

人気Q&Aランキング