AccessのMDBファイルをExcelのListboxに読み込みたいのですが、方法がわかりません。
要はExcelのVB上の変数に、MDBファイルのデータが読み込めれば良いのですが・・・
どなたか分かる方いらっしゃいませんか?

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

A 回答 (1件)

アクセスのデータを取りこむには、もちろん接続が必要となります。


環境と接続法式が記載されていませんので、DAO接続でのサンプルを作りました。
個人的にはADO接続がいいと思っておりますが、接続文字が環境により不定なため、使用しませんでした。
DAOを使用するためには、VBAの編集画面にて[ツール][参照設定]にて
Microsoft Office x.x Object Library (x.x 部分はできるだけ数字が大きいものを使用してください。)
を指定する必要があります。

質問の内容からすると、Accessデータを読み込めたらOKだと思って、リストボックスへの代入部分は作成しておりません。
プログラム中の「PRINT DATA」となってるコメント部分を、適当に変更してください。


開発環境:EXCEL97

Option Explicit

Sub Main()
  '定数
  Const DB_FILE  As String = "c:\test.mdb"
  Const TBL_NAME As String = "テーブル1"
  
  'DB操作変数
  Dim acDB    As Database
  Dim acRs    As Recordset
  Dim strSQL   As String
  
  'ワーク変数
  Dim intFldCnt  As Integer
  Dim i      As Integer
  
  
  'DB/RECORD OPEN
  Set acDB = OpenDatabase(DB_FILE)
  strSQL = "select * from " & TBL_NAME
  Set acRs = acDB.OpenRecordset(strSQL)
  
  
  'PRINT DATA
  intFldCnt = acRs.Fields.Count
  Do Until acRs.EOF
    For i = 0 To intFldCnt - 1
      Debug.Print acRs(i).Value,
    Next i
    Debug.Print
    acRs.MoveNext
  Loop
  
PGMEND:
  'ALL CLOSE/FREE
  acRs.Clone
  acDB.Close
  Set acRs = Nothing
  Set acDB = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
実は昨日解決できました。申し訳ありません。

お礼日時:2002/01/07 19:12

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

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

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

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

QExcel 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から直接リストボックスの要素を入れる方法も
あったら知りたいと思います。


皆さんのお知恵を是非貸してください!!
よろしくお願いいたします。

以下のようなExcelシートがあります。
1行目はラベル行です。

[製品管理表]

1| 管理番号| 製品名 | 在庫数 |
2| A001 | 製品A | 2000 |
3| A002 | B製品 | 1700 |
4| A002 | B製品 | 1700 |

......以下1000行くらい続く

この中から製品名で検索をかけて、検索結果をユーザーフォームの
リストボックスに一覧表示させたいのですが、

現在の方法は、
検索条件を元にSQL文を生成、
ADOでシートをRecordSetに格納し、
RecordSetを2次元配列に格納、
2次元配列をリ...続きを読む

Aベストアンサー

