gorod’s diary

楽天ブログに過去記事あります

ExcelファイルをAccessに取り込む!(csv→Access)

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

ネットに書かれていましたが、AccessExcelにキックする時ってどうしても処理速度が落ちるようです。
なるべくAccessExcelにキックしない方法として、この変数にぶっ込むやり方…とのこと。

データ件数がめちゃくちゃ多い場合は、変数にExcelのデータをセットしてあげている部分を分割する方法を取ると良いです^ ^
Variant型も文字数制限があるので/(^o^)\
…1回に付き、何行まで取得!をループになるかな?

今回参照したサイトは以下です!
感謝感謝です^ ^
Excel VBAで指定した範囲の値を配列に格納するサンプル - きなこSHOW


ではでは!