web-dev-qa-db-ja.com

範囲が空かどうかを検出

Excelの範囲が空かどうかを確認したい。

VBAコードを記述する方法:

If Range("A38":"P38") is empty
29
Kano

私が得たコメントから解決策を見つけました。

Sub TestIsEmpty()
    If WorksheetFunction.CountA(Range("A38:P38")) = 0 Then
        MsgBox "Empty"
    Else
        MsgBox "Not Empty"
    End If
End Sub
50
Kano

変数が初期化されていない場合、または明示的に空に設定されている場合、IsEmptyはTrueを返します。それ以外の場合は、Falseを返します。式に複数の変数が含まれる場合、常にFalseが返されます。 IsEmptyは、バリアントに対して意味のある情報のみを返します。 ( https://msdn.Microsoft.com/en-us/library/office/gg264227.aspx )。したがって、範囲内のすべてのセルを個別にチェックする必要があります。

    Dim thisColumn as Byte, thisRow as Byte

    For thisColumn = 1 To 5
        For ThisRow = 1 To 6
             If IsEmpty(Cells(thisRow, thisColumn)) = False Then
                 GoTo RangeIsNotEmpty
             End If
        Next thisRow
    Next thisColumn
    ...........
    RangeIsNotEmpty: 

もちろん、空のセルをカウントしないCountA関数を使用したソリューションよりも多くのコードがありますが、GoToは、少なくとも1つの空でないセルが見つかった場合にループを中断し、特に範囲が大きく、このケースを検出する必要がある場合、コードを高速に実行できます。また、このコードは、VBA関数ではないExcel CountA関数を使用するよりも、コードが何をしているのかを理解しやすいです。

5
Dim M As Range

    Set M = Selection

If application.CountIf(M, "<>0") < 2 Then
    MsgBox "Nothing selected, please select first BOM or Next BOM"
Else

'Your code here

End If

私はあなたができることを学んだ経験から:

If Selection.Rows.Count < 2 
Then End If`

少し後で説明を提供します(現在作業中です)

4
DeerSpotter

CountAを使用する代わりに、範囲内の各セルをループすることが絶対に必要な状況にある場合、最初にその範囲を配列に変換し、その配列の値でループするよりもはるかに高速です多くの範囲/セルでループします。

関数IsRangeEmpty(ByVal rng As Range)Asブール

_'Converts a range to an array and returns true if a value is found in said array

Dim area As Range
For Each area In rng.Areas

    If area.Cells.Count > 1 Then

        'save range as array
        Dim arr As Variant
        arr = area.value

        'loop through array
        Dim cel As Variant
        For Each cel In arr

            'if cell is not empty then
            If Len(Trim(cel)) > 0 Then
                IsRangeEmpty = False
                Exit Function
            End If

        Next cel

    Else    'cannot loop on array with one value

        'if cell is not empty then
        If Len(Trim(area.Value2)) > 0 Then
            IsRangeEmpty = False
            Exit Function
        End If

    End If

Next area

IsRangeEmpty = True
_

終了機能


使用方法の例:

_Sub Test()
    Debug.Print IsRangeEmpty(Range("A38:P38"))
End Sub
_

Range("A38:P38")が空の場合、True;を出力します。それ以外の場合は、Falseを出力します。

3
Marcucciboy2
_Dim cel As Range, hasNoData As Boolean

    hasNoData = True
    For Each cel In Selection
        hasNoData = hasNoData And IsEmpty(cel)
    Next
_

True内のセルにデータが含まれていない場合、これはSelectionを返します。特定の範囲については、SelectionRANGE(...)に置き換えるだけです。

2
TomM

別の可能な解決策。空のセルを数え、セルの総数からその値を引きます

Sub Emptys()

Dim r As range
Dim totalCells As Integer

'My range To check'
Set r = ActiveSheet.range("A1:B5")

'Check for filled cells'
totalCells = r.Count- WorksheetFunction.CountBlank(r)


If totalCells = 0 Then
    MsgBox "Range is empty"
Else
    MsgBox "Range is not empty"
End If

End Sub
1
DJK

これは@TomM'sへのわずかな追加です。 answer /選択範囲のセルが空かどうかをチェックする簡単な関数

Public Function CheckIfSelectionIsEmpty() As Boolean
   Dim emptySelection As Boolean:emptySelection=True
   Dim cell As Range
   For Each cell In Selection
       emptySelection = emptySelection And isEmpty(cell)
       If emptySelection = False Then
          Exit For
       End If
   Next
   CheckIfSelectionIsEmpty = emptySelection
End Function
0
LiNKeR