サクッとコピペ ExcelVBA

サクッとコピペして、使えるVBAコード集

特定のファイルを任意のフォルダから選択して、シートに読み込む(Openステートメント)

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

プライバシーポリシーはこちら