| 
    
     |  | こんなでは? 
 Listの先頭見出し位置をrngListで指定
 空白を検出する列をclngKeyで指定
 (基準位置「rngList」がA列なら、基準位置A列から検出列A列の列Offsetで0
 例えば、基準位置A列で検出列B列なら列Offsetで1
 基準位置B列で検出列B列なら列Offsetで0
 基準位置B列で検出列C列なら列Offsetで1)
 Listの列数をclngColumnsで指定
 例えば、ListがA列〜G列なら7列で、8列目(H列)に作業列が設けられ
 削除される行は1が立てられ、されない行は0に成ります
 作業列(H列)をKeyとしてListが整列されます
 Excelは安定な整列を行う為、Listの順位は変わりません
 多分、teianさんのコードもListの順位は変わらない筈です
 
 Option Explicit
 
 Public Sub Sample()
 
 '★データの列数(A列〜G列)
 Const clngColumns As Long = 7
 '★空白の検出列位置を設定 (基準列位置からの列Offsetで指定、A列)
 '基準位置(rngList)がA列なら、A列からA列の列Offsetで0
 Const clngKey As Long = 0
 
 Dim i As Long
 Dim lngRows As Long
 Dim lngCount As Long
 Dim rngList As Range
 Dim vntData As Variant
 Dim lngDelete() As Long
 Dim strProm As String
 
 '★データの左上隅を基準位置とする(列見出し「商品コード」の位置)
 Set rngList = ActiveSheet.Cells(1, "A")
 
 With rngList
 '行数の取得
 lngRows = .Offset(Rows.Count - .Row, clngKey).End(xlUp).Row - .Row
 If lngRows <= 0 Then
 strProm = "データが有りません"
 GoTo Wayout
 End If
 '検出列データを配列に取得
 vntData = .Offset(1, clngKey).Resize(lngRows + 1).Value
 End With
 
 'Flagを格納する配列を確保
 ReDim lngDelete(1 To lngRows, 1 To 1)
 
 Application.ScreenUpdating = False
 
 'データ行数分繰り返し
 For i = 1 To lngRows
 'KeyがEmptyなら
 If Trim(vntData(i, 1)) = Empty Then
 '削除フラグを立てる
 lngDelete(i, 1) = 1
 '削除数をカウント
 lngCount = lngCount + 1
 End If
 Next i
 
 With rngList
 '削除する行が合った場合
 If lngCount > 0 Then
 '削除フラグの配列をデータ列の右側に出力
 .Offset(1, clngColumns).Resize(lngRows).Value = lngDelete
 '削除フラグの列をKeyとして整列
 .Offset(1).Resize(lngRows, clngColumns + 1).Sort _
 Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, _
 MatchCase:=False, Orientation:=xlTopToBottom, _
 SortMethod:=xlStroke
 '行の消去(空白行なら不要かも?)
 '      .Offset(lngRows - lngCount + 1).Resize(lngCount, clngColumns).ClearContents
 ''削除フラグの列を削除
 .Offset(, clngColumns).EntireColumn.Delete
 strProm = "処理が完了しました"
 Else
 strProm = "空白行が有りません"
 End If
 End With
 
 Wayout:
 
 Application.ScreenUpdating = True
 
 Set rngList = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 |  |