マンガでよめる痔のこと・薬のこと

下記の件に関しご教授願います。

Excelで、コンボボックスのデータ取得を、ワークシートに書き出してからそれをListFillRange等で行っていましたが、レコードセットしたテーブルのデータを直接取得することは出来ないでしょうか。

RowSourceType = "Field List"等試してみましたがわかりませんでした。もしExcelで出来るようでしたらお教えください。


Dim objcon As ADODB.Connection
Dim objrs As ADODB.Recordset
Dim i As Integer

Set objcon = New ADODB.Connection
Set objrs = New ADODB.Recordset

objcon.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\process.mdb"

Dim code As Variant
Dim mmcode As Variant

mmcode = Worksheets("入力sheet").Range("d100").Text

code = "'" & mmcode & "%'" '

With objrs
.ActiveConnection = objcon
.Source = "select 顧客名 from 002顧客名 where 県名 like " & code & ";"
.Open
End With

ここから、ワークシートに書き出してましたが、コンボボックスのリストに直接指定したいのです。

下記の方法で試しましたが、浅い知識ではうまくいきませんでした。
ComboBox4.RowSourceType = "field list"
ComboBox4.RowSource = objrs
何か方法があればお教えください。

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

A 回答 (3件)

こんにちは。



試しに、下記手順を行って下さい。

1. process.mdb と同じフォルダ内に新規ブックを作成
2. シート名を [入力sheet] に変更
3. D110 セル付近に ComboBox を一つ書き込む
  ※[表示]-[ツールバー]-[コントロール ツールボックス]から
4. ワークシート"入力sheet" モジュールに下記ソースをコピペ

以上。

' 場所: ワークシート"入力sheet" モジュール

Option Explicit

Private Const MDB_NAME = "process.mdb" ' MDB ファイル名

Private Sub Worksheet_Change(ByVal Target As Range)
  
  Dim Sql  As String
  Dim sCode As String
  
  ' 値が変化したセルが D100 だったら実行
  If Target.Address = "$D$100" Then
    ' 県名コード取得
    sCode = Me.Range("D100").Text
    ' Sql 生成
    Sql = ""
    Sql = Sql & "SELECT [顧客名]"
    Sql = Sql & " FROM [002顧客名]"
    If sCode = "" Then
      Sql = Sql & ";" ' 全件出力
    Else
      Sql = Sql & " WHERE [県名] LIKE '" & sCode & "%';"
    End If
    ' コンボボックスにデータ追加
    Call ComboBoxAddItem(Sql)
  End If

End Sub

' コンボボックスにアイテムを追加します
Private Sub ComboBoxAddItem(ByVal Sql As String)
  
  Dim Cn   As ADODB.Connection
  Dim Rs   As ADODB.Recordset
  Dim sConStr As String
  
  ' MDB 接続文字列 -----------------------------------------------
  sConStr = "Provider=Microsoft.Jet.OLEDB.4.0;" _
      & "Data Source=" & ThisWorkbook.Path & "\" & MDB_NAME
  '---------------------------------------------------------------
  Set Cn = New ADODB.Connection
  Set Rs = New ADODB.Recordset
  ' DB 接続を開く
  Cn.Open sConStr
  ' 読み取り専用でレコードセットを作成
  Rs.Open Sql, Cn, adOpenStatic, adLockReadOnly
  ' ComboBox に追加
  Me.ComboBox1.Clear
  If Not Rs.EOF Then
    Rs.MoveFirst
    While Not Rs.EOF
      Me.ComboBox1.AddItem Rs![顧客名]
      Rs.MoveNext
    Wend
    Rs.Close: Set Rs = Nothing
  End If
  Cn.Close: Set Cn = Nothing
  
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
こちらはまだうまくいかないのですが、推測とヘルプ参照だけでは、対応出来ないレベルのようで、VBAのデータベース関連の所を今勉強中です。いま少し時間を下さい。

お礼日時:2006/11/02 09:43

#1 補足について



Excel VBA の話ですよね?

コントロール名はご自分のものに合わせて下さい。
それから、該当データが1件も無い場合の例外処理も必要ですよ。

ComboBox とはユーザーフォーム上ですか? それともワークシート上に
[表示]-[ツールバー]-[コントロール ツールボックス]で書いたものですか?

この回答への補足

御返事ありがとうございます。
ComboBoxは、ワークシート上に書いたものです。
VBAは、標準モジュールでなく、Worksheets("入力sheet")に書いてます。
宜しくお願いいたします。

補足日時:2006/10/30 14:12
    • good
    • 0

こんばんは。

KenKen_SP です。

Excel の ComboBox なら AddItem するとか。

ComboBox1.Clear
objrs.MoveFirst
While Not objrs.EOF
  ComboBox1.AddItem Rs![顧客名]
  objrs.MoveNext
Wend

試してないし、回答はコピペではなく直打ちなので若干ミスがあるが
あるかもしれませんが、こんな感じです。

AddItem 以外ではご質問にあるとおり、セル経由の ListFillRange を
使うか、レコードセットの内容を一度配列にしまって List を使います。

が、、これは「同一内容を別の場所にコピー」するという点でともに
効率の悪い方法ですから最初から AddItem すると良いと思います。

この回答への補足

御返事遅れ大変失礼しました。
試してみたのですが、
1行目で
ComboBox1.Clear
(予期せぬエラー)
が発生、その後1行目を削除して動かしたら

objrs.MoveFirst
While Not objrs.EOF
  ComboBox1.AddItem Rs![顧客名]
  (オブジェクトが必要です)
と、ここでエラーメッセージがでます。
いろいろ試したのですが、うまくいきませんでした。
追加アドバイスをお願いいたします。

補足日時:2006/10/30 09:54
    • good
    • 0

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

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

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

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

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

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

QExcelVBA コンボボックスに入力があったらリンクしてテキストボックスを更新したい

フォームで入力画面をつくっています。
あるコンボボックスのリストから項目が選択されたら、一覧からリンクさせてテキストボックスの内容を更新がしたいのです。
例えば「社員コード」のコンボボックスで「3」が選択されたら、「社員名」のテキストボックスに別シートに作成してある社員一覧から「太郎」が表示されるというようにです。

セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。コンボボックスのChangeイベントでB1の内容をテキストボックスへ送っているのですが、カーソルを別の項目へ移動するまではテキストボックスの内容が更新されません。
コンボボックスのリストを選択した時点でテキストボックスを更新する方法はないでしょうか?

Aベストアンサー

こんばんは。

今は、Form というのは、UserForm のことだと思います。Excelには、フォームツールもありますが、レガシーツールですから、割愛します。

>セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。
UserForm で、なぜ、ComboBox で、A1 にリンクさせるのでしょうか?
リンクというのは、ControlSource のことだと思います。それでは、出来ませんね。
Change イベントに組み込まないといけません。そのような方法をしなくても可能です。

'-------------------------------------------
たとえば、ワークシートのセルに社員コードと社員名を入れたもの書かれてあるとします。
次に、ComboBox のプロバティの「RowSource」に少なくとも、2列を登録します。

なお、ComboBoxは、2列も入れることが可能です。
ColumnCount | 2 ,ColumnWidth | 20 pt; 20 pt (pt は省略可)のようにすることが可能です。

そうして、以下のようにすれば、テキストボックスに出てくるはずです。

 .ListIndex + 1 と+1しているのは、初期値が -1 で、最初が、0 からだからです。

'-------------------------------------------
Private Sub ComboBox1_Change()
Dim ret As Variant
  With ComboBox1
  ret = Application.VLookup(.ListIndex + 1, ActiveSheet.Range(.RowSource), 2)
  If Not IsError(ret) Then
   TextBox1.Value = ret
  End If
  End With
End Sub
'-------------------------------------------
ActiveSheet よりも、Worksheets(____) と入れたほうがよいです。

こんばんは。

今は、Form というのは、UserForm のことだと思います。Excelには、フォームツールもありますが、レガシーツールですから、割愛します。

>セルA1とコンボボックスをリンクさせ、セルB1にVLOOKUP(A1,一覧,2)で一覧から名前を抽出しました。
UserForm で、なぜ、ComboBox で、A1 にリンクさせるのでしょうか?
リンクというのは、ControlSource のことだと思います。それでは、出来ませんね。
Change イベントに組み込まないといけません。そのような方法をしなくても可能です。

'--------...続きを読む


人気Q&Aランキング