Excel を開いて Excel に集計していく VBA
以前、NuGet 無し PowerShell での Excel 操作にチャレンジしてダメだったので、普通に VBA 使って転記するコードです。よくあるコードですね~。
目次
読み取られる側
読み取る側(VBA 使うので xlsm)
ソースコード
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
動作イメージ
駄文
PowerShell でいうところの ReleaseComObject() の代わりに Nothing をセットしてメモリ開放しているわけですが、それでもこっちの方が簡単な気がします。ただ自分が慣れているせいかもしれないですが・・・(;^_^A。エラー発生してもプロセス残らないから楽ですね~。