Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
特定の条件を満たすセルを含む行の削除
投稿日時: 18/12/06 12:50:38
投稿者: hay.hide

まず前提として、
1行おきにある色の網掛けがされています。
網掛けが設定されている行数はファイルをもらったその時々で違います。
 
A列〜K列には文字列や数値が入っています。
こちらも、その時々によって入力されている行数が違います。
 
すると、こういう事象が発生します。
 
網掛けはされているけれども、何も入力されていない行が下の方に発生する。
 
この部分の行を削除したいのですが。。。
 
毎回、削除対象となる行の始まりと行数が変わるので、なんとかできないかと思っています。
 
よろしくおねがいします。
 
 
 

回答
投稿日時: 18/12/06 15:14:31
投稿者: sk

引用:
特定の条件を満たすセルを含む行の削除

引用:
1行おきにある色の網掛けがされています。

セル範囲の塗りつぶし書式の設定のことをおっしゃっているのだとして、
具体的にどのような書式(背景色/パターンの色/パターンの種類)が
設定されているセルを対象としているのでしょうか。
 
また「 1 行おきに」とありますが、
 
引用:
網掛けはされているけれども、何も入力されていない行が下の方に発生する。
この部分の行を削除したいのですが。。

「網掛けはされていないが、何らかの値が入力されている行」や
「網掛けされていないし、何の値も入力されていない行」が
「網掛けはされているけれども、何も入力されていない行」の間に
挟まれている場合、それらの行は削除せずにそのまま残すのでしょうか。
 
引用:
A列〜K列には文字列や数値が入っています。
こちらも、その時々によって入力されている行数が違います。

引用:
毎回、削除対象となる行の始まりと行数が変わる

例えば、単純に「何らかの値が入力されている最後の行」より
下にある(網掛けを含む、何らかの書式が設定されている)全ての行を
削除したい、というのが本来の目的であるならば、
「削除条件となる塗りつぶし書式」の具体的な設定内容等に
ついては一切無視出来るのですが。

投稿日時: 18/12/06 17:44:52
投稿者: hay.hide

ご返信ありがとうございます。
 
おっしゃるように
 
単純に「何らかの値が入力されている最後の行」より
下にある(網掛けを含む、何らかの書式が設定されている)全ての行を
削除したい、というのが本来の目的である
 
ということです。
 
この点で、ご教授願えますでしょうか?
 
よろしくお願いします。

回答
投稿日時: 18/12/06 19:01:01
投稿者: sk

引用:
単純に「何らかの値が入力されている最後の行」より
下にある(網掛けを含む、何らかの書式が設定されている)全ての行
削除したい

(標準モジュール)
--------------------------------------------------------------
Sub subDeleteBlankRows()
 
    Dim ws As Excel.Worksheet
    Dim rngTable As Excel.Range
    Dim rngLastDataCell As Excel.Range
     
    Dim lngLastDataRow As Long
     
    Set ws = ActiveSheet
    Set rngTable = ws.Range("A:K")
    lngLastDataRow = 0
     
    With rngTable
        Set rngLastDataCell = .Find(What:="*", _
                                    LookIn:=xlFormulas, _
                                    SearchOrder:=xlByRows, _
                                    SearchDirection:=xlPrevious)
        If Not rngLastDataCell Is Nothing Then
            lngLastDataRow = rngLastDataCell.Row
        End If
        If (lngLastDataRow > 0) And _
           (lngLastDataRow < ws.Rows.Count) Then
             
            ws.Range(ws.Cells(lngLastDataRow + 1, .Column), _
                     .Cells(.Rows.Count, .Columns.Count)).Delete xlShiftUp
         
        End If
    End With
         
    Set rngLastDataCell = Nothing
    Set rngTable = Nothing
    Set ws = Nothing
     
End Sub
--------------------------------------------------------------
 
以上のようなコードを実行なさればよろしいのではないかと。

投稿日時: 18/12/06 19:25:14
投稿者: hay.hide

早速のご教授ありがとうございます。
 
動かしてみましたところ、目的が達成されました。
 
これから、コードの内容を自分なりに調べて理解を深めたいと思います。
 
今回は、本当にありがとうございました.