トップ > 汎用コード > 指定フォルダ全ブックの指定シート指定行を一括削除

指定フォルダ全ブックの指定シート指定行を一括削除2024.11.20

指定フォルダ全ブックの指定シート(または全シート)を対象に、指定の行をまとめて削除するマクロです。
(指定フォルダ全ブックの指定シート指定列を一括削除はこちら

マクロ「指定フォルダ内全ブックの指定シート指定行を削除する」を実行すると、フォルダ参照ダイアログが表示されます。
フォルダを選択すると、そのフォルダ内の、全てのExcelブックの指定シート(または全シート)から指定した行を削除します。
削除の結果は、新しいブックにまとめて出力されます。

削除する行番号は、複数まとめて指定できます。

(あわせてアクティブブックの全シートの指定行を一括で削除するマクロも記載しています)


【お薦め】マクロ・プロシージャを管理する無料のツール!
 Excelマクロ管理ツール

サンプルコード

コードの貼り付け場所   VBAコードをカラーで印刷・Web掲載するためのツールはこちら

'-------------------------------------------------------------------------
' 指定フォルダ内全ブックの指定シート指定行を削除する
'-------------------------------------------------------------------------
' ※ マクロを実行すると行を削除したファイルは元に戻せませんので
'    予め指定フォルダのバックアップを作成しておくことを推奨します
'[作成日]2024.11.20
' https://excel.syogyoumujou.com/vba/delete_specifiedrow.html
'-------------------------------------------------------------------------
Sub 指定フォルダ内全ブックの指定シート指定行を削除する()
    '--------------------------------
    ' 削除する行番号を設定
    '--------------------------------
    Dim varTargetRow As Variant
    varTargetRow = 3      ' 3行を削除対象とする
                          '[削除対象行の指定]
                          '  ・10行を削除する場合       :varTargetRow = 10
                          '  ・1行,3行,5行を削除する場合:varTargetRow = Array(1, 3, 5)
    
    '--------------------------------
    ' (行削除対象のシート名を設定)
    '--------------------------------
    Dim strTargetSheetName As String
    strTargetSheetName = "" ' 行削除対象を全シートとする
                            '[シート名の指定]
                            '  ・全シートを対象とする場合:strTargetSheetName = ""
                            '  ・「Sheet1」シートを対象とする場合:strTargetSheetName = "Sheet1"

    '--------------------------------
    ' フォルダの選択
    '--------------------------------
    Dim strFolderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then strFolderPath = .SelectedItems(1)
    End With
    If Len(strFolderPath) = 0 Then Exit Sub

    '--------------------------------
    ' フォルダの存在確認
    '--------------------------------
    If Dir(strFolderPath, vbDirectory) = "" Then
        MsgBox "対象のフォルダが見つかりません", vbExclamation, "終了します"
        Exit Sub
    End If
    
    '--------------------------------
    ' 処理実行確認
    '--------------------------------
    If MsgBox("処理を実行しますか?", vbYesNo, Dir(strFolderPath, vbDirectory)) = vbNo Then Exit Sub
    
    '--------------------------------
    ' フォルダ内ブックを検索
    '--------------------------------
    Dim strFileName As String
    strFolderPath = strFolderPath & Application.PathSeparator ' フォルダパスに区切り文字追加
    strFileName = Dir(strFolderPath & "*.xls?")               ' フォルダからExcelブックを検索
    If strFileName = "" Then                                  ' ブックのパスを取得できなければ終了
        MsgBox "指定フォルダ内にExcelブックが見つかりません", vbExclamation, "終了します"
        Exit Sub
    End If
    
On Error Resume Next
    '--------------------------------
    ' ブックを順に開き処理を実行
    '--------------------------------
    Application.ScreenUpdating = False  ' 画面更新無効
    Application.EnableEvents = False    ' イベント無効
    
    Dim appExcel    As Excel.Application
    Dim bokTarget   As Workbook
    Dim shtTarget   As Worksheet
    Dim strMessage  As String
    Dim lngCount    As Long
    Dim strResult() As String
    Do
        ' フォルダ内のブックを開く
        Set appExcel = Excel.Application
        Set bokTarget = appExcel.Workbooks.Open(strFolderPath & strFileName)
        
        'ブックの各シートの対象行削除
        For Each shtTarget In bokTarget.Worksheets
            If strTargetSheetName = "" Or strTargetSheetName = shtTarget.Name Then
            
                ' 指定シートの指定行を削除する
                strMessage = deleteSpecifiedRow(shtTarget, varTargetRow)
                
                If strMessage = "" Then strMessage = "削除成功"
                
                ' 結果を配行変数に追加する
                ReDim Preserve strResult(lngCount)
                strResult(lngCount) = "ブック名:" & bokTarget.Name & _
                                      " シート名:" & shtTarget.Name & " " & strMessage
                lngCount = lngCount + 1
            End If
        Next
        
        ' 対象ブックを保存して閉じる
        bokTarget.Save
        bokTarget.Close
        
        Set bokTarget = Nothing
        Set appExcel = Nothing
        
        ' 次のExcelブックを検索
        strFileName = Dir()
    Loop Until strFileName = "" ' ブックが見つからなければループから抜ける
    
    strFileName = Dir("")

    '--------------------------------
    ' 結果出力
    '--------------------------------
    If lngCount = 0 Then
        MsgBox "削除対象のシートが見つかりませんでした", vbInformation
    Else
        MsgBox "実行結果を出力します", vbInformation
        With Workbooks.Add.Worksheets(1)
            If IsArray(varTargetRow) Then
                .Range("A1").Value = "削除対象行:" & Join$(varTargetRow, ",")
            Else
                .Range("A1").Value = "削除対象行:" & varTargetRow
            End If
            .Range("A2").Resize(lngCount, 1).Value = WorksheetFunction.Transpose(strResult)
        End With
        ActiveWindow.WindowState = xlNormal
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
On Error GoTo 0
End Sub

'------------------------------------------------------------------------- ' アクティブブックの全シート指定行を削除する '------------------------------------------------------------------------- '[作成日]2024.11.20 ' https://excel.syogyoumujou.com/vba/delete_specifiedrow.html '------------------------------------------------------------------------- Sub アクティブブックの全シート指定行を削除する() '-------------------------------- ' 削除する行番号を設定 '-------------------------------- Dim strNumberOfRow As String strNumberOfRow = InputBox("削除する行をアルファベットで指定してください" & vbLf & _ "[指定例]10行を指定する場合:10" & vbLf & _ "     1行と3行を指定する場合:1,3" & vbLf & _ "[行削除対象シート]" & vbLf & _ " " & ActiveWorkbook.Name & " の全シート") strNumberOfRow = Replace$(strNumberOfRow, " ", "", , , vbTextCompare) If strNumberOfRow = "" Then Exit Sub Dim varTargetRow As Variant If InStr(1, strNumberOfRow, ",", vbTextCompare) = 0 Then varTargetRow = strNumberOfRow Else varTargetRow = Split(strNumberOfRow, ",", , vbTextCompare) End If On Error Resume Next '-------------------------------- ' 処理実行 '-------------------------------- Application.ScreenUpdating = False ' 画面更新無効 Application.EnableEvents = False ' イベント無効 Dim shtTarget As Worksheet Dim strMessage As String Dim lngCount As Long Dim strResult() As String 'アクティブブックの各シートの対象行削除 For Each shtTarget In ActiveWorkbook.Worksheets ' 指定シートの指定行を削除する strMessage = deleteSpecifiedRow(shtTarget, varTargetRow) If strMessage = "" Then strMessage = "削除成功" ' 結果を配行変数に追加する ReDim Preserve strResult(lngCount) strResult(lngCount) = "シート名:" & shtTarget.Name & " " & strMessage lngCount = lngCount + 1 Next '-------------------------------- ' 結果出力 '-------------------------------- If lngCount = 0 Then MsgBox "削除対象のシートが見つかりませんでした", vbInformation Else MsgBox "実行結果を出力します", vbInformation With Workbooks.Add.Worksheets(1) .Range("A1").Value = "削除対象行:" & strNumberOfRow .Range("A2").Resize(lngCount, 1).Value = WorksheetFunction.Transpose(strResult) End With ActiveWindow.WindowState = xlNormal End If Application.EnableEvents = True Application.ScreenUpdating = True On Error GoTo 0 End Sub
'------------------------------------------------------------------------- ' 指定シートの指定行を削除する '------------------------------------------------------------------------- '[引数] ' shtTarget:対象ワークシートオブジェクト ' TargetRow:削除対象の行番号 ' 行番号を1次元配行で指定すると複数行をまとめて削除 '[戻り値] ' 成功 :空の文字行 ' 失敗 :エラーメッセージ '[作成日]2024.11.20 ' https://excel.syogyoumujou.com/vba/delete_specifiedrow.html '------------------------------------------------------------------------- Function deleteSpecifiedRow(ByRef shtTarget As Worksheet, _ ByVal TargetRow As Variant) As String '-------------------------------- ' シートの保護確認 '-------------------------------- If shtTarget.ProtectContents Then deleteSpecifiedRow = "シートが保護されています" Exit Function End If '-------------------------------- ' 削除対象行を配行として設定する '-------------------------------- If Not IsArray(TargetRow) Then TargetRow = Array(TargetRow) On Error Resume Next '-------------------------------- ' 削除対象行のA列セルを集合する '-------------------------------- Dim var As Variant Dim rngUnion As Range For Each var In TargetRow If rngUnion Is Nothing Then Set rngUnion = shtTarget.Cells(var, "A") Else Set rngUnion = Union(rngUnion, shtTarget.Cells(var, "A")) End If Next If rngUnion Is Nothing Then deleteSpecifiedRow = "指定した行番号が適切ではありません" Exit Function End If Err.Clear '-------------------------------- ' 集合したセルの行を削除する '-------------------------------- rngUnion.EntireRow.Delete On Error GoTo 0 ' エラーの場合は戻り値にエラー情報を設定する If Err.Number <> 0 Then deleteSpecifiedRow = "エラー番号:" & Err.Number & vbLf & Err.Description End If End Function



ページトップへ戻る

Excel 汎用コード

Copyright(C) 2009- 坂江 保 All Rights Reserved.