1. 前置き
ファイルの読み込みは、Excelの基礎です。最近は、実際のExcelに読み込まず、参照するって方法がデフォルト設定されているのですが、様々なデータ加工を課されるため、旧来のレガシを使って読みこむことが多いですね。テーブルを作ってファイルを参照するという方法は、日本のIT環境ではまだ早いかもしれません。
2. コードのコンセプト
コンセプトとしては、別のフォルダにあるCSVまたはExcelファイルをVBAを使って読み込むものです。このケースがほとんどなので、これだけに限定しました(それ以外はは処理しません。)。
コードの考え方は、CSVの読み込みは、①ダイアログからファイルを選択→②CSVを1行ずつ読み込み→③1行をカンマで分割→④エクセルに転記する といった手順です。Excelファイルの読み込みは、オブジェクトでシートを取得して、全部張り付けるといった具合です。それでは、実際のコードを見てみましょう。
Sub データ読み込み()
Application.ScreenUpdating = False '画面遷移を停止
Dim fileName As Variant
Dim i As Long
Dim N As Variant
Dim strLine As String
Dim strSplit() As String
Dim wb As Workbook
Dim ws As Worksheet
Dim ExcelData() As Variant
ChDir "C:\Users\yamadataro\Desktop\マクロ" 'カレントディレクトリの指定)
'ファイル選択
fileName = Application.GetOpenFilename
'CSVファイルの処理
If fileName Like "*.csv" Then
ThisWorkbook.Sheets("sheet1").Cells.ClearContents
N = FreeFile
Open fileName For Input As #N
i = 1
Do While Not EOF(N)
Line Input #N, strLine 'CSVファイルを1行ごと読み込む
strSplit = Split(strLine, ",") '1行をカンマで分割して配列に格納
'セルに値を格納する
For j = 0 To UBound(strSplit) Step 1
Cells(i, j + 1).Value = strSplit(j)
Next
i = i + 1
Loop
Close #N
'エクセルファイルの場合の処理
ElseIf fileName Like "*.xls*" Then
'ワークブックを開く
Set wb = Workbooks.Open(fileName)
'シートを取得
Set ws = wb.Worksheets(1)
'データ入力されている範囲を取得する
ExcelData = ws.UsedRange
'ワークブックを閉じる
wb.Close
Set ws = Nothing
Set wb = Nothing
'データの最大行を取得する
MaxRow = UBound(ExcelData, 1)
'データの最大列を取得する
MaxCol = UBound(ExcelData, 2)
'セルA1を基点に取り込んだデータを出力する
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Resize(MaxRow, MaxCol).Value _
= ExcelData
'ファイルが何も選択されたなかった場合
ElseIf fileName = False Then
MsgBox "キャンセルされました"
'それ以外のファイルは、エラーメッセージを出して処理しない
Else
MsgBox "エラーが発生しました"
End If
Application.ScreenUpdating = True '画面遷移を戻す
End Sub
カレントディレクトリを変更するChDirステートメント
Excelのシートにデータを読み込む際に自動的に開くダイアログボックスは、デフォルトだと、ローカルのドキュメントフォルダ(C:\Users\ユーザー名(任意)\Documents)が開き、一度ファイルのデータを読み込むと、そのファイルがカレントディレクトリに指定され、そのフォルダ開く仕様となっています。よって、特定の場所にあるフォルダを任意で開くようにするには、マクロを実行する際にカレントディレクトリを変更するコードを書く必要があります。必要ない場合は省略しても構いませんが、すぐにファイルを選択できると便利ですよね。そのコードは次の通りです。
ChDir "任意のパス"
GetOpenFilenameメソッド(ダイアログボックスからファイルを指定して開く)
ダイアログボックスから、ファイルを指定して開く際に使用するのは、AplicationオブジェクトのメソッドであるGetOpenFilenameになります。
変数 = Apllication.GetOpenFilename
とすると、ダイアログが開き、ダイアログからファイルを選択すると、変数にファイルのパスが入ります。
Openステートメント(読み込み)
Open ファイルパス For Input As #番号
このコードで、プログラムの中で疑似的なファイル領域を確保し、パスのファイルを格納します。
Do While 以降
ざっくりいうと、行単位で読み込みをして、その行をカンマで分割して出力し、それを最終行まで繰り返す処理を示しています。
問題点
このコードには、問題点があります。それはExcelの表示仕様の問題です。文字列で「001」のようなデータが読み込まれた場合、先頭の「0」が表示されないという問題です。この解消を図る場合はVBA自体でコントロールするとコードが複雑になるので、あらかじめ読み込み先のシートに対して「セルの書式設定」で文字列を選択して保存しておくのがおすすめです。