(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

(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....続きを読む

Qリストボックスでの選択項目分削除について。

こんばんは。
リストボックスでのマルチセレクトで選択した項目を削除する
方法で悩んでいます。
(リストボックスで3項目選択したとして、この3項目を削除する方法)

解答は現在勉強している本に掲載されているのですが意味が分からず。

解答のコードの方にはリストを後ろから削除しているみたいなのですが、
前から削除しても大丈夫だと思いやってみましたが、エラーが出てしまいます。

解説には、先頭から削除するとその時点でリストのインデックス値がずれて
しまう。と書いてあるのですが、後ろから削除しても一緒だと考えこんでいます。

解答コード
**********************************************************
Private Sub Command2_Click()
Dim i As Integer

'選択状態(Selected=true)の項目だけ削除
For i = List1.ListCount - 1 To 0 Step -1
If List1.Selected(i) = True Then
List1.RemoveItem i
End If
Next i

End Sub
*********************************************************

と言う解答コードを自分は、前から削除するように

自分なりのコード
*********************************************************
Private Sub Command2_Click()
Dim i As Integer

For i = 0 To listcount-1
If List1.Selected(i) = True Then
List1.RemoveItem i
End If
Next i

End Sub

*************************************************************
で作成してみましたが、やっぱりエラーが。

なぜ、前から削除するとエラーになってしまうのか、
もう少し具体的に教えてくれると助かります。

よろしくお願いします。m(__)m

こんばんは。
リストボックスでのマルチセレクトで選択した項目を削除する
方法で悩んでいます。
(リストボックスで3項目選択したとして、この3項目を削除する方法)

解答は現在勉強している本に掲載されているのですが意味が分からず。

解答のコードの方にはリストを後ろから削除しているみたいなのですが、
前から削除しても大丈夫だと思いやってみましたが、エラーが出てしまいます。

解説には、先頭から削除するとその時点でリストのインデックス値がずれて
しまう。と書いてあるのですが、...続きを読む

Aベストアンサー

こんにちわ。

コードの処理に沿って順番に説明しますね。
リストの内容はA~Eの5個あり、BとDを選択した状態だとします。

*リストの内容**
1|A
2|B ←選択
3|C
4|D ←選択
5|E
**************

これを解答コードのように後ろから削除する場合、5から1まで繰り返し判定するわけですが、
1回目(5):Eは選択されていませんので何もしません。
2回目(4):Dが選択されているので削除します。

*リストの内容**
1|A
2|B ←選択
3|C
4|E
**************

3回目(3):Cは選択されていませんので何もしません。
4回目(2):Bが選択されているので削除します。

*リストの内容**
1|A
2|C
3|E
**************

5回目(1):Aは選択されていませんので何もしません。
結果、以下のようなリストになり正常に動作します。

*リストの内容**
1|A
2|C
3|E
**************

同じ様にmineral01さんのコードのように前から削除する場合、
1回目(1):Aは選択されていませんので何もしません。
2回目(2):Bが選択されているので削除します。

*リストの内容**
1|A
2|C
3|D ←選択
4|E
**************

3回目(3):Dが選択されているので削除します。
(この時点でインデックスがずれているためCの判定が飛ばされてしまいます。)

*リストの内容**
1|A
2|C
3|E
**************

4回目(4):4番目の要素が無いためエラーになります。
この段階ではもうリストの内容が3つしかないために、4番目の内容を取得しようとするとインデックスエラーとなってしまいます。

どうしても前から削除したい場合は、以下のコードで大丈夫だと思います。
mineral01さんのコードに追記してみました。
*********************************************************
Private Sub Command2_Click()
Dim i As Integer

For i = 0 To List1.listcount - 1
If List1.Selected(i) = True Then
List1.RemoveItem i
i = i - 1
End If
If i >= List1.ListCount - 1 Then
Exit For
End If
Next i

End Sub

*************************************************************

長文なってしまい、申し訳無いです。参考になれれば幸いです。

こんにちわ。

コードの処理に沿って順番に説明しますね。
リストの内容はA~Eの5個あり、BとDを選択した状態だとします。

*リストの内容**
1|A
2|B ←選択
3|C
4|D ←選択
5|E
**************

これを解答コードのように後ろから削除する場合、5から1まで繰り返し判定するわけですが、
1回目(5):Eは選択されていませんので何もしません。
2回目(4):Dが選択されているので削除します。

*リストの内容**
1|A
2|B ←選択
3|C
4|E
**************...続きを読む

Q【VB】コンボボックスにデータベースから取り出した値を入れたい

VB2005です。

表題の通りですがやり方がよくわかりません。
データベースに接続し、
SQLで重複しない値を取り出すところまではできています。

SQL=SELECT DISTINCT FieldName FROM TableName

VB6の時はこんなソースでした
Do Until rs.EOF
   Combo1.AddItem.Fields("FieldName")
   rs.MoveNext
Loop

VB2005ではどう書くのでしょう?
よろしくご教授ください。

Aベストアンサー

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", dbFilePath)
  Dim sql As String = "SELECT DISTINCT FieldName FROM TableName"
  Dim conn As New OleDbConnection(connectionString)
  Dim query As New OleDbCommand(sql, conn)

  Try
    conn.Open()
    Dim reader As OleDbDataReader = query.ExecuteReader()
    While (reader.Read())
      Me.ComboBox1.Items.Add(reader.Item("FieldName"))
    End While
    reader.Close()
  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    conn.Close()
  End Try

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Sourc...続きを読む

Q〔VBA・マクロ〕EXCELからACCESSデータをひっぱるには?

当方のレベルはアクセス初級者(基本的な操作)、
エクセルはごく簡単なVBAをいじる中級者です。

アクセスにて顧客マスター、商品マスターを作成しています。
エクセルで納品書を作成しています。

現状では外部データの取り込みをつかって
エクセルシートに顧客データ(シート1)と商品データ(シート2)を
取り込んだ後に、納品書(シート3)でシート1、2に
VLOOKUP関数をかけて、納入先と商品情報を
伝票におとしこんでいます。

こんなまどろっこしいことをせずに、
エクセルからアクセスのテーブルへ直接データを取り込む方法は
ないものでしょうか?

どなたかよろしくお願いいたします。

Aベストアンサー

>当方のレベルはアクセス初級者(基本的な操作)、
>エクセルはごく簡単なVBAをいじる中級者です。

Accessのレポートと言う方向になっていますが、
この条件でしたら、エクセルで帳票もありだと思います。

その理由は、
・mdbからデータを引っ張るのはVBA+ADOを使えばそれほど難しくない。
 Ecxel VBA経験者なら大丈夫でしょう。

・Excelの方が表現力が豊かなので、最終的な帳票の見栄えは良い。
 もちろん、作りこめばの話ですが・・・。

・ADOに慣れることは、今後VB等の他の開発言語を使う際に役立つ。
 そういう機会が有ればの話ですが・・・。

Excel帳票のメリットは他にも
・帳票をExcel形式で保存できるので、後から簡単に加工できる。
・メールで送ったりも出来る。
 (Accessは持っていないが、Excelは持っている、という人は多い)


もちろん、Accessの勉強のためレポートを使うのもありだと思いますし、
その方が簡単かもしれません。

参考のため、Excelでの方法を書いてみます。
どちらを選択するかは、お好みで。

****Excel VBA+ADO で mdbファイルからデータを取り込む例****

まずAccessの方で、帳票用のクエリを作ります。
データの入っているテーブルと、マスターテーブル等を結合して、並び順なども指定しておきます。この辺りはデータベースの方が便利ですので、ExcelのVLOOKUP関数は使わない方向で・・・。

データベースを扱う上でSQL文(クエリ)の学習は必須です。SQL文は標準化されていますので、Access以外のデータベースでも応用が利きます。覚えておいて損はないと思います。

 SQL  SELECT  INNER JOIN

上記のキーワードを検索すれば必要な情報は見付かると思います。この辺りが、データベースを扱う際の、最初の難関でしょう。

もっと具体的な情報が必要でしたら、テーブルの構造(テーブル名、フィールド名、主キー)を補足してください。


次に、Excelの準備ですが、VBAの画面で[ツール]→[参照設定]を開き

 Microsoft ActiveX Data Objects 2.7 Libray

を選択しておきます。(バージョンは多少異なるかも。最新の物を選択)

----サンプルソース----
 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 
 Dim dbName As String
 Dim dbPath As String
 
 dbName = "db1.mdb" 'MDBファイル名
 dbPath = ActiveWorkbook.Path & "\" 'MDBのPath 今回は ExcelのBook と同じフォルダを指定

 ' MDB との接続を確立する。決まり文句です。
 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & dbPath & dbName & ";"

 'レコードセットを開く。今回は"Q1"というクエリを参照のため開きます。
 'この部分で、SQL文を指定することも可能です。
 rst.Open "Q1", cnn, adOpenForwardOnly, adLockReadOnly
 
 'レコードが無くなるまで繰り返します。
 Do Until rst.EOF
  
  'Recordset![フィールド名]で各フィールドのデータを参照できます。
  Debug.Print rst![ID], rst![DATA]
  
  rst.MoveNext '次のレコードに移動します。
 Loop
 
 rst.Close
 cnn.Close
 Set cnn = Nothing
 Set rst = Nothing
----------------------

これだけのコードでデータベースのデータを参照できます。
後は、ExcelのVBAの知識があれば帳票を作ることは可能でしょう。
(この部分が多少面倒かも・・・(^^;、Accessのレポートにするか悩むところです)

ADOに関しては、Webで検索すれば解説しているサイトは見付かると思いますので、詳しくはそちらで。

>当方のレベルはアクセス初級者(基本的な操作)、
>エクセルはごく簡単なVBAをいじる中級者です。

Accessのレポートと言う方向になっていますが、
この条件でしたら、エクセルで帳票もありだと思います。

その理由は、
・mdbからデータを引っ張るのはVBA+ADOを使えばそれほど難しくない。
 Ecxel VBA経験者なら大丈夫でしょう。

・Excelの方が表現力が豊かなので、最終的な帳票の見栄えは良い。
 もちろん、作りこめばの話ですが・・・。

・ADOに慣れることは、今後VB等の他の開発言語を...続きを読む


人気Q&Aランキング