Я хочу проверить, является ли диапазон в Excel пустым.
Как мне написать в коде VBA:
If Range("A38":"P38") is empty
Я хочу проверить, является ли диапазон в Excel пустым.
Как мне написать в коде VBA:
If Range("A38":"P38") is empty
Нашел решение по комментариям, которые я получил.
Sub TestIsEmpty()
If WorksheetFunction.CountA(Range("A38:P38")) = 0 Then
MsgBox "Empty"
Else
MsgBox "Not Empty"
End If
End Sub
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.
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`
Уточнение будет предоставлено немного позже (сейчас я работаю)
Если вы оказались в ситуации, когда абсолютно необходимо циклически проходить через каждую ячейку в диапазоне вместо использования 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
.
Dim cel As Range, hasNoData As Boolean
hasNoData = True
For Each cel In Selection
hasNoData = hasNoData And IsEmpty(cel)
Next
Это вернет True
если ни одна ячейка в Selection
содержит каких-либо данных. Для определенного диапазона просто замените RANGE(...)
на Selection
.
Другое возможное решение. Считайте пустые ячейки и вычтем это значение из общего числа ячеек
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
Это лишь небольшое дополнение к @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