2022年1月29日土曜日

accessでexcelファイルを取り込むにはインポート(acImport)か、リンク(acLink)か、どっちがよろしいのか?比べて、自動化のコードをvbaで書いてみた。

 accessでexcelファイルを取り込むのにインポートが良いのか、或いはリンクが良いのか?

 元のファイルを明確にする(しておきたい)必要がある場合は、リンク(acLink)を使うのが良い。
 accessを開いた状態では、リンクしているexcelファイルがロックされるので、他のユーザがexcelファイルを更新できない(読み取り専用となる)。
 勿論、accessを閉じれば、いいだけだ(他のユーザはexcelファイルを更新できるようになる)。
 そんな使い勝手は、窮屈で嫌だというのであれば、元ファイルをその度にコピーし、複製をリンクしておくのがよろしいのではないか。
 リンクした場合、データの型変換エラーがあると、そのフィールドが#num errorと表示されるが、実際、その値が使用されるまでわからない(と思う)。
 また、リンクしたテーブルが空(タイトル行のみで、データ行がない)の場合、そのテーブルを参照するクエリは、全て型エラーになる(タイトル行のみで、データがないため、データ型を決められない=型が一致しないというチグハグなエラーで怒られる)ので、テーブルが空、つまり、タイトル行しかない場合は、そのクエリをスキップするとかの対応が必要となる。 vbaで書くと、If dcount("フィールド名","テーブル名") > 0 で判定し、成立した場合にクエリを出すというのがよろしい。
 excelファイルをリンクするvbaを書いてみた。これでリンク操作を自動化できる。

Sub ImportExcel()
Dim file1 as String
  file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx"
  if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1"  ' テーブル1があれば削除する
  DoCmd.TransferSpreadsheet acLink,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名
  If Dcount("フィールド1","テーブル1") > 0 then 'テーブル1が空でなければ(フィールド1のデータが存在する)、クエリ1を実行する
    DoCmd.Query "クエリ1"
  End if
End Sub

 元のファイルを明確にする必要がなければ、インポート(acImport)を使うのが良い。
 インポートを使えば、元のexcelファイルがロックされることはない。  インポートを使うと、型変換エラーがあったら、インポート直後にその旨のエラーメッセージが出るので、対応しやすい。ただし、エラーを見逃さない執念深さが必要である。
 excelファイルのインポート操作を自動化するvbaは、以下の通りだ。
Sub ImportExcel()
Dim file1 as String
  file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx"
  if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1"  ' テーブル1があれば削除する
  DoCmd.TransferSpreadsheet acImport,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名
End Sub

2022年1月18日火曜日

access vba excel基本のコード

 access vba excel操作の基本のコードは、以下の通り。
 とりあえず、excel文書をオープンし、Sheet1を削除、上書き保存するコードを書いてみた。

Dim exApp As Object
Dim Wb As Object
Dim buf As string
    Set exApp = CreateObject("Excel.Application")
   exApp.Visible = False
   exApp.DisplayAlerts = False
   Set Wb = ExApp.Workbooks.Open("¥¥dir1¥dir2¥filename.xlsx")
   or
   buf = "¥¥dir1¥dir2"
   file1 = dir(buf & "filename.xlsx")
   exApp.workbooks(file1).open file1
  With Wb
    .Worksheets("Sheet1").Delete
       other codes
    .Save
    .Close
  End With
  exApp.DisplayAlerts = True
  exApp.Quit
   Set exApp = Nothing

2022年1月12日水曜日

excelの複数シートコピーで、他シートへのリンクがあるシートは、参照元と参照先のシートを指定し、同時にコピーしなけばならない。

excelの複数のシートコピーで、他シートを参照するリンクがあるシートは、参照元と参照先のシートをarray指定し、同時にコピーしなけばならない。そうしないと、元々のファイルへの外部参照のリンクができてしまい、都合が悪具なる。