Подтвердить что ты не робот

Определить, если диапазон пуст

Я хочу проверить, является ли диапазон в Excel пустым.

Как мне написать в коде VBA:

If Range("A38":"P38") is empty
4b9b3361

Ответ 1

Нашел решение по комментариям, которые я получил.

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

Ответ 2

IsEmpty возвращает True, если переменная неинициализирована или для нее явно установлено значение Empty; в противном случае возвращается 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 может прерывать циклы, если найдена хотя бы одна непустая ячейка, и выполнять ваш код быстрее, особенно если диапазон большой и вам нужно обнаружить этот случай. Также этот код для меня легче понять, что он делает, чем с функцией Excel CountA, которая не является функцией VBA.

Ответ 3

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

Если вы оказались в ситуации, когда абсолютно необходимо циклически проходить через каждую ячейку в диапазоне вместо использования CountA, то гораздо быстрее сначала преобразовать этот диапазон в массив и выполнить циклическую обработку значений этого массива, чем циклически повторять на многих диапазоны/клетки.

Функция IsRangeEmpty (ByVal rng As Range) как логическое значение

'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

End Function


Пример того, как его использовать:

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

Если Range("A38:P38") пусто, будет напечатано True; в противном случае он напечатал бы False.

Ответ 5

Dim cel As Range, hasNoData As Boolean

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

Это вернет True если ни одна ячейка в Selection содержит каких-либо данных. Для определенного диапазона просто замените RANGE(...) на Selection.

Ответ 6

Другое возможное решение. Считайте пустые ячейки и вычтем это значение из общего числа ячеек

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

Ответ 7

Это лишь небольшое дополнение к @TomM's ответе/Простую функцию, чтобы проверить, если ваши клетки выбора пусты

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