AccessからExcelファイルを取り込む時、ネットで検索してみると
Docmd.TransferSpreadsheet acImport,,"取り込み先テーブル名","ファイルフルパス",True
がめちゃくちゃ多くヒットしますw
特になんも支障がなければ、この1行でAccessにセット出来るので重宝するんですが…w
いやいやいや!!支障が出てるから使えんのよ∑(゚Д゚)
っていうことが、出てくるのがAccessだwww
csvファイルを取り込もう〜♪ふふーん♪でいざやってみると…
文字化け…orz
なんでぇ?!
となり、Excelで開いてセルにカーソルを当てると文字化けしてない。
(ただし、そのままで見ると文字化けしてっけどねw)
しかしメモ帳で開くと文字化けしちゃってる、困ったファイルというのも存在するのだw
こういうファイルを対処しよう!!となると、めっちゃヒットするDocmdは利用出来ないってことになるw
そしたらどうするのか?
PGを組むしか手はないのであ〜るσ(^_^;)
と、いうことで今回はvbaを使ってExcelファイル(実際はcsvファイル)をAccessに取り込む方法をやってみた!
まずはExcelの変数を宣言します。
Dim ojExcel As Object Set ojExcel = CreateObject("Excel.Application")
使用するPCにExcelがインストールされてないと上記のPGはエラーが表示されます。エラー対処はやっておいて損はないです^ ^
次に該当するExcelファイルを開きます。
With ojExcel .Workbook.Open FileName:="Excelファイルフルパス" .Visible = false End with
これでAccessからExcelファイルを開いた状態になります^ ^
開いたExcelファイルを非表示に設定してますが、falseをtrueに変えてあげると画面に開いたExcelファイルが表示されます。
次に開いたExcelファイルにあるデータを取得します。
まー、ここが1番のキモですね!
一つ前のwithの中に突っ込んでいきます↓
Dim vrDATA As Variant With ojExcel .Workbook.Open FileName:="Excelファイルフルパス" .Visible = false vrDATA = .Worksheets(1).Range(.Worksheets.Cells(1,1),.Worksheets.Cells(最終行,項目最終数)) End With
これでAccessの変数にExcelファイルとして開いたcsvファイルのデータをセットすることが出来ました^ ^
.Cells(行数,項目数)
の部分ですが、
B1を指定する場合は
.Cells(1,2)
となります!
Excelファイル側の最終行を取得するPGもあります。
Dim intRow As Long intRow = ojExcel.Worksheets(1).UsedRange.Rows.Count
取得し終えたExcelファイルは必ず閉じましょう!
これやっておかないと、Accessを閉じない限り開いたExcelファイルが開きませんw
捕まえちゃってる状態になっちゃうんですよね(´・ω・`)
ojExcel.Quit set ojExcel = Nothing
次に変数にセットした値を各データとして出す!
変数に入れたデータは配列になっているので、以下の方法をとります。
Dim icol As Integer Dim iRow As Long for '行ごと For iRow = 1 To UBound(vrDATA,1) '項目ごと For icol = 1 To UBound(vrDATA,2) MsgBox vrDATA(iRow,icol) Next icol Next iRow
ネットに書かれていましたが、Access→Excelにキックする時ってどうしても処理速度が落ちるようです。
なるべくAccess→Excelにキックしない方法として、この変数にぶっ込むやり方…とのこと。
データ件数がめちゃくちゃ多い場合は、変数にExcelのデータをセットしてあげている部分を分割する方法を取ると良いです^ ^
Variant型も文字数制限があるので/(^o^)\
…1回に付き、何行まで取得!をループになるかな?
今回参照したサイトは以下です!
感謝感謝です^ ^
Excel VBAで指定した範囲の値を配列に格納するサンプル - きなこSHOW
ではでは!