0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VBAテンプレート 開始位置が異なる複数の表を集計する

Last updated at Posted at 2022-06-27

概要

自分用です。
Excelにパスを記載したファイルを上から順番に開いて、表をコピーしていきます。

・行ごとコピペするだけなのでカラムごとの対応はしていません。
・開始する行を指定して行をコピーしていきます。
・開始する行は完全一致で検索をかけるのでファイルごとに開始位置が異なっていても問題ありません。
・コピー後1列名にコピー元のファイル名を記載します。

シートの作成

シートは2シート作成します。
・「ファイル一覧」シート
・「取得結果」シート

表は「ファイル一覧」シートに2つ作成します。
表1 コピー開始行の指定
A列にタイトルを記載
B1セル:検索文字(完全一致)
B2セル:数値(検索したセルの行+B2セルの数値 からコピーを開始する。空白行になるまでコピーを続ける)

表2 検索対象ファイル一覧
ヘッダは1行目、値は2行目から記載します。
D列:操作の要否(操作不要なら×を記載)
E列:操作したいファイルのパス
F列:結果を記載する(今回はコピーした行数)

図 「ファイル一覧」シート
VBA_特定行取得_2022-06-30 221625.png

※「取得結果」シートにはマクロを実行した分だけ行が継ぎ足されていきます。
最初から集計しなおしたい場合は値を手動で消す必要があります。

VBAコード

Moduleは2つ作成します。

Module1
ファイルを開き処理を実施する関数を呼び出す

Sub Excel表集計()
Application.ScreenUpdating = False
Dim ファイル一覧シート As Variant
Set ファイル一覧シート = ThisWorkbook.Sheets("ファイル一覧")
Dim 操作ブック As Workbook
Dim 結果 As String

On Error GoTo エラー

For filei = 2 To ファイル一覧シート.Range("E10000").End(xlUp).Row

    ファイル一覧シート.Range("F" & filei).Value = "未処理"
    
     If Not ファイル一覧シート.Range("D" & filei).Value = "×" Then
        Workbooks.Open ファイル一覧シート.Range("E" & filei)
        Set 操作ブック = ActiveWorkbook
        '処理の実行
        結果 = ファイル操作(操作ブック)
        操作ブック.Close SaveChanges:=False
        ファイル一覧シート.Range("F" & filei).Value = 結果
      End If
      GoTo skip

エラー:
    ファイル一覧シート.Range("F" & filei).Value = "ファイル開かず"
skip:
Next
End Sub


Module1
ファイルを開き処理を実施する関数を呼び出す

Function ファイル操作(ByRef 操作ブック As Workbook) As String

On Error GoTo エラー

'好きな処理を記載

Dim ファイル一覧シート As Variant
Set ファイル一覧シート = ThisWorkbook.Sheets("ファイル一覧")
Dim 取得結果シート As Variant
Set 取得結果シート = ThisWorkbook.Sheets("取得結果")

Dim 結果 As String
結果 = "結果なし"
Dim コピーした行数 As Integer
    コピーした行数 = 0
Dim 操作シート As Worksheet
Dim 操作対象検索セル As Range, 操作行 As Integer


    For Each 操作シート In 操作ブック.Worksheets
        
        Set 操作対象検索セル = 操作シート.Cells.Find(ファイル一覧シート.Range("B1"), LookAt:=xlWhole)
                        
        If Not 操作対象検索セル Is Nothing Then
            操作行 = 操作対象検索セル.Row + ファイル一覧シート.Range("B2")
            
            Do While Len(操作シート.Cells(操作行, 操作対象検索セル.Column)) > 0
                Dim 貼り付け先行 As Integer
                貼り付け先行 = 取得結果シート.Range("A10000").End(xlUp).Row + 1
                操作シート.Rows(操作行).Copy Destination:=取得結果シート.Rows(貼り付け先行)
                取得結果シート.Range("A" & 貼り付け先行).Insert (xlShiftToRight) 'セルを挿入 右にずれる
                取得結果シート.Range("A" & 貼り付け先行) = 操作ブック.Name
                コピーした行数 = コピーした行数 + 1
                操作行 = 操作行 + 1
            Loop
        End If
        

    Next 操作シート
    
    If コピーした行数 > 0 Then
        結果 = コピーした行数
    End If


ファイル操作 = 結果
Exit Function

エラー:
ファイル操作 = "エラー発生"

End Function



おまけ

集計した表の表記ゆれをチェックできるVBAを作成しました。
一緒に使うと便利だと思います。

VBAテンプレート 表記ブレチェッカー

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?