dポイントプレゼントキャンペーン実施中!

VBA初心者です!!
ユーザーフォームを使って検索するフォームを作成しております。

検索結果をリストボックスに表示しており、そのリストボックスにヘッダーをつけたいのですが
RowSourceプロパティの記載方法がわからず教えて頂きたいです!!!

リストボックスのカラムの並びが
2列目、24列目、25列目、19列目、21列目、8列目
としております。
その場合、RowSourceをどのように記載すればよいのでしょうか・・・。
通常の範囲指定にすると、思ったものと違う内容が出てきてしまいました。

ご教授いただけますと幸いです。どうぞよろしくお願いいたします。

'----------------------------------------------
'ユーザーフォームの初期設定:リストの全データを表示しています。
Private Sub UserForm_Initialize()

Dim lastRow As Long
Dim myData, myData2()
Dim i As Long, j As Long, cn As Long

Dim myBook As Workbook
Set myBook = Workbooks("顧客リスト.xlsm")
With myBook.Worksheets("顧客一覧")
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(4, 1), .Cells(lastRow, 25)).Value
End With

With ComboBox1
.AddItem "男性"
.AddItem "女性"
.AddItem "回答なし"
End With

With ListBox1
.ColumnCount = 6
.ColumnWidths = "30;100;100;200;200;100"
   .RowSource= ********* 'ここの書き方がわからないです・・・・・
End With
End Sub

Private Sub CommandButton1_Click()
Dim lastRow As Long
Dim myData, myData2(), myno
Dim i As Long, j As Long, cn As Long

Dim myBook As Workbook
Set myBook = Workbooks("顧客リスト.xlsm")

'検索するデータを配列 myData に格納しています。
With myBook.Worksheets("顧客一覧")
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(4, 1), .Cells(lastRow, 25)).Value
End With

'配列 myData の中で検索で一致したデータを配列 myData2 に格納しています。
ReDim myData2(1 To lastRow, 1 To 6)
For i = LBound(myData) To UBound(myData)
If myData(i, 20) Like "*" & TextBox1.Value & "*" And myData(i, 20) Like "*" & TextBox2.Value & "*" And myData(i, 20) Like "*" & TextBox3.Value & "*" And myData(i, 11) = ComboBox1.Value Then

cn = cn + 1
myData2(cn, 1) = myData(i, 2)
myData2(cn, 2) = myData(i, 24)
myData2(cn, 3) = myData(i, 25)
myData2(cn, 4) = myData(i, 19)
myData2(cn, 5) = myData(i, 21)
myData2(cn, 6) = myData(i, 8)

End If
Next i

'検索で一致したデータをリストボックスに表示します。
With ListBox1
.ColumnCount = 6
.ColumnWidths = "30;100;100;200;200;100"
.List = myData2
End With

End Sub

A 回答 (2件)

こんにちは



>リストボックスにヘッダーをつけたいのですが~
ご提示のコードには無いようですが、「ColumnHeads 」のことでしょうか?
RowSourceで指定する場合、内容は「セル範囲」となり、タイトルには指定範囲の1行上の内容が使用されます。
(そういう仕様なので、個別に設定はできないようです。)

現在のシートでは、項目タイトルが3行目に存在しているということでしょうか?
また、RowSourceの範囲は矩形のセル範囲となっていますので、まとめて設定することしかできません。
もしも3行目に項目タイトルがあるのなら、25列目迄の全部を範囲として設定しておいて、不要な列に関しては幅を0にしておくことで、必要な列だけを表示することは可能です。
ただし、列の順序を入れ替えることはできません。

列の順序も入れ替えて、かつ、タイトルも使いたいようであれば、シートの空きセル(または専用の非表示シートでも良い)に、VBAで一旦並べ替えた表を作成して、そちらをRowSourceとして参照するような仕組みにすれば可能と思います。

最初に並べ替えた表を作成してしまえば、ご提示のコードの後半のように、検索後に並び替えるような手間もなくなると思いますし、作業用のシートを編集することで、結果に反映することもできるものと思います。

あるいは、No1様の回答にもあるように、ListViewコントロールを使うかでしょうか。
    • good
    • 0
この回答へのお礼

助かりました

>25列目迄の全部を範囲として設定しておいて、不要な列に関しては幅を0にしておくことで、必要な列だけを表示することは可能です。
その方法がありましたか!!!!確かに!!!!
ちょっと目からウロコでした。

>列の順序も入れ替えて、かつ、タイトルも使いたいようであれば、シートの空きセル(または専用の非表示シートでも良い)に、VBAで一旦並べ替えた表を作成して、そちらをRowSourceとして参照するような仕組みにすれば可能と思います。
こちらは私のちからでは物凄く時間がかかってしまいそうなので、一旦教えていただいた幅0で対応して、のちの勉強材料にさせていただきたいと思います!!
すっごくすっごく勉強になりました!!

ちなみにListViewコントロールというものを使ったことがないので、、、
こちらも次回の勉強に使わせていただこうと思います。

ありがとうございました!!

お礼日時:2021/12/03 10:32

こんにちは


>リストボックスのカラムの並びが2列目、24列目、25列目、19列目、21列目、8列目
後の.List = myData2、、、

通常、
.ColumnHeads = True
.RowSource =範囲
ですが、試していないのですが、確か出来なかった記憶がありますね。

UserForm上のコントロールの配置を工夫するなどしてラベルで表示的に代替えするか
ListViewコントロールで代替えするか、、ですかね。
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
そうか、、、、できないんですね。。勉強になりました!!!!

別シートに結果をきれいに並び替えて表示させ、表示させたシートをリストで読み取るようにすれば良いかな?
とも考えたのですが
私のちからではできずwwww

そのため、アナログに手作業でリストボックスの上にラベルを書くということに致しました。。。。

お礼日時:2021/12/02 17:42

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

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


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