Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12587 / 13644 ツリー ←次へ | 前へ→

【9691】データベースに新規のテーブルを作るには どらちゃん 03/12/12(金) 18:49 質問
【9695】Re:データベースに新規のテーブルを作るには ichinose 03/12/13(土) 1:15 回答
【9706】Re:エラーになるところは・・・ どらちゃん 03/12/15(月) 9:47 質問
【9710】Re:エラーになるところは・・・ こうちゃん 03/12/15(月) 11:58 回答
【9715】Re:エラーになるところは・・・ Kein 03/12/15(月) 13:49 回答
【9731】Re:エラーになるところは・・・ Kein 03/12/16(火) 0:43 発言
【9721】Re:エラーになるところは・・・ ichinose 03/12/15(月) 16:20 発言
【9772】Re:なんとか出来ました。 どらちゃん 03/12/16(火) 16:13 お礼

【9691】データベースに新規のテーブルを作るには
質問  どらちゃん  - 03/12/12(金) 18:49 -

引用なし
パスワード
   お世話になります。

「EXCELシートにあるデータをACCESSの新しいテーブルに保存する」
ということがしたいのですが上手く行きません。
本やこちらの過去のものをつなぎあわせてやってみたのですが、(名前をつけた)新しいテーブルを作ってというところでエラーになってしまいます。
どうかよろしくお願いします。

*****
Dim ObjAccessApplication As Object
Dim tdf As Object
Set CBk = ThisWorkbook
Set CSht = CBk.Sheets("aaa")

Set ObjAccessApplication = CreateObject("access.application")
ObjAccessApplication.OPENCURRENTDATABASE "H:\ABC\GO.MDB"
On Error Resume Next
ObjAccessApplication.docmd.DELETEOBJECT acTable, "JJ_" & CStr(CSht.Cells (3, 3))
On Error GoTo 0
ObjAccessApplication.docmd.CreateObject acTable, "JJ_" & CStr(CSht.Cells(3, 3))
ObjAccessApplication.docmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "JE_" & CStr(CSht.Cells(3, 3)), "G:\ACC\ツール\DOWNLOAD\JJ_GOO.XLS", True, "data!CSht.Cells(5, 27).CurrentRegion"

*****

【9695】Re:データベースに新規のテーブルを作るに...
回答  ichinose  - 03/12/13(土) 1:15 -

引用なし
パスワード
   ▼どらちゃん さん:
こんばんは。

>「EXCELシートにあるデータをACCESSの新しいテーブルに保存する」
>ということがしたいのですが上手く行きません。
>本やこちらの過去のものをつなぎあわせてやってみたのですが、(名前をつけた)新しいテーブルを作ってというところでエラーになってしまいます。
>どうかよろしくお願いします。
>
>*****
>Dim ObjAccessApplication As Object
>Dim tdf As Object
>Set CBk = ThisWorkbook
>Set CSht = CBk.Sheets("aaa")
>
>Set ObjAccessApplication = CreateObject("access.application")
>ObjAccessApplication.OPENCURRENTDATABASE "H:\ABC\GO.MDB"
>On Error Resume Next
>ObjAccessApplication.docmd.DELETEOBJECT acTable, "JJ_" & CStr(CSht.Cells (3, 3))
>On Error GoTo 0
>ObjAccessApplication.docmd.CreateObject acTable, "JJ_" & CStr(CSht.Cells(3, 3))
>ObjAccessApplication.docmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "JE_" & CStr(CSht.Cells(3, 3)), "G:\ACC\ツール\DOWNLOAD\JJ_GOO.XLS", True, "data!CSht.Cells(5, 27).CurrentRegion"

原因は、

>"data!CSht.Cells(5, 27).CurrentRegion"
だと思います。
"data"って、いきなり出てきてますよね?

CSht.name & "!" & CSht.Cells(5, 27).CurrentRegion.address

ではないでしょうか?
確認はしていませんが・・・。

【9706】Re:エラーになるところは・・・
質問  どらちゃん  - 03/12/15(月) 9:47 -

引用なし
パスワード
   ご回答ありがとうございます。
が、エラーになるところはその手前の新規のテーブルを作るところなんです。

ObjAccessApplication.docmd.CreateObject acTable, "JJ_" & CStr(CSht.Cells(3, 3))

ちなみに「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というメッセージが出ます。
どう書いていいのかわからなかったので、テーブル削除の真似をしてみたのですが、これが違うような気がします。

すみません、再度見ていただいてよいでしょうか?

【9710】Re:エラーになるところは・・・
回答  こうちゃん E-MAIL  - 03/12/15(月) 11:58 -

引用なし
パスワード
   どらちゃんさん、ichinoseさん、こんにちは

>ObjAccessApplication.docmd.CreateObject acTable, "JJ_" & CStr(CSht.Cells(3, 3))
>ちなみに「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
>というメッセージが出ます。

