Access VBA質問箱 IV

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

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


715 / 2272 ツリー ←次へ | 前へ→

【10417】AccessVBAとExcelVBAの連携について教えてください lily 08/6/13(金) 17:16 質問[未読]
【10418】Re:AccessVBAとExcelVBAの連携について教え... 小僧 08/6/17(火) 11:39 回答[未読]
【10420】Re:AccessVBAとExcelVBAの連携について教え... lily 08/6/18(水) 12:58 質問[未読]
【10431】Re:AccessVBAとExcelVBAの連携について教え... lily 08/6/20(金) 13:25 お礼[未読]
【10433】Re:AccessVBAとExcelVBAの連携について教え... 小僧 08/6/24(火) 10:07 回答[未読]

【10417】AccessVBAとExcelVBAの連携について教え...
質問  lily  - 08/6/13(金) 17:16 -

引用なし
パスワード
   ExcelのVBAでAccessの既存テーブルにデータをインポートし、さらにイベントプロシージャをExcelから直接実行し最終的に作成したクエリをExcelの既存ファイルにエクスポートしたいのですが、Accessのイベントプロシージャ内のエクスポートの構文でエラーが発生します。エラーメッセージは「実行時エラー'3010':テーブル'Q_jyufuk'は既に存在しています。」です。
以下にソースを書きます。
【Excel側】
Sub DataExport()

Dim ObjAccess As Access.Application
Dim filename As String
Dim stFilePass As String  'A.xlsのPath
Dim MySql As String

'Accessを開く
  Set ObjAccess = CreateObject("Access.Application")
  ObjAccess.OpenCurrentDatabase FilePass10, False

  ObjAccess.Visible = True
  
'ExcelDataをAccessテーブルへインポート
  ObjAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_Copy", _
    FilePass6, True, _
    "Import_Area"
    
  ObjAccess.Run "ReCount"
  
  Set ObjAccess = Nothing
End Sub

【Access側】
Option Compare Database
Option Explicit
Public MyFilePass As String         'エクスポート先のフルパス
Sub ReCount()

Dim db As DAO.Database
Dim qe As DAO.QueryDef
Dim MySql As String
Dim df As String
Dim txt_pass As String          'A.xlsのファイルが存在するフォルダ名取得
Dim Mcount As Integer

Set db = CurrentDb()

'シリアルNO重複データ抽出のSQL文
 MySql = "SELECT sechi1,Count(sechi1) AS カウント " _
    & "FROM T_Copy " _
    & "GROUP BY sechi1 HAVING ((Count(sechi1) >= 2))"
'SQL文をもとに選択クエリを作成
 Set qe = db.CreateQueryDef("Q_Count", MySql)
 
'重複データのID抽出のためのSQL文
 MySql = "SELECT Q_Count.sechi1,T_Copy.tranzak " _
    & "FROM Q_Count " _
    & "INNER JOIN T_Copy ON Q_Count.sechi1 = T_Copy.sechi1 " _
    & "ORDER BY Q_Count.sechi1"
'SQL文をもとに選択クエリを作成
 Set qe = db.CreateQueryDef("Q_jyufuk", MySql)
 
  df = ComdlgGetFolderStr("ファイルの読込/保存をするフォルダを指定してください。")
    txt_pass = df
    MyFilePass = txt_pass & "\" & "A.xls"
  
'重複データのエクスポート
 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Q_jyufuk", MyFilePass, True

'T_Copyのデータ削除のSQL文
 MySql = "DELETE * FROM T_Copy"
 db.Execute MySql

'作成したクエリを削除
 DoCmd.DeleteObject acQuery, "Q_Count"
 DoCmd.DeleteObject acQuery, "Q_jyufuk"
 
 db.Close: Set db = Nothing
End Sub

上記のようにソースを書いたのですが「'重複データのエクスポート」の構文でエラーメッセージが出ます。
Access単独だと問題なく動きます。

ネットや教本で調べましたがわかりませんでした。
どなたかわかる方、ご教授ください。
よろしくお願いします。

【10418】Re:AccessVBAとExcelVBAの連携について教...
回答  小僧  - 08/6/17(火) 11:39 -

引用なし
パスワード
   ▼lily さん:
こんにちは。

