前回、silkファイルをエクセルにインポートする、を試行錯誤しました。
今回はaccessにsilkファイルをインポートする、を試行錯誤してみます。
- 1.手動
- 2.TransferTextでむりやりインポートしてみる
- 3.Silkファイルをエクセルみたいに扱い、配列にデータを入れてテーブルに入れる
- 4.silkファイルをテキスト形式またはエクセル形式で保存しなおしインポートする
- 5.silkファイルのデータをコピーしエクセルファイルに張り付けて保存。保存したエクセルをインポートする。
ちなみに成功したのは3番と5番です。
1.手動
まずは手動でやってみる。
外部データ→新しいデータソース→ファイルから→テキストファイルからインポート
「参照」をクリックしたところ、テキストファイルやcsvファイルは選べるが、silkファイルは表示されず選べない。Excelからインポートを選択しても同様。
ひとまずあきらめる。。。

2.TransferTextでむりやりインポートしてみる
Dim vPath As String
vPath = CurrentProject.Path & “\test.slk”
DoCmd.TransferText acImportDelim, , “テーブル1”, vPath, False
DoCmd.TransferSpreadsheet acImport, , “テーブル1”, vPath, False, “Sheet1!A1:B3”
3行目:テキストとしてインポートしてみる→ダメ
4行目:エクセルとしてインポートしてみる→だめ

3.Silkファイルをエクセルみたいに扱い、配列にデータを入れてテーブルに入れる
まず、エクセルをオブジェクト型変数に入れてVBAで操作できるようにする
①silkフィルを開く
②データを配列に入れる
③データを入れたいテーブルを開く
④配列のデータをテーブルに入れていく
以下、コードです。accessVBAもOLEも未熟者で書き方が稚拙です。すみません。
Sub test3()
 Dim vPath As String
 vPath = CurrentProject.Path & “\test.slk”
 ’エクセルをオブジェクト型変数に入れてVBAで操作できるようにする
 Dim myExcel As Object
 Set myExcel = CreateObject(“Excel.Application”)
 Dim arr As Variant
 With myExcel
  .Visible = False
   ‘①silkファイルを開く  
.Workbooks.Open vPath
  ‘②配列にデータを入れる
  arr = .Range(“A1”).CurrentRegion.Value 
  .Workbooks.Close
  .Quit
 End With
Set myExcel = Nothing
 ’DAO
 Dim db As DAO.Database
 Dim rs As DAO.Recordset
 ‘③データを入れたいテーブルをrsにセット 
 Set db = CurrentDb()
 Set rs = db.OpenRecordset(“テーブル1”) 
 Dim i As Long
  ‘④配列の内容ををテーブルに追加
 For i = LBound(arr) To UBound(arr)
  rs.AddNew
  rs!ID = arr(i, 1)
  rs!取引先名 = arr(i, 2)
  rs.Update
 Next i
 rs.Close
 db.Close
End Sub

ちなみにこのsilkファイルの中身はA列が文字列の数値、B列の1行目はカンマを含んだデータなので、csv形式にするとおかしくなってしまうデータです。
4.silkファイルをテキスト形式またはエクセル形式で保存しなおしインポートする
ファイルシステムオブジェクトを利用して、やってみたんですけどね。
テキスト形式で保存してみたところ、ヘッダーにsilkファイル特有のごちゃごちゃが入ってしまってだめでした。
だめだこりゃー↓

エクセル形式でもだめでした。「ファイル形式または拡張子が正しくありません」とエラーメッセージが出てしまい、ファイルを開くことができませんでした。
以下、参考までにコード
Sub test3()
 Dim fso As Object
 Set fso = CreateObject(“Scripting.FileSystemObject”)
 Dim vPath As String
 vPath = CurrentProject.Path & “\test.slk”
fso.CopyFile vPath, Replace(vPath, “.slk”, “.txt”)
’または
’fso.CopyFile vPath, Replace(vPath, “.slk”, “.xlsx”)
 Set fso = Nothing
End Sub
5.silkファイルのデータをコピーしエクセルファイルに張り付けて保存。保存したエクセルをインポートする。
まず、エクセルをオブジェクト型変数に入れてVBAで操作できるようにする
①新規エクセルブック作成
②silkファイル開く
③silkファイルのデータをコピー、新規エクセルブックに貼り付け
④新規エクセルブックを名前を付けて保存
⑤エクセルブック、silkファイル閉じる
⑥保存したエクセルファイルをインポート
ちなみに、1行目を項目行にしないと「F1フィールドがありません」とエラーが出てインポートできなかったので(いつもの悩み)silkファイルに項目行を入れています。

以下、コードです。
Sub test5()
 Dim vPath As String
 vPath = CurrentProject.Path
 ’エクセルをオブジェクト型変数に入れてVBAで操作できるようにする
 Dim myExcel As Object
 Set myExcel = CreateObject(“Excel.Application”)
Dim wb1 As Object, wb2 As Object
 With myExcel
  .Visible = False
  ’①新規エクセルブック作成
  Set wb1 = .Workbooks.Add
  ’②silkファイル開く
  Set wb2 = .Workbooks.Open(vPath & “\test.slk”)
  ’③silkファイルの内容をコピー、新規ファイルに貼り付け
  wb2.Worksheets(1).Range(“A1”).CurrentRegion.Copy   wb1.Worksheets(1).Range(“A1”)
  ’④新規ファイルをエクセル形式で保存
  wb1.SaveAs FileName:=vPath & “\test2.xlsx”
  ’⑤エクセルファイル、silkファイル閉じる
  wb1.Close
  wb2.Close
 End With
 myExcel.Quit
 Set myExcel = Nothing
 ’⑥保存したエクセルをインポート
 DoCmd.TransferSpreadsheet acImport, , “テーブル1”, vPath & “\test2.xlsx”, True,  ”Sheet1!”
End Sub
ああ、いずれにしてもめんどくさい。
私がいちばんしっくりきたのは配列に入れる3番の方法でした。
もしかしたらとてつもなく余計なことをやっているだけかもしれません。もっと良い方法があるのかもしれません(教えていただけるとありがたいです)
なお、しつこいようですが、accessVBAもOLEも未熟者で書き方が稚拙ですので、あんまり参考にしない方がよいかもです。

 
  
  
  
  

コメント