Excel を開いて Excel に集計していく VBA

以前、NuGet 無し PowerShell での Excel 操作にチャレンジしてダメだったので、普通に VBA 使って転記するコードです。よくあるコードですね~。

目次

読み取られる側

f:id:sutefu7:20190906144741p:plain

読み取る側(VBA 使うので xlsm)

f:id:sutefu7:20190906144753p:plain

ソースコード

Private Sub CommandButton1_Click()
    
    Dim wkBok As Workbook
    Dim wkSht As Worksheet
    Dim i As Long
    Dim index As Long
    Dim lastRow As Long
    
    ' チェック用のExcel(このExcelファイル)
    Set wkBok = ThisWorkbook
    Set wkSht = wkBok.Sheets("Sheet1")
    index = 6
    
    ' 前回の結果データをクリア(データ無しの場合、ヘッダーが消えてしまうので+1)
    lastRow = wkSht.Cells(Rows.Count, 1).End(xlUp).Row + 1
    wkSht.Range("A6:C" + CStr(lastRow)).Clear
    
    ' 1月~12月までのExcelを読み込む
    For i = 1 To 12
        
        Dim xlsFile As String
        Dim rdBok As Workbook
        Dim rdSht As Worksheet
        
        xlsFile = ThisWorkbook.path + "\部署1\" + CStr(i) + "月分.xlsx"
        If Dir(xlsFile) = "" Then
            GoTo Continue
        End If
        
        ' 読み取り専用で開く
        Set rdBok = Workbooks.Open(xlsFile, , True)
        Set rdSht = rdBok.Sheets("Sheet1")
        
        ' 「合計」行は含めない
        lastRow = rdSht.Cells(Rows.Count, 1).End(xlUp).Row - 1
        
        For k = 2 To lastRow
            
            ' 空行だったら終わる
            If rdSht.Range("A" + CStr(k)).Value = "" Then
                Exit For
            End If
            
            wkSht.Range("A" + CStr(index)).Value = CStr(i) + "月分.xlsx"
            wkSht.Range("B" + CStr(index)).Value = rdSht.Range("A" + CStr(k)).Value
            wkSht.Range("C" + CStr(index)).Value = rdSht.Range("B" + CStr(k)).Value
            index = index + 1
            
        Next
        
        rdBok.Close
        Set rdSht = Nothing
        Set rdBok = Nothing
          
Continue:
    Next
    
    ' 合計を出す
    lastRow = wkSht.Cells(Rows.Count, 1).End(xlUp).Row + 1
    wkSht.Range("B" + CStr(lastRow)).Value = "合計"
    wkSht.Range("C" + CStr(lastRow)).Formula = "=sum(C6:C" + CStr(lastRow - 1) + ")"
    
    
    Set wkSht = Nothing
    Set wkBok = Nothing
    
    MsgBox "OK"
    
    
End Sub

動作イメージ

f:id:sutefu7:20190906144804p:plain

駄文

PowerShell でいうところの ReleaseComObject() の代わりに Nothing をセットしてメモリ開放しているわけですが、それでもこっちの方が簡単な気がします。ただ自分が慣れているせいかもしれないですが・・・(;^_^A。エラー発生してもプロセス残らないから楽ですね~。