| 
    
     |  | データの量が多い場合は1行づつ削除では遅いので 先に、隣の列に削除Flagを立てて、それをKeyにソートし
 下の行に削除する行を集めて一気に削除します
 
 Option Explicit
 
 Public Sub Sample2()
 
 '◆データ列数(A列のみ)
 Const clngColumns As Long = 1
 '◆Keyと成る列を指定(基準セル位置からの列Offsetで指定:基準がA列なので0)
 Const clngKeys As Long = 0
 
 Dim i As Long
 Dim lngRows As Long
 Dim rngList As Range
 Dim vntData As Variant
 Dim lngDelete() As Long
 Dim lngCount As Long
 Dim strProm As String
 
 '◆Listの先頭セル位置を基準とする(A列のデータ先頭のセル位置)
 Set rngList = ActiveSheet.Cells(1, "A")
 
 With rngList
 '行数の取得
 lngRows = .Offset(Rows.Count - .Row, clngKeys).End(xlUp).Row - .Row + 1
 If lngRows <= 1 And .Value = "" Then
 strProm = "データが有りません"
 GoTo Wayout
 End If
 'A列データを配列に取得
 vntData = .Offset(, clngKeys).Resize(lngRows + 1).Value
 '削除Flag用の配列を確保
 ReDim lngDelete(1 To lngRows, 1 To 1)
 End With
 
 '数値以外なら削除Flagに1を立てる
 For i = 1 To lngRows
 '数値以外なら
 If (Not IsNumeric(vntData(i, 1))) Or (IsEmpty(vntData(i, 1))) Then
 'Flagに1を立てる
 lngDelete(i, 1) = 1
 '削除行数をカウント
 lngCount = lngCount + 1
 End If
 Next i
 
 '画面更新を停止
 Application.ScreenUpdating = False
 
 With rngList
 '削除行が有るなら
 If lngCount > 0 Then
 'FlagをL列に出力
 .Offset(, clngColumns).Resize(lngRows) = lngDelete
 '空白行を最終行に集める為、L列をKeyとして整列
 .Resize(lngRows, clngColumns + 1).Sort _
 Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
 Orientation:=xlTopToBottom, SortMethod:=xlStroke
 '削除行を削除
 .Offset(lngRows - lngCount).Resize(lngCount).EntireRow.Select
 .Offset(lngRows - lngCount).Resize(lngCount).EntireRow.Delete
 '削除Flag列を削除
 strProm = lngCount & "件の削除処理が完了しました"
 Else
 strProm = "削除行は有りません"
 End If
 End With
 
 Wayout:
 
 '画面更新を再開
 Application.ScreenUpdating = True
 
 Set rngList = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 
 |  |