DocmdオブジェクトにはCreateObjectというメソッドはありません。
AccessのテーブルをVBAから作成する場合、
普通は DAOのCreateTableDefメソッドまたはADOXのTables.Append を使用します。

なお、DAOやADOを使用する場合は、
>Set ObjAccessApplication = CreateObject("access.application")
のようにCreateObjectは必要ありません。
DAO、ADOXに参照設定すればOKです。
詳細はDAO、ADOXのHELPを確認してみてください。

一度アクセスでVBA作成してみるといいですよ。

【9715】Re:エラーになるところは・・・
回答  Kein  - 03/12/15(月) 13:49 -

引用なし
パスワード
   参考までに、私が使った DAO のテーブル作成マクロをUPしておきます。
株価データを格納するテーブルを作りました。

Sub MyDBテーブル作成()
  Dim wspDefault As Workspace
  Dim myCurDb As Database
  Dim myTblDef As TableDef
  Dim myNewIdx As Index
  Dim fld As Field
  Dim C As Range
  Dim i As Integer
  Dim TName As String
  Const myMdbFile = "C:\My Documents\NewYork_data.mdb"
  
  Set wspDefault = DBEngine.Workspaces(0)
  Set myCurDb = wspDefault.OpenDatabase(myMdbFile)
  MyAr = Array("始値", "高値", "安値", "終値", "出来高")
  For Each C In Sheets("Sheet1").Range("A1:A33")
    TName = C.Value & "_" & C.Offset(, 1).Value
    Set myTblDef = myCurDb.CreateTableDef(TName)
    With myTblDef
       Set fld = .CreateField("日付", dbDate, 8)
       .Fields.Append fld
       fld.OrdinalPosition = 0
       Set myNewIdx = .CreateIndex("MyIdx")
       With myNewIdx
        .Fields.Append .CreateField("日付")
        .Primary = True
       End With
       .Indexes.Append myNewIdx
       For i = LBound(MyAr) To UBound(MyAr)
        Set fld = .CreateField(MyAr(i), dbLong)
        .Fields.Append fld
        fld.OrdinalPosition = i + 1
        Set fld = Nothing
        .Fields.Refresh
       Next i
    End With
    myCurDb.TableDefs.Append myTblDef
    Set myTblDef = Nothing
  Next
  myCurDb.Close: wspDefault.Close
  Set myCurDb = Nothing: Set wspDefault = Nothing
End Sub

【9721】Re:エラーになるところは・・・
発言  ichinose  - 03/12/15(月) 16:20 -

引用なし
パスワード
   どらちゃん さん、こうちゃん、Keinさん、こんにちは。
>ご回答ありがとうございます。
>が、エラーになるところはその手前の新規のテーブルを作るところなんです。
>↓
>ObjAccessApplication.docmd.CreateObject acTable, "JJ_" & CStr(CSht.Cells(3, 3))
すみません、全然気が付きませんでした。
こうちゃんのお言葉とKeinさんのコードで解決されると思いますが、
参照設定「Microsoft Access 9.0 Object Library」のみでも可能ですので
一応、記述しておきます。
'=========================================================================
Sub test_test()
  Dim ObjAccessApplication As Access.Application
  Set CBk = ThisWorkbook

  Set ObjAccessApplication = CreateObject("access.application")

  With ObjAccessApplication
    .OPENCURRENTDATABASE ("H:\ABC\GO.MDB")
    On Error Resume Next

    sql_str = "drop table " & Cells(1, 1) 'cells(1,1)にテーブル名の例
    .DoCmd.RunSQL sql_str
    On Error GoTo 0
    sql_str = "CREATE TABLE " & Cells(1, 1) & _
    " (項目1 integer CONSTRAINT tbl1 PRIMARY KEY,項目2 char,項目3 char);"
'   フィールドの構成は、項目1 整数 項目2、項目3が文字列      

    .DoCmd.RunSQL sql_str
    .Quit
    End With
End Sub

【9731】Re:エラーになるところは・・・
発言  Kein  - 03/12/16(火) 0:43 -

引用なし
パスワード
   あー・・一つ言い忘れてました。DAO のコードを使う場合は

Microsoft DAO 3.x Object Library

への参照設定が必要です。

【9772】Re:なんとか出来ました。
お礼  どらちゃん  - 03/12/16(火) 16:13 -

引用なし
パスワード
   こうちゃんさん、keinさん、Ichinoseさん、

DAOやADOの違いなど、説明は本とかに載っていて読むんですけど実際になんなのか全然わかっていなくて、こんな素人にありがとうございました。
結局、Ichinoseさんに教えていただいた(自分の書いたものを生かした)書き方で、IMPORTと最適化をプラスして完成しました。

とは言いつつ、実はIMPORTではなく、しかもDAOを使ったほうが本当はいいような気がするので勉強していきたいと思います。
ありがとうございました。

12587 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free