ラベル OLEDB の投稿を表示しています。 すべての投稿を表示
ラベル OLEDB の投稿を表示しています。 すべての投稿を表示

DAO使用時の「メモリ不足です」



DAOを使ってエクセルからアクセスにデータを入れようとした時に


「実行時エラー '3035';
メモリ不足です」


というエラーが出てしまいました。



対象法
アクセス自体は開いていなかったのでエクセル本体を再起動するとエラーメッセージは出ませんでした。

ExcelからAccessデータにADOを使って接続する



ExcelVBAでADO接続を使用してMSAccessのデータを取得する方法です。
ADOはActiveX Data Objectsの略でOLEDB(Object Linking and Embedding, Database)プロバイダを通してデータを取得する APIです。

ADOを使用するには参照設定(VBEの「ツール」)で Microsoft ActiveX Data Objects 6.1 Library にチェックを入れます。

バージョンによる違いはよくわかりません。とりあえず最新のにチェック入れておけばいいと思います。


サンプルコードでは企業コードから業種と市場をエクセルに出力してみます。
サンプルファイル名
・Accessファイル:「ListedCompany.accdb」もしくは「ListedCompany.mdb」
・Access内テーブル:「T_LC」
・出力先エクセルファイル:「sample52.xlsx」(オープン済)

テーブルイメージ

サンプルコード
Sub testAdo()
Dim i As Long
' ※注)参照設定
'出力先エクセルファイル
Dim ws As Worksheet
    
 Set ws = Workbooks("sample52.xlsx").Worksheets(1)

 '接続するAccessファイル名
  Dim dbAcc As Variant
   dbAcc = "D:\test\ListedCompany.accdb"
    
   '旧ファイル形式
   'dbAcc = "D:\test\ListedCompany.mdb"
    
 '接続する
  Dim dbConnect As New ADODB.Connection
    dbConnect.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & dbAcc & ""
 dbConnect.Open
    
'条件に合うレコードを取得する
  Dim dbRecordset As New ADODB.Recordset
  Dim dbTarget As ADODB.Fields
  Dim strSQL As String

 '===================
  For i = 2 To 11
    '企業コードでの条件検索
    strSQL = "SELECT * FROM T_LC WHERE 企業コード = " & ws.Cells(i, 1) & ""
     dbRecordset.Open strSQL, dbConnect, adOpenKeyset, adLockReadOnly
    
     Set dbTarget = dbRecordset.Fields
      ws.Cells(i, 2) = dbTarget("業種")
      ws.Cells(i, 3) = dbTarget("市場")
    
      '取得したレコードを閉じる
      dbRecordset.Close
  Next i

 '接続を閉じる
 dbConnect.Close

End Sub


結果イメージ



※上場企業一覧のAccessファイルはこちらのCSVファイルを頂いて作成しました