> ExcelのVBAでAccessの既存テーブルにデータをインポートし、
> さらにイベントプロシージャをExcelから直接実行し
> 最終的に作成したクエリをExcelの既存ファイルにエクスポートしたい

Excelでもからも SQL 文は発行できるので、
あえて Access を使わなくてもいけそうな気がします。

また、オブジェクトの作成・削除を繰り返すような動作は
不安定になりがちなので気をつけましょう。

以下、Excelだけで処理を済ます例です。

Sub DataExport2()
'要参照 Microsoft DAO x.x Object Library
Const InXls = "C:\Data.xls"  '元データのExcel
Const OutXls = "C:\Out.xls"  '出力先のExcel

Dim WS As DAO.Workspace
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim strSQL As String
Dim i As Long

  Set WS = DBEngine.Workspaces(0)
  Set DB = WS.OpenDatabase(InXls, False, False, "EXCEL 8.0;HDR=YES;")

  'データが Sheet1にある場合
  strSQL = "SELECT sechi1, tranzak " _
      & "FROM [Sheet1$] " _
      & "WHERE sechi1 IN (" _
      & "         SELECT sechi1 " _
      & "         FROM [Sheet1$] " _
      & "         GROUP BY sechi1 " _
      & "         HAVING Count(sechi1) > 1)"
     
  
  Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)

'吐き出し先のExcelが既にある場合は削除
  On Error Resume Next
    Kill OutXls
  On Error GoTo 0

  With Workbooks.Add
  
  'ヘッダ行の出力
    For i = 1 To RS.Fields.Count
      .Sheets("Sheet1").Cells(1, i).Value = RS.Fields(i - 1).Name
    Next i
  
  'データの出力
    .Sheets("Sheet1").Range("A2").CopyFromRecordset RS
    .SaveAs OutXls
    .Close
  End With
    
  
  RS.Close: Set RS = Nothing
  DB.Close: Set DB = Nothing
  WS.Close: Set WS = Nothing

  MsgBox "終了!"

End Sub


こんな感じでいかがでしょうか。

【10420】Re:AccessVBAとExcelVBAの連携について教...
質問  lily  - 08/6/18(水) 12:58 -

引用なし
パスワード
   小僧さん、こんにちは。
ご教授ありがとうございます。
ExcelでもSQLが発行できるのは、なんとなく知っていましたが、今ひとつ書き方がわかりません。
それで、あと2つほど教えてください。

1.パスの指定を定数ではなく変数でするようにするには、
どのようにソースを変更したらよいのでしょうか?
ちなみにファイルの呼び出し先と吐き出し先のフォルダの指定をして変数にパスを入れるところはすでに出来ています。

2.sql文のFROM句のところですが、「Sheet1」ではなく「[Sheet1$]」と指定するのはなぜですか?最後の「$」には何か意味があるんですよね。
初歩的な質問で申し訳ありません。

よろしくお願いします。

【10431】Re:AccessVBAとExcelVBAの連携について教...
お礼  lily  - 08/6/20(金) 13:25 -

引用なし
パスワード
   プロシージャ内の定数を変数に変更後の動作確認が出来ました。
小僧さん、本当にありがとうございました。

【10433】Re:AccessVBAとExcelVBAの連携について教...
回答  小僧  - 08/6/24(火) 10:07 -

引用なし
パスワード
   ▼lily さん:
こんにちは。
お返事が遅くなってしまい申し訳ありません。

>> 1.パスの指定を定数ではなく変数でするようにするには、
>> どのようにソースを変更したらよいのでしょうか?

> プロシージャ内の定数を変数に変更後の動作確認が出来ました。

Function DataExport2(InXls As String, OutXls As String) As Boolean

のよう引数を取り成功、失敗の判断を返り値にすると
色々なモジュールから呼び出せる関数になるかと思われます。


>> 2.sql文のFROM句のところですが、「Sheet1」ではなく
>> 「[Sheet1$]」と指定するのはなぜですか?

Excelシートに対して SQL文を発行する際の約束事だと思って下さい。
以下、あまり参考にはなりませんが、MSの技術情報です。

ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法
h tp://support.microsoft.com/kb/278973/ja
(こちらの掲示板では直リンクが禁止されているため
 適宜補完して下さい。)

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