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自体でコントロールするとコードが複雑になるので、あらかじめ読み込み先のシートに対して「セルの書式設定」で文字列を選択して保存しておくのがおすすめです。