別ファイルのセル取得

VBAを実行しているファイルとは別のExcelファイルのデータをVBAを実行しているファイルのセルにもってくる(コピーする)プログラムを作成しました。データが入力してあるファイルは同じフォーマットの表を含む2ファイルにしました。












プログラムの処理としては、表のRangeオブジェクトを取得し、VBAを実行しているファイルのセルでRangeオブジェクトの内容を書き出すようにしました。もし、2ファイル以降ある場合は、再度同じ処理をし(ループを行い)、書き込む処理のところだけ書き込み位置を空白セルまでずらす処理をいれました。以下がプログラムです。

Option Explicit

Public Const READ_START_ROW = 5         '読み込みセルの最初の行を設定
Public Const READ_START_COLUMN = 2      '読み込みセルの最初の列を設定
Public Const READ_END_COLUMN = 4        '読み込みセルの最後の列を設定
Public Const WRITE_START_ROW = 7        '書き込みセルの最初の行を設定
Public Const WRITE_FIRST_COLUMN = 3     '書き込みセルの1番目の列を設定
Public Const WRITE_SECOND_COLUMN = 4    '書き込みセルの2番目の列を設定

Public Sub getdaiary()

    '変数定義
    Dim fPath As String
    Dim fcnt As Integer
    Dim i As Integer
    Dim excWB As Workbook
    Dim getWB As Workbook
    Dim getR As range
    Dim lineRNum As Integer
    Dim WriteLine As Integer
    
    '実行ファイルをアクティブにする
    ThisWorkbook.Activate
    
    '入力されたファイル分ループ
    For fcnt = 2 To 99
        '空白行になったら抜ける
        If Cells(fcnt, "A").Value = "" Then Exit For
        
        'ファイルパスを取得
        fPath = Cells(fcnt, "A").Value
        If Dir(fPath, vbNormal) = "" Then
            MsgBox "ファイルが存在しません。"
            Exit Sub
        End If
        
        'ファイルが開いていたらエラーとする
        For Each excWB In Workbooks
            If excWB.Path & "\" & excWB.Name = fPath Then
                MsgBox "ファイルを閉じてください。"
                Exit Sub
            End If
        Next
        
        'ファイルオープン
        Workbooks.Open (fPath)
        
        'workbookオブジェクト取得
        Set getWB = ActiveWorkbook
        
        '読み込みセルの行が空白になるまでループ
        For i = 0 To 99
            '空白だったらループを抜ける
            If Cells(READ_START_ROW + i, READ_START_COLUMN).Value = "" Then Exit For
        Next
        
        '読み込む行数を設定
        lineRNum = i
        
        'Rangeオブジェクト取得
        Set getR = range(Cells(READ_START_ROW, READ_START_COLUMN), _
                            Cells((READ_START_ROW - 1) + lineRNum, READ_END_COLUMN))
        '実行ファイルをアクティブにする
        ThisWorkbook.Activate
        
        
        'もし書き込む行が空白の場合(1ファイル目の処理)
        If Cells(WRITE_START_ROW, WRITE_FIRST_COLUMN) = "" Then
            '読み込んだ行数分ループ
            i = 0
            Do While i < lineRNum
                'セルに書き込み
                Cells(WRITE_START_ROW + i, WRITE_FIRST_COLUMN).Value = getR.Cells(i + 1, 1).Value
                Cells(WRITE_START_ROW + i, WRITE_SECOND_COLUMN).Value = getR.Cells(i + 1, 3).Value
                i = i + 1
            Loop
            
        'もし書き込む行が空白ではなかったら(2ファイル以降の処理)
        Else
            '書き込みセルの行が空白になるまでループ
            For i = 0 To 99
                '空白だったらループを抜ける
                If Cells(WRITE_START_ROW + i, WRITE_FIRST_COLUMN).Value = "" Then Exit For
            Next
        
            '書き込む行数を設定
            WriteLine = WRITE_START_ROW + i
            
            '読み込んだ行数分ループ
            i = 0
            Do While i < lineRNum
                'セルに書き込み
                Cells(WriteLine + i, WRITE_FIRST_COLUMN).Value = getR.Cells(i + 1, 1).Value
                Cells(WriteLine + i, WRITE_SECOND_COLUMN).Value = getR.Cells(i + 1, 3).Value
                i = i + 1
            Loop
        End If
        
        '読み込み処理を行ったワークブックをローズ
        getWB.Close
        
    Next
    
    '完了メッセージ
    MsgBox "完了しました。"

End Sub

実行結果です。