サイトアイコン HIBISEI Blog

Excelで複数ファイルの値の転記・別名保存を連続処理する方法

あなたは複数のCSVデータなどをExcelのフォーマットに転記していくのが面倒だと思ったことはありませんか?

単なるコピペではなく、テンプレートの書式を維持したいときがありますよね。

例えば、10人分のメンバーのCSVデータを、Excelのフォーマットに値の貼付けでコピペして、ファイル名を付けて保存するのを10回やるのは面倒です。

Aさんのファイルを開いて、集計ファイルにコピペして、
Bさんのファイルを開いて、集計ファイルにコピペして、
Cさんのファイルを開いて、集計ファイルにコピペして・・・10人分やったら大変。

そんなときはExcel VBAを使えば、コピペも保存も簡単です。

今回は「Excelで複数ファイルの値の転記・別名保存を連続処理する方法」を紹介します。

Excelで複数ファイルの値の転記・別名保存を連続処理する方法

Excelで複数ファイルの値の転記・別名保存を連続処理する方法です。

今回は、集計フォーマットのファイルに、A,B,Cのデータを貼り付けるのを例に紹介します。

集計フォーマットはこうなっています。

A,B,Cのファイルは値だけが入っています。

Aのファイル

Bのファイル

Cのファイル

マクロを作るときは、「開発」タブを使います。
開発タブが出ていない方は、下のリンクで出し方を紹介していますので、まずは準備をお願いします。
→エクセルで開発タブを表示する方法

1.「開発」タブをクリック →「挿入」をクリック →「ボタン」をクリック

2.「新規作成」をクリック

3.コード入力画面が開く

4.コードを入力

コードを入力します。

Aファイルを開いて、フォーマットに値の貼付け、ファイル名を付けて保存する。B、Cも繰り返す、という内容です。

5.ボタンができた

ボタンができた

6.ボタンを押す →処理完了

ボタンを押すと、「すべての処理が完了しました」と出ました。

A,B,Cのファイルを確認します。

Aファイル
セルの色、罫線、書式などが反映されています。

Bファイル
こちらも問題なし。

Cファイル
これも大丈夫です。

これでフォーマットへデータを転記するのがになりましたね!

まとめ

Excelで複数ファイルの値の転記・別名保存を連続処理する方法です。

1.「開発」タブをクリック →「挿入」をクリック →「ボタン」をクリック

2.新規作成をクリック

3.コード入力画面が開く

4.コードを入力

5.ボタンができた

6.ボタンを押す →処理完了

これでCSVデータを、テンプレートの書式を維持したまま、コピペできる & 複数ファイルの作成から元ファイルの整理まで一括自動化できるので、かなり時短になりました!

最後に今回使ったコードです。


    Dim wbTemplate As Workbook
    Dim wbSource As Workbook
    Dim wbCopy As Workbook

    Dim wsTemplate As Worksheet
    Dim wsSource As Worksheet
    Dim wsCopy As Worksheet

    Dim folderPath As String
    Dim searchText As String
    Dim sourcePath As String
    Dim tempXlsm As String
    Dim tempXlsx As String
    Dim finalPath As String
    Dim backupPath As String

    Dim fileName As String
    Dim baseName As String
    Dim ext As String

    Dim i As Long
    Dim j As Long
    Dim k As Long

    Dim data As Variant
    Dim found As Boolean
    Dim successCount As Long

    Dim shp As Shape
    Dim ole As OLEObject

    On Error GoTo ErrorHandler

    Set wbTemplate = ThisWorkbook
    Set wsTemplate = wbTemplate.Worksheets(1)

    If wbTemplate.Path = "" Then
        MsgBox "先に元のExcelファイルを保存してください。", vbExclamation
        Exit Sub
    End If

    folderPath = wbTemplate.Path & "\"

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.EnableEvents = False

    'I2~I4を順番に処理
    For i = 2 To 4

        searchText = Trim(CStr(wsTemplate.Cells(i, "I").Value))

        If searchText = "" Then
            MsgBox "I" & i & "セルが空白です。処理を終了します。", vbExclamation
            GoTo ExitHandler
        End If

        found = False
        sourcePath = ""

        '----------------------------------
        '1. 該当するExcelファイルを検索
        '----------------------------------

        fileName = Dir(folderPath & "*.*")

        Do While fileName <> ""

            ext = LCase(Mid(fileName, InStrRev(fileName, ".") + 1))

            If ext = "xlsx" Or ext = "xlsm" _
                Or ext = "xls" Or ext = "xlsb" Then

                If InStr(1, fileName, searchText, vbTextCompare) > 0 Then

                    If StrComp(fileName, wbTemplate.Name, vbTextCompare) <> 0 _
                        And InStr(1, fileName, "-1.", vbTextCompare) = 0 _
                        And InStr(1, fileName, "_削除待ち", vbTextCompare) = 0 Then

                        sourcePath = folderPath & fileName
                        found = True
                        Exit Do

                    End If

                End If

            End If

            fileName = Dir()

        Loop

        If found = False Then
            MsgBox "該当するファイルが見つかりません。" & vbCrLf & _
                   "検索文字列:" & searchText, vbExclamation
            GoTo ExitHandler
        End If

        'ファイル名を取得
        baseName = Left(sourcePath, InStrRev(sourcePath, ".") - 1)
        ext = Mid(sourcePath, InStrRev(sourcePath, "."))

        '一時保存ファイル名
        tempXlsx = baseName & "-1.xlsx"

        '最終保存ファイル名
        finalPath = baseName & ".xlsx"

        '元ファイルの退避先
        backupPath = baseName & "_削除待ち" & ext

        '保存先の重複確認
        If Dir(tempXlsx) <> "" Then
            MsgBox "一時保存ファイルが既に存在します。" & vbCrLf & _
                   tempXlsx, vbExclamation
            GoTo ExitHandler
        End If

        If Dir(backupPath) <> "" Then
            MsgBox "退避用ファイルが既に存在します。" & vbCrLf & _
                   backupPath, vbExclamation
            GoTo ExitHandler
        End If

        '----------------------------------
        '2. 元のExcelファイルをコピー
        '----------------------------------

        tempXlsm = Environ("TEMP") & "\Template_" & _
                   Format(Now, "yyyymmddhhnnss") & "_" & i & ".xlsm"

        wbTemplate.SaveCopyAs tempXlsm

        Set wbCopy = Workbooks.Open(tempXlsm)

        '----------------------------------
        '3. 取込元ファイルを開く
        '----------------------------------

        Set wbSource = Workbooks.Open(sourcePath, ReadOnly:=True)

        Set wsSource = wbSource.Worksheets(1)

        'A1:G17の値を取得
        data = wsSource.Range("A1:G17").Value

        '元のフォーマットに値だけ貼り付け
        Set wsCopy = wbCopy.Worksheets(wsTemplate.Index)

        wsCopy.Range("A1:G17").Value = data

        '取込元ファイルを閉じる
        wbSource.Close SaveChanges:=False
        Set wbSource = Nothing

        '----------------------------------
        '4. VBAボタンを削除
        '----------------------------------

        For j = 1 To wbCopy.Worksheets.Count

            Set wsCopy = wbCopy.Worksheets(j)

            'フォームコントロールのボタンと
            'マクロが登録された図形を削除
            For k = wsCopy.Shapes.Count To 1 Step -1

                Set shp = wsCopy.Shapes(k)

                If shp.Type = 8 Then

                    If shp.FormControlType = 0 Then
                        shp.Delete
                    End If

                ElseIf shp.OnAction <> "" Then

                    shp.Delete

                End If

            Next k

            'ActiveXのコマンドボタンを削除
            For k = wsCopy.OLEObjects.Count To 1 Step -1

                Set ole = wsCopy.OLEObjects(k)

                If InStr(1, ole.progID, _
                    "CommandButton", vbTextCompare) > 0 Then

                    ole.Delete

                End If

            Next k

        Next j

        '----------------------------------
        '5. I2~I4の文字列を削除
        '----------------------------------

        For j = 1 To wbCopy.Worksheets.Count
            wbCopy.Worksheets(j).Range("I2:I4").ClearContents
        Next j

        '----------------------------------
        '6. xlsx形式で一時保存
        '----------------------------------

        wbCopy.SaveAs fileName:=tempXlsx, _
                      FileFormat:=xlOpenXMLWorkbook

        wbCopy.Close SaveChanges:=False
        Set wbCopy = Nothing

        '----------------------------------
        '7. 元ファイルを退避
        '----------------------------------

        Name sourcePath As backupPath

        '----------------------------------
        '8. -1を取り除いて正式保存
        '----------------------------------

        On Error GoTo RenameError

        Name tempXlsx As finalPath

        On Error GoTo ErrorHandler

        '----------------------------------
        '9. 元ファイルを削除
        '----------------------------------

        Kill backupPath

        '一時テンプレートを削除
        Kill tempXlsm
        tempXlsm = ""

        successCount = successCount + 1

    Next i

    MsgBox "すべての処理が完了しました。" & vbCrLf & _
           "処理件数:" & successCount & "件", vbInformation

ExitHandler:

    On Error Resume Next

    If Not wbSource Is Nothing Then
        wbSource.Close SaveChanges:=False
    End If

    If Not wbCopy Is Nothing Then
        wbCopy.Close SaveChanges:=False
    End If

    If tempXlsm <> "" Then
        If Dir(tempXlsm) <> "" Then Kill tempXlsm
    End If

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.EnableEvents = True

    Exit Sub

'----------------------------------
'ファイル名変更エラー
'----------------------------------

RenameError:

    On Error Resume Next

    '元ファイルを復元
    If Dir(backupPath) <> "" Then
        Name backupPath As sourcePath
    End If

    On Error GoTo ErrorHandler

    MsgBox "ファイル名の変更に失敗しました。" & vbCrLf & _
           "一時保存ファイルは残っています。" & vbCrLf & _
           tempXlsx, vbCritical

    GoTo ExitHandler

'----------------------------------
'その他のエラー
'----------------------------------

ErrorHandler:

    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号:" & Err.Number & vbCrLf & _
           "内容:" & Err.Description, vbCritical

    Resume ExitHandler
モバイルバージョンを終了