Excel VBA ユーザーフォームのリストボックスにRecordSetの値を入れた際のラベル行

このQ&Aのポイント
  • Excel VBAを使用して、ユーザーフォームのリストボックスにRecordSetの値を表示する方法について質問があります。
  • 現在の方法では、SQL文を生成し、シートのデータをRecordSetに格納し、2次元配列に変換してからリストボックスに表示しています。
  • しかし、この方法ではラベル行が空白になってしまいます。どのようにすればラベル行を表示することができるでしょうか?また、RecordSetから直接リストボックスに値を入れる方法はあるのでしょうか?
回答を見る
  • ベストアンサー

Excel VBA ユーザーフォームのリストボックスにRecordSetの値を入れた際のラベル行

以下のようなExcelシートがあります。 1行目はラベル行です。 [製品管理表] 1| 管理番号| 製品名 | 在庫数 | 2| A001 | 製品A | 2000 | 3| A002 | B製品 | 1700 | 4| A002 | B製品 | 1700 | ......以下1000行くらい続く この中から製品名で検索をかけて、検索結果をユーザーフォームの リストボックスに一覧表示させたいのですが、 現在の方法は、 検索条件を元にSQL文を生成、 ADOでシートをRecordSetに格納し、 RecordSetを2次元配列に格納、 2次元配列をリストボックスの要素にする。 ソースは以下の通りです。 ========================================================== Sub Test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset Dim strSQL As String Dim strName as String Dim strElements() As String Dim intRow As Integer Dim i, ii As Integer strName = Form1.TextBox1.Value With CN .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open ThisWorkbook.FullName End With If strName <> "" Then strSQL = "select * from [製品管理表$] " _ & where 製品名 Like '%" & strName & "%'" Else strSQL = "select * from [製品管理表$]" End If RS.Open strSQL, CN, adOpenStatic, adLockReadOnly intRow = RS.RecordCount If intRow = 0 Then MsgBox "条件に一致する製品名はありません" Exit Sub End If ReDim strElements(intRow, 3) For i = 0 To intRow - 1 For ii = 0 To 2 strElements(i, ii) = RS(ii).Value Next RS.MoveNext Next With Form1.ListBox1 .ColumnCount = 3 .BoundColumn = 1 .List = strElements .ColumnHeads = True End With End Sub ========================================================== この方法でも動くのですが、 問題点はラベル行が空白になってしまいます。 同じくリストボックスの要素を入れる方法として、 RowSource を使用すると ColumnHeads = True のときに 1行目がラベル行になるので、空白は想定外でした。 (1行目がラベルになるなら、配列にラベル名をぶち込んで しまえばいいと考えていたもので…) そこで質問なのですが、 (1)大枠はこのままで1行目をラベル行にする方法はあるのでしょうか? (2)ラベル行を明示的に指定する、 またはラベル名を手打ちするコードはあるのでしょうか? あと、 RecordSetから直接リストボックスの要素を入れる方法も あったら知りたいと思います。 皆さんのお知恵を是非貸してください!! よろしくお願いいたします。

  • T-K-G
  • お礼率100% (5/5)

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

(1)(2)ともに無いようですね。 どうも http://support.microsoft.com/kb/164343/ja この頃からの仕様のようです。 Sheet上にデータを置いてRowSourceを使うか、 Labelコントロールなどで代用するしかないのかもしれません。 >RecordSetから直接リストボックスの要素を入れる方法... With Form1.ListBox1   .ColumnCount = 3   .Column = RS.GetRows() End With みたいな事でしょうか。 http://msdn.microsoft.com/ja-jp/library/cc364163.aspx 以下、余談ですが、 >.Open ThisWorkbook.FullName 本番コードもこのように、自Bookに対してADOでアクセスする場合、メモリリークが発生するようですから、 その点を把握された上で運用なさったほうが良いかと。 http://support.microsoft.com/kb/319998/ja

T-K-G
質問者

お礼

>>RecordSetから直接リストボックスの要素を入れる方法... >With Form1.ListBox1 >  .ColumnCount = 3 >  .Column = RS.GetRows() >End With >みたいな事でしょうか。 まさに想像通りです!!ありがとうございます。 ただ(1)も(2)もだめなら end-uさんの仰るとおりシートにコピーしてからRowSourceにするか ColumnHeadsをやめてフォーム上にラベルを貼り付ける力技になりそうです。 本当にありがとうございました。

関連するQ&A

  • エクセルVBAユーザーフォーム・リストボックスについて

    エクセルVBAにてユーザーフォームを作りリストボックスにSheet1、AからEのデータすべてを 表示させることは出来るのですが、E行にデータがある物のみ表示する方法をご存じの方教えて頂けないでしょうか。 入力したソースは下記のとおりです。 Private Sub UserForm_Click() Dim lastRow As Long With Worksheets("Sheet1") lastRow = .Cells(Rows.Count, 5).End(xlUp).Row End With With ListBox1 .ColumnCount = 5 .ColumnWidths = "35;25;30;100;25" .RowSource = "Sheet1!A2:E" & lastRow .ColumnHeads = True End With End Sub

  • リストボックスの値を拾うには

    リストボックスの値を拾うには 以下のボタンコマンドでListBox1のListIndexから配列二番目の値を「hinban」という変数に取り込みたいのですがうまくいきません。 「hinban = ListBox1.List(ListBox1.ListIndex, 1)」という行を書いてみましたが 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」とアラートが出てしまいます。 VBA初心者です。 解決法を教えてください。 Private Sub CommandButton1_Click() Dim lastRow As Long Dim i As Integer With Worksheets("Sheet1") lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 'For i = 1 To 3 '.Cells(lastRow, i).Value = ListBox1.List(ListBox1.ListIndex, i - 1) hinban = ListBox1.List(ListBox1.ListIndex, 1) 'Next i End With End Sub

  • Excel VBA リストボックスについて

    現在エクセルのVBAを勉強中の 超初心者なのですが、 リストボックスを使うコードでエラーが出て どう直したらいいかわかりません。 下記コードをどのようになおしたらいいでしょうか? 回答、よろしくお願いいたします。 エラー内容は、実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です。 Private Sub UserForm_Initialize() 'リストボックスの設定 With ListBox1 .Font.Size = 10 .ColumnCount = 7 .ColumnWidths = "50;100;80;80;100;30;70" .TextAlign = fmTextAlignLeft .Font.Name = "MSゴシック" End With Dim i As Integer Dim LastRow As Integer LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To LastRow With ListBox1 .AddItem Cells(i, 1).Value .List(ListCount - 1, 1) = Cells(i, 2).Value .List(ListCount - 1, 2) = Cells(i, 3).Value ←ここでエラー .List(ListCount - 1, 3) = Cells(i, 4).Value .List(ListCount - 1, 4) = Cells(i, 5).Value .List(ListCount - 1, 5) = Cells(i, 6).Value .List(ListCount - 1, 6) = Cells(i, 7).Value End With Next End Sub

  • ユーザーフォーム、リストボックスに重複なしのリスト

    ユーザーフォームリストボックスに 重複なしのリストを作りたく、調べたところ以下のソースを発見しました。 記載した所思った通りに実装できたのですが ソースがのっていたのは 詳しく解説しているサイトではなくよくわからぬままソースのコピーで実装しています 出来れば、下記の解説をお願いしたいです Private Sub UserForm_Initialize() Dim f As Long Dim v As Variant Dim Lrow As Long Dim WS As Worksheet Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row v = WS.Range("A1:A" & CStr(Lrow)).Value With CreateObject("Scripting.Dictionary")    For f = 1 To UBound(v)       .Item(v(f, 1)) = Empty    Next    ListBox1.List = .Keys End With End Sub

  • EXCEL コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

  • Excel VBA ユーザフォームの検索について

    添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

  • リストボックスで選択した項目に該当するデーターをラベルに表示する

    よろしくお願いします ユーザーフォームにリストボックスが2つ ラベルが1つ 配置しています。 リストボックス1で選択した項目に該当するリストを リストボックス2に表示する。 次に リストボックス2で選択した項目に該当するデーターを ワークシートのセル(E5:E300)から選んで ラベル1に表示する。 このようにしたいのですがエラーが出ます。 Dim LastRow As Long Dim DstRow As Long Const FstRow As Long = 5 Dim MctRow As Long   -  -  - Private Sub UserForm_Initialize() With Me.ListBox1 .RowSource = Worksheets("入力").Range("A5:A300").Address(External:=True) End With End Sub   -  -  - Private Sub ListBox1_Click() Dim j As Integer Dim RowCnt As Long With Worksheets("入力") LastRow = .Range("E300").End(xlUp).Row ListBox2.Clear For RowCnt = 5 To LastRow If ListBox1.List(ListBox1.ListIndex) = .Cells(RowCnt, 3).Value Then ListBox2.AddItem For j = 0 To 1 ListBox2.List(ListBox2.ListCount - 1, j) = .Cells(RowCnt,5 + j).Value Next j End If Next RowCnt End With End Sub   -  -  - Private Sub ListBox2_Click() Dim SrcCode As Long SrcCode = ListBox2.List(ListBox2.ListIndex, 0)     ↑    ↑    ↑ ここでエラーになります。 実行時エラー 型が一致しません と表示されます With Worksheets("入力") LastRow = .Range("E300").End(xlUp).Row MctRow = Application.WorksheetFunction.Match(SrcCode, .Range("E5:E" & LastRow), 0) + 5 Label1 = Format(.Cells(MctRow, 5)) End With End Sub

  • VBA ユーザーフォーム リストボックスについて

    現在下記のようなコードで ユーザーフォームのリストボックスで表示されている 項目を選択した状態でボタンを押すと 選択されているセルのアドレスを取得するコードを組んでいます。 リストボックスに表示されている(一番左側)番号が 重複していなければ正しく機能するのですが 重複していると、上の方が優先されてしまい 下のリストを選択している状態でコードを実行しても 上のセルのアドレスが表示されてしまいます。 リストの一番左側の番号が重複しているとき 左から2番目の日付と時間の項目(添付画像を参照)を対象にして 正しくセルのアドレスを取得していです。 もし今回のコードのようなやり方でなくても 単純にリストボックスにで選択状態になっているセルアドレスを調べられればそれでもいいです。 Private Sub CommandButton2_Click() Dim ss As String ss = ListBox1.Text If ss <> "" Then Dim r As Range, s As Range Set s = Range(ListBox1.RowSource) Set r = s.Find(ss, LookAt:=xlWhole) If Not r Is Nothing Then MsgBox r.Address(RowAbsolute:=False, ColumnAbsolute:=False) End If End If End Sub

  • ADOでRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?