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?

第13回 直感!スグに使える業務向けVBA汎用プロシージャ(空白行・列の自動検知&削除)

Last updated at Posted at 2025-06-21

私が編纂・配布させていただいているVBA汎用プロシージャの紹介と簡単な解説になります。
以下のリンクから .bas ファイルをダウンロードできます(zipファイル)

今回紹介するプロシージャは

プロシージャ名 概要
AutoDeleteBlankRows / AutoDeleteBlankColumns 空白行/列を削除

の2つになります!
第12回ではシートのデータ範囲を自動的に検知するものでしたが、データ範囲の中に不要な空白行または列が存在した場合、それも配列の中に格納されてしまいました。作りたいシステムによってそれでもいい場合ももちろんありますが、もし空白行・列が不要である場合この2つのプロシージャを適宜使用していただくことでデータを成型することができます。

内部処理は基本同じな為コードはまとめてご紹介します。

AutoDeleteBlankRows

Sub AutoDeleteBlankRows(Optional targetSheet As Worksheet)
'------------------------------------------------------------------------------------------------------------------------------
' 概要  |データが格納されたセル範囲を自動検知し空白の行を削除
'------------------------------------------------------------------------------------------------------------------------------
' 引数1 |targetSheet - 対象のワークシートオブジェクト(規定値:ActiveSheet)(Worksheet型)
'------------------------------------------------------------------------------------------------------------------------------
' 実装  |Ver.1.1.0(2025/06/14:新規)
'------------------------------------------------------------------------------------------------------------------------------
    
    Dim vLoop       As Long '行ループカウンタ
    Dim hLoop       As Long '列ループカウンタ
    Dim getVarEnd   As Long '最終行番号の取得
    Dim getHorEnd   As Long '最終列番号の取得
    Dim startVar    As Long '配列格納開始行番号
    Dim startHor    As Long '配列格納終了行番号
    Dim endVar      As Long '配列格納開始列番号
    Dim endHor      As Long '配列格納終了列番号
    Dim varMax      As Long '最大最終行番号記憶
    
    If targetSheet Is Nothing Then Set targetSheet = ActiveSheet
    
    'データテーブルの開始・終了列番号の取得
    For hLoop = targetSheet.Columns.Count To 1 Step -1
        getVarEnd = Cells(targetSheet.Rows.Count, hLoop).End(xlUp).Row
        If getVarEnd = 1 And targetSheet.Cells(1, hLoop) = "" Then getVarEnd = 0
        If getVarEnd > 0 And endHor = 0 Then endHor = hLoop
        If getVarEnd > 0 And endHor <> 0 Then startHor = hLoop
        If getVarEnd > varMax Then varMax = getVarEnd
    Next hLoop
    
    'データテーブルの開始・終了行番号の取得
    For vLoop = varMax To 1 Step -1
        getHorEnd = Cells(vLoop, targetSheet.Columns.Count).End(xlToLeft).Column
        If getHorEnd = 1 And targetSheet.Cells(vLoop, 1) = "" Then getHorEnd = 0
        If getHorEnd > 0 And endVar = 0 Then endVar = vLoop
        If getHorEnd > 0 And endVar <> 0 Then startVar = vLoop
    Next vLoop
    
    'データ範囲内のうち空白行のみを削除
    For vLoop = endVar To 1 Step -1
        If Cells(vLoop, targetSheet.Columns.Count).End(xlToLeft).Column = 1 And targetSheet.Cells(vLoop, 1) = "" Then Rows(vLoop).Delete
    Next vLoop
    
End Sub

AutoDeleteBlankColumns

Sub AutoDeleteBlankColumns(Optional targetSheet As Worksheet)
'------------------------------------------------------------------------------------------------------------------------------
' 概要  |データが格納されたセル範囲を自動検知し空白の列を削除
'------------------------------------------------------------------------------------------------------------------------------
' 引数1 |targetSheet - 対象のワークシートオブジェクト(規定値:ActiveSheet)(Worksheet型)
'------------------------------------------------------------------------------------------------------------------------------
' 実装  |Ver.1.1.0(2025/06/14:新規)
'------------------------------------------------------------------------------------------------------------------------------
    
    Dim vLoop       As Long '行ループカウンタ
    Dim hLoop       As Long '列ループカウンタ
    Dim getVarEnd   As Long '最終行番号の取得
    Dim getHorEnd   As Long '最終列番号の取得
    Dim startVar    As Long '配列格納開始行番号
    Dim startHor    As Long '配列格納終了行番号
    Dim endVar      As Long '配列格納開始列番号
    Dim endHor      As Long '配列格納終了列番号
    Dim varMax      As Long '最大最終行番号記憶
    
    If targetSheet Is Nothing Then Set targetSheet = ActiveSheet
    
    'データテーブルの開始・終了列番号の取得
    For hLoop = targetSheet.Columns.Count To 1 Step -1
        getVarEnd = Cells(targetSheet.Rows.Count, hLoop).End(xlUp).Row
        If getVarEnd = 1 And targetSheet.Cells(1, hLoop) = "" Then getVarEnd = 0
        If getVarEnd > 0 And endHor = 0 Then endHor = hLoop
        If getVarEnd > 0 And endHor <> 0 Then startHor = hLoop
        If getVarEnd > varMax Then varMax = getVarEnd
    Next hLoop
    
    'データテーブルの開始・終了行番号の取得
    For vLoop = varMax To 1 Step -1
        getHorEnd = Cells(vLoop, targetSheet.Columns.Count).End(xlToLeft).Column
        If getHorEnd = 1 And targetSheet.Cells(vLoop, 1) = "" Then getHorEnd = 0
        If getHorEnd > 0 And endVar = 0 Then endVar = vLoop
        If getHorEnd > 0 And endVar <> 0 Then startVar = vLoop
    Next vLoop
    
    'データ範囲のうち空白列のみ削除
    For hLoop = endHor To 1 Step -1
        If Cells(targetSheet.Rows.Count, hLoop).End(xlUp).Row = 1 And targetSheet.Cells(1, hLoop) = "" Then Columns(hLoop).Delete
    Next hLoop
    
End Sub

動作解説

第12回のサンプルファイルを元にAutoDeleteBlankRowsAutoDeleteBlankColumnsを使ってみましょう!

Excel-12-1.png

A列、E列、1行、6行が空白になっております。これらの行・列を削除していきましょう。記述はとっても簡単でアクティブシートであれば引数も必要ないため

Call AutoDeleteBlankRows
Call AutoDeleteBlankColumns

たったこれだけで

Excel-13-1.png

空白の行が削除されて表がスッキリしました!
スッキリした表に対してCellToArrayAutoCellToArrayを組み合わせることによってとっても簡単にシートのデータを抽出できてしまいます!

また、複数シートにまたがってデータを抽出してさらに何かしらの処理をしたい場合は

Sub Main()
    
    Dim s As Long 'ループカウンタ
    Dim a As Variant 'データ格納用配列
    
    For s = 1 To Worksheets.Count
        Call AutoDeleteBlankRows(s)
        Call AutoDeleteBlankColumns(s)
        a = AutoCellToArray(s)
        
        '****************************************************
        '配列のペースト等処理(PasteArray,ArrayToCsvなどを活用)
        '****************************************************
        
    Next s
    
End Sub

このようなコードで実現できます。1からこれらの処理を書こうとすると結構面倒くさいので、ぜひこれら汎用プロシージャを使って楽をしちゃってください!

直感!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?