Excel миф если нет данных

Содержание

  1. Макрос определяющий пустая ли ячейка или заполненная в VBA Excel
  2. Алгоритм для строго определенной ячейки с применением её адреса.
  3. Алгоритм для выделенной (активной) ячейки :
  4. Еще один способ определения в примере для активной ячейки, но можно использовать и для конкретной ячейки с адресом.
  5. Добавить комментарий Отменить ответ
  6. Как в ячейке с формулой вместо ошибки показать 0
  7. Проверка условий (If…Then…)
  8. Краткое руководство по VBA If Statement
  9. Что такое IF и зачем оно тебе?
  10. Тестовые данные
  11. Формат операторов VBA If Then
  12. Простой пример If Then
  13. Условия IF
  14. Использование If ElseIf
  15. Использование If Else
  16. Используя If And/If Or
  17. Функция IIF
  18. Использование Select Case

Макрос определяющий пустая ли ячейка или заполненная в VBA Excel

Периодически при создании различных макросов в VBA Excel возникает потребность в том, чтобы алгоритм макроса самостоятельно определял, пуста ли ячейка или заполнена данными.

Далее приведем несколько простых макросов для определения заполнения ячейки данными и разберем принцип их работы. Фрагменты этих макросов вы можете добывать в свой код для реализации проверки заполнения ячеек.

Рассмотрим несколько вариантов VBA алгоритмов:

Алгоритм для строго определенной ячейки с применением её адреса.

Пример для ячейки с адресом B6:

  • Private Sub CommandButton1_Click() ‘наименование алгоритма
  • If IsEmpty(Range(«B6»)) = True Then ‘условие, если ячейка пустая, то
  • MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
  • Else ‘в противном случае
  • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
  • End If ‘конец блока «если»
  • End Sub ‘конец алгоритма

Алгоритм для выделенной (активной) ячейки :

  • Private Sub CommandButton1_Click() ‘наименование алгоритма
  • If IsEmpty(ActiveCell) = True Then ‘условие, если активная ячейка (ActiveCell) пустая, то
  • MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
  • Else ‘в противном случае
  • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
  • End If ‘конец блока «если»
  • End Sub ‘конец алгоритма

Еще один способ определения в примере для активной ячейки, но можно использовать и для конкретной ячейки с адресом.

  • Private Sub CommandButton1_Click() ‘наименование алгоритма
  • If Len(ActiveCell) Then ‘если активная ячейка заполнена данными (имеет объем информации)
  • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
  • Else ‘в противном случае
  • MsgBox («Ячейка пустая») ‘вывод сообщения, что в ячейке нет данных
  • End If ‘конец блока «если»
  • End Sub ‘конец алгоритма

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Источник

Как в ячейке с формулой вместо ошибки показать 0

Случаются ситуации, когда в рабочей книге на листах создано много формул, выполняющих различные задачи. При этом формулы созданы когда-то давно, возможно даже на вами. И формулы возвращают ошибки. Например #ДЕЛ/0! (#DIV/0!) . Эта ошибка возникает, если внутри формулы происходит деление на ноль: = A1 / B1 , где в B1 ноль или пусто. Но могут быть и другие ошибки(#Н/Д, #ЗНАЧ! и т.д.). Можно изменить формулу, добавив проверку на ошибку:
=ЕСЛИ(ЕОШ( A1 / B1 );0; A1 / B1 )
=IF(ISERR( A1 / B1 ),0, A1 / B1 )
аргументы:
=ЕСЛИ(ЕОШ(1 аргумент);2 аргумент; 1 аргумент)
Эти формулы будут работать в любой версии Excel. Правда, функция ЕОШ не обработает ошибку #Н/Д (#N/A) . Чтобы так же обработать и #Н/Д необходимо использовать функцию ЕОШИБКА:
=ЕСЛИ(ЕОШИБКА( A1 / B1 );0; A1 / B1 )
=IF(ISERROR( A1 / B1 ),0, A1 / B1 )
Однако далее по тексту я буду применять ЕОШ(т.к. она короче) и к тому же не всегда надо «не видеть» ошибки #Н/Д.
Но для версий Excel 2007 и выше можно применить чуть более оптимизированную функцию ЕСЛИОШИБКА (IFERROR) :
=ЕСЛИОШИБКА( A1 / B1 ;0)
=IFERROR( A1 / B1 ,0)
аргументы:
=ЕСЛИОШИБКА(1 аргумент; 2 аргумент)

1 аргумент: выражение для вычисления
2 аргумент: значение или выражение, которое необходимо вернуть в ячейку в случае ошибки в первом аргументе.

Почему ЕСЛИОШИБКА лучше и я называю её более оптимизированной? Разберем первую формулу подробнее:
=ЕСЛИ(ЕОШ( A1 / B1 );0; A1 / B1 )
Если вычислить пошагово, то увидим, что сначала происходит вычисление выражения A1 / B1 (т.е. деление). И если его результат ошибка – то ЕОШ вернет ИСТИНА (TRUE) , которое будет передано в ЕСЛИ (IF) . И тогда функцией ЕСЛИ(IF) будет возвращено значение из второго аргумента 0.
Но если результат не является ошибочным и ЕОШ (ISERR) возвращает ЛОЖЬ (FALSE) – то функция заново будет вычислять уже вычисленное ранее выражение: A1 / B1
С приведенной формулой это особой роли не играет. Но если применяется формула вроде ВПР (VLOOKUP) с просмотром на несколько тысяч строк – то вычисление два раза может значительно увеличить время пересчета формул.
Функция же ЕСЛИОШИБКА (IFERROR) один раз вычисляет выражение, запоминает его результат и если он ошибочен возвращает записанное вторым аргументом. Если же ошибки нет, то возвращает запомненный результат вычисления выражения из первого аргумента. Т.е. вычисление по факту происходит один раз, что практически не будет влиять на скорость общего пересчета формул.
Поэтому если у вас Excel 2007 и выше и файл не будет использоваться в более ранних версиях – то имеет смысл использовать именно ЕСЛИОШИБКА (IFERROR) .

Для чего формулы с ошибками вообще исправлять? Обычно делается для более эстетичного отображения данных в отчетах, особенно если отчеты потом руководству отправляют.

Итак, есть на листе такие формулы, ошибки которых надо обработать. Если подобных формул для исправления одна-две(да даже 10-15) – то проблем почти нет заменить вручную. Но если таких формул несколько десятков, а то и сотен – проблема приобретает почти вселенские масштабы :-). Однако процесс можно упростить через написание относительно простого кода Visual Basic for Application.
Для всех версий Excel:

Sub IfIsErrNull() Const sToReturnVal As String = «0» ‘если необходимо вместо нуля возвращать пусто ‘Const sToReturnVal As String = «»»»»» Dim rr As Range, rc As Range Dim s As String, ss As String On Error Resume Next Set rr = Intersect(Selection, ActiveSheet.UsedRange) If rr Is Nothing Then MsgBox «Выделенный диапазон не содержит данных», vbInformation, «www.excel-vba.ru» Exit Sub End If For Each rc In rr If rc.HasFormula Then s = rc.Formula s = Mid(s, 2) ss = «=» & «IF(ISERR(» & s & «),» & sToReturnVal & «,» & s & «)» If Left(s, 9) <> «IF(ISERR(» Then If rc.HasArray Then rc.FormulaArray = ss Else rc.Formula = ss End If If Err.Number Then ss = rc.Address rc.Select Exit For End If End If End If Next rc If Err.Number Then MsgBox «Невозможно преобразовать формулу в ячейке: » & ss & vbNewLine & _ Err.Description, vbInformation, «www.excel-vba.ru» Else MsgBox «Формулы обработаны», vbInformation, «www.excel-vba.ru» End If End Sub

Для версий 2007 и выше

Sub IfErrorNull() Const sToReturnVal As String = «0» ‘если необходимо вместо нуля возвращать пусто ‘Const sToReturnVal As String = «»»»»» Dim rr As Range, rc As Range Dim s As String, ss As String On Error Resume Next Set rr = Intersect(Selection, ActiveSheet.UsedRange) If rr Is Nothing Then MsgBox «Выделенный диапазон не содержит данных», vbInformation, «www.excel-vba.ru» Exit Sub End If For Each rc In rr If rc.HasFormula Then s = rc.Formula s = Mid(s, 2) ss = «=» & «IFERROR(» & s & «,» & sToReturnVal & «)» If Left(s, 8) <> «IFERROR(» Then If rc.HasArray Then rc.FormulaArray = ss Else rc.Formula = ss End If If Err.Number Then ss = rc.Address rc.Select Exit For End If End If End If Next rc If Err.Number Then MsgBox «Невозможно преобразовать формулу в ячейке: » & ss & vbNewLine & _ Err.Description, vbInformation, «www.excel-vba.ru» Else MsgBox «Формулы обработаны», vbInformation, «www.excel-vba.ru» End If End Sub

Как это работает
Если не знакомы с макросами, то для начала лучше прочитать как их создавать и вызывать: Что такое макрос и где его искать?, т.к. может случиться так, что все сделаете правильно, но забудете макросы разрешить и ничего не заработает.

Копируете приведенный код, переходите в редактор VBA(Alt+F11), создаете стандартный модуль(InsertModule) и просто вставляете в него этот код. Переходите в нужную книгу Excel и выделяете все ячейки, формулы в которых необходимо преобразовать таким образом, чтобы в случае ошибки они возвращали ноль. Жмете Alt + F8 , выбираете код IfIsErrNull(или IfErrorNull, в зависимости от того, какой именно скопировали) и жмете Выполнить.
Ко всем формулам в выделенных ячейках будет добавлена функция обработки ошибки. Приведенные коды учитывают так же:
-если в формуле уже применена функция ЕСЛИОШИБКА или ЕСЛИ(ЕОШ, то такая формула не обрабатывается;
-код корректно обработает так же функции массива;
-выделять можно несмежные ячейки(через Ctrl ).
В чем недостаток: сложные и длинные формулы массива могут вызвать ошибку кода, в связи с особенностью данных формул и их обработкой из VBA. В таком случае код напишет о невозможности продолжить работу и выделит проблемную ячейку. Поэтому настоятельно рекомендую производить замены на копиях файлов.
Если значение ошибки надо заменить на пусто, а не на ноль, то надо строку

Const sToReturnVal As String = «0»

Удалить, а перед строкой

‘Const sToReturnVal As String = «»»»»»

Удалить апостроф ( )

Так же можно данный код вызывать нажатием кнопки(Как создать кнопку для вызова макроса на листе) или поместить в надстройку(Как создать свою надстройку?), чтобы можно было вызывать из любого файла.

И небольшое дополнение: старайтесь применять код вдумчиво. Не всегда возврат ошибки мешает. Например, при использовании ВПР иногда полезно видеть какие значения не были найдены.
Так же хочу отметить, что применять надо к реально работающим формулам. Потому как если формула возвращает #ИМЯ! (#NAME!) , то это означает, что в формуле неверно записан какой-то аргумент и это ошибка записи формулы, а не ошибка результата вычисления. Такие формулы лучше проанализировать и найти ошибку, чтобы избежать логических ошибок расчетов на листе.

Статья помогла? Поделись ссылкой с друзьями!

Источник

Проверка условий (If…Then…)

Угадай, если сможешь, и выбери, если посмеешь

Краткое руководство по VBA If Statement

Описание Формат Пример
If Then If [условие верно]
Then [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
End If
If Else If [условие верно]
Then [действие]
Else [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
Else Debug.Print
«Попробуй снова»
End If
If ElseIf If [1 условие верно]
Then [действие]
ElseIf [2 условие
верно]
Then [действие]
End If
If score = 100
Then Debug.Print
«Отлично»
ElseIf score > 50
Then Debug.Print
«Пройдено»
ElseIf score 50
Then Debug.Print
«Пройдено»
ElseIf score > 30
Then Debug.Print
«Попробуй снова»
Else Debug.Print
«Ой»
End If
If без Endif
(Только одна
строка)
If [условие верно]
Then [действие]
If value

В следующем коде показан простой пример использования оператора VBA If

Что такое IF и зачем оно тебе?

Оператор VBA If используется, чтобы позволить вашему коду делать выбор, когда он выполняется.

Вам часто захочется сделать выбор на основе данных, которые читает ваш макрос.

Например, вы можете захотеть читать только тех учеников, у которых оценки выше 70. Когда вы читаете каждого учащегося, вы можете использовать инструкцию If для проверки отметок каждого учащегося.

Важным словом в последнем предложении является проверка. Оператор If используется для проверки значения, а затем для выполнения задачи на основе результатов этой проверки.

Тестовые данные

Мы собираемся использовать следующие тестовые данные для примеров кода в этом посте.

Формат операторов VBA If Then

Формат оператора If Then следующий

За ключевым словом If следуют условие и ключевое слово Then

Каждый раз, когда вы используете оператор If Then, вы должны использовать соответствующий оператор End If.

Когда условие оценивается как истинное, обрабатываются все строки между If Then и End If.

Чтобы сделать ваш код более читабельным, рекомендуется делать отступы между операторами If Then и End If.

Отступ между If и End If

Отступ означает просто переместить строку кода на одну вкладку вправо. Правило большого пальца состоит в том, чтобы сделать отступ между начальным и конечным операторами, такими как:

Sub … End Sub
If Then … End If
If Then… ElseIf … Else … Endif
For … Next
Do While … Loop
Select Case … End Case

Для отступа в коде вы можете выделить строки для отступа и нажать клавишу Tab. Нажатие клавиш Shift + Tab сделает отступ кода, т.е. переместит его на одну вкладку влево.

Вы также можете использовать значки на панели инструментов Visual Basic для отступа кода.

Если вы посмотрите на примеры кода на этом сайте, вы увидите, что код имеет отступ.

Простой пример If Then

Следующий код выводит имена всех студентов с баллами более 50.

  • Василий Кочин
  • Максим Бородин
  • Дмитрий Маренин
  • Олеся Клюева
  • Евгений Яшин

Поэкспериментируйте с этим примером и проверьте значение или знак > и посмотрите, как изменились результаты.

Условия IF

Часть кода между ключевыми словами If и Then называется условием. Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как «>, ,> =,

Условие Это верно, когда
x 5 x больше, чем 5
x >= 5 x больше, либо равен 5
x = 5 x равен 5
x <> 5 x не равен 5
x > 5 And x 10 x равен 2 ИЛИ x больше,чем 10
Range(«A1») = «Иван» Ячейка A1 содержит текст «Иван»
Range(«A1») <> «Иван» Ячейка A1 не содержит текст «Иван»

Вы могли заметить x = 5, как условие. Не стоит путать с х = 5, при использовании в качестве назначения.

Когда в условии используется «=», это означает, что «левая сторона равна правой стороне».

В следующей таблице показано, как знак равенства используется в условиях и присваиваниях.

Использование «=» Тип Значение
Loop Until x = 5 Условие Равен ли x пяти
Do While x = 5 Условие Равен ли x пяти
If x = 5 Then Условие Равен ли x пяти
For x = 1 To 5 Присваивание Установите значение х = 1, потом = 2 и т.д.
x = 5 Присваивание Установите х до 5
b = 6 = 5 Присваивание и
условие
Присвойте b
результату условия
6 = 5
x = MyFunc(5,6) Присваивание Присвойте х
значение,
возвращаемое
функцией

Последняя запись в приведенной выше таблице показывает оператор с двумя равными. Первый знак равенства — это присвоение, а любые последующие знаки равенства — это условия.

Поначалу это может показаться странным, но подумайте об этом так. Любое утверждение, начинающееся с переменной и равно, имеет следующий формат

[переменная] [=] [оценить эту часть]

Поэтому все, что находится справа от знака равенства, оценивается и результат помещается в переменную. Посмотрите на последние три строки таблицы, как:

Использование If ElseIf

Инструкция ElseIf позволяет вам выбирать из нескольких вариантов. В следующем примере мы печатаем баллы, которые находятся в диапазоне.

Важно понимать, что порядок важен. Условие If проверяется первым.

Если это правда, то печатается «Высший балл», и оператор If заканчивается.

Если оно ложно, то код переходит к следующему ElseIf и проверяет его состояние.

Давайте поменяемся местами If и ElseIf из последнего примера. Код теперь выглядит так

В этом случае мы сначала проверяем значение более 75. Мы никогда не будем печатать «Высший балл», потому что, если значение больше 85, это вызовет первый оператор if.

Чтобы избежать подобных проблем, мы должны использовать два условия. Они помогают точно указать, что вы ищете, чтобы избежать путаницы. Пример ниже показывает, как их использовать. Мы рассмотрим более многочисленные условия в разделе ниже.

Давайте расширим оригинальный код. Вы можете использовать столько операторов ElseIf, сколько захотите. Мы добавим еще несколько, чтобы учесть все наши классификации баллов.

Использование If Else

Утверждение Else используется, как ловушка для всех. Это в основном означает «если бы не было условий» или «все остальное». В предыдущем примере кода мы не включили оператор печати для метки сбоя. Мы можем добавить это, используя Else.

Так что, если это не один из других типов, то это провал.

Давайте напишем некоторый код с помощью наших примеров данных и распечатаем студента и его классификацию.

Результаты выглядят так: в столбце E — классификация баллов

Используя If And/If Or

В выражении If может быть несколько условий. Ключевые слова VBA And и Or позволяют использовать несколько условий.

Эти слова работают так же, как вы используете их на английском языке.

Давайте снова посмотрим на наши примеры данных. Теперь мы хотим напечатать всех студентов, которые набрали от 50 до 80 баллов.

Мы используем Аnd, чтобы добавить дополнительное условие. Код гласит: если оценка больше или равна 50 и меньше 75, напечатайте имя студента.

Вывести имя и фамилию в результаты:

  • Дмитрий Маренин
  • Олеся Клюева
  • Евгений Яшин

В нашем следующем примере мы хотим знать, кто из студентов сдавал историю или геометрию. Таким образом, в данном случае мы говорим, изучал ли студент «История» ИЛИ изучал ли он «Геометрия» (Ctrl+G).

  • Василий Кочин
  • Александр Грохотов
  • Дмитрий Маренин
  • Николай Куликов
  • Олеся Клюева
  • Наталия Теплых
  • Дмитрий Андреев

Использование нескольких таких условий часто является источником ошибок. Эмпирическое правило, которое нужно помнить, должно быть максимально простым.

Использование IF AND

And работает следующим образом:

Условие 1 Условие 2 Результат
ИСТИНА ИСТИНА ИСТИНА
ИСТИНА ЛОЖЬ ЛОЖЬ
ЛОЖЬ ИСТИНА ЛОЖЬ
ЛОЖЬ ЛОЖЬ ЛОЖЬ

Что вы заметите, так это то, что And верно только тогда, когда все условия выполняются.

Использование IF OR

Ключевое слово OR работает следующим образом

Условие 1 Условие 2 Результат
ИСТИНА ИСТИНА ИСТИНА
ИСТИНА ЛОЖЬ ИСТИНА
ЛОЖЬ ИСТИНА ИСТИНА
ЛОЖЬ ЛОЖЬ ЛОЖЬ

Что вы заметите, так это то, что OR ложно, только когда все условия ложны.

Смешивание And и Or может затруднить чтение кода и привести к ошибкам. Использование скобок может сделать условия более понятными.

Использование IF NOT

Также есть оператор NOT. Он возвращает противоположный результат условия.

Условие Результат
ИСТИНА ЛОЖЬ
ЛОЖЬ ИСТИНА

Следующие две строки кода эквивалентны.

Помещение условия в круглые скобки облегчает чтение кода

Распространенное использование Not — при проверке, был ли установлен объект. Возьмите Worksheet для примера. Здесь мы объявляем рабочий лист.

Мы хотим проверить действительность mySheet перед его использованием. Мы можем проверить, если это Nothing.

Нет способа проверить, является ли это чем-то, поскольку есть много разных способов, которым это может быть что-то. Поэтому мы используем NOT с Nothing.

Если вы находите это немного запутанным, вы можете использовать круглые скобки, как здесь

Функция IIF

VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто используете функцию If следующим образом:

= ЕСЛИ (F2 =»»,»», F1 / F2)

= If (условие, действие, если ИСТИНА, действие, если ЛОЖЬ).

VBA имеет функцию IIf, которая работает так же. Давайте посмотрим на примере. В следующем коде мы используем IIf для проверки значения переменной val. Если значение больше 10, мы печатаем ИСТИНА, в противном случае мы печатаем ЛОЖЬ.

В нашем следующем примере мы хотим распечатать «Удовлетворитеьно» или «Незачет» рядом с каждым студентом в зависимости от их баллов. В первом фрагменте кода мы будем использовать обычный оператор VBA If, чтобы сделать это.

В следующем фрагменте кода мы будем использовать функцию IIf. Код здесь намного аккуратнее.

Функция IIf очень полезна для простых случаев, когда вы имеете дело с двумя возможными вариантами.

Использование Nested IIf

Вы также можете вкладывать IIf-операторы, как в Excel. Это означает использование результата одного IIf с другим. Давайте добавим еще один тип результата в наши предыдущие примеры. Теперь мы хотим напечатать «Отлично», «Удовлетворительно» или «Незачетт» для каждого студента.

Используя обычный VBA, мы сделали бы это так

Используя вложенные IIfs, мы могли бы сделать это так

Использование вложенного IIf хорошо в простых случаях, подобных этому. Код прост для чтения и, следовательно, вряд ли вызовет ошибки.

Чего нужно остерегаться

Важно понимать, что функция IIf всегда оценивает как Истинную, так и Ложную части выражения независимо от условия.

В следующем примере мы хотим разделить по баллам, когда он не равен нулю. Если он равен нулю, мы хотим вернуть ноль.

Однако, когда отметки равны нулю, код выдаст ошибку «Делить на ноль». Это потому, что он оценивает как Истинные, так и Ложные утверждения. Здесь ложное утверждение, т.е. (60 / Marks), оценивается как ошибка, потому что отметки равны нулю.

Если мы используем нормальный оператор IF, он будет запускать только соответствующую строку.

Это также означает, что если у вас есть функции для ИСТИНА и ЛОЖЬ, то обе будут выполнены. Таким образом, IIF будет запускать обе функции, даже если он использует только одно возвращаемое значение. Например:

IF против IIf

В этом случае вы можете видеть, что IIf короче для написания и аккуратнее. Однако если условия усложняются, вам лучше использовать обычное выражение If. Недостатком IIf является то, что он недостаточно известен, поэтому другие пользователи могут не понимать его так же, как и код, написанный с помощью обычного оператора if.

Кроме того, как мы обсуждали в последнем разделе, IIF всегда оценивает части ИСТИНА и ЛОЖЬ, поэтому, если вы имеете дело с большим количеством данных, оператор IF будет быстрее.

Мое эмпирическое правило заключается в том, чтобы использовать IIf, когда он будет прост для чтения и не требует вызовов функций. Для более сложных случаев используйте обычный оператор If.

Использование Select Case

Оператор Select Case — это альтернативный способ написания статистики If с большим количеством ElseIf. Этот тип операторов вы найдете в большинстве популярных языков программирования, где он называется оператором Switch. Например, Java, C #, C ++ и Javascript имеют оператор switch.

Давайте возьмем наш пример DobClass сверху и перепишем его с помощью оператора Select Case.

Ниже приведен тот же код с использованием оператора Select Case. Главное, что вы заметите, это то, что мы используем “Case 85 to 100” rather than “marks >=85 And marks =85 And marks

Ответ на упражнение

Следующий код показывает, как выполнить вышеупомянутое упражнение.

Примечание: есть много способов выполнить задачу, поэтому не расстраивайтесь, если ваш код отличается.

Источник

Определение с помощью кода VBA Excel, что диапазон ячеек пуст, то есть, ни одна из ячеек диапазона (строки, столбца) не содержит отображаемого значения.

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

Определить в VBA Excel, что диапазон ячеек пуст, можно с помощью функции рабочего листа WorksheetFunction.CountA или свойства диапазона ячеек Range.Text.

Пример 1

Определение, что диапазон ячеек пуст, с помощью функции рабочего листа WorksheetFunction.CountA:

Sub Primer1()

    If WorksheetFunction.CountA(Range(«A1:L8»)) = 0 Then

        MsgBox «Диапазон ячеек ««A1:L8»» пуст»

    Else

        MsgBox «Диапазон ячеек ««A1:L8»» не пуст»

    End If

End Sub

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

Пример 2

Определение, что диапазон ячеек пуст, с помощью свойства Text объекта Range:

Sub Primer2()

    If Range(«A1:L8»).Text = «» Then

        MsgBox «Диапазон ячеек ««A1:L8»» пуст»

    Else

        MsgBox «Диапазон ячеек ««A1:L8»» не пуст»

    End If

End Sub

Свойство Text объекта Range возвратит пустую строку только в том случае, если все ячейки диапазона будут содержать пустые строки и (или) значение Empty. Если одна или более ячеек в диапазоне будут содержать пустую строку, возвращенную формулой, то код второго примера все-равно определит, что диапазон пуст.

Определение пустой строки

Определение пустой строки в VBA Excel с помощью свойства Range.Text:

Sub Primer3()

    If Rows(5).Text = «» Then

        MsgBox «Указанная строка пуста»

    Else

        MsgBox «Указанная строка не пуста»

    End If

End Sub

Данное определение пустой строки используется в коде для удаления пустых строк из таблицы.

Определение пустого столбца

Определение пустого столбца в VBA Excel с помощью свойства Range.Text:

Sub Primer4()

    If Columns(7).Text = «» Then

        MsgBox «Указанный столбец пуст»

    Else

        MsgBox «Указанный столбец не пуст»

    End If

End Sub

или

Sub Primer5()

    If Columns(«G»).Text = «» Then

        MsgBox «Указанный столбец пуст»

    Else

        MsgBox «Указанный столбец не пуст»

    End If

End Sub


Фразы для контекстного поиска: диапазон пустой, строка пустая, столбец пустой.


 

Подскажите как при помощи VBA определить наличие пустой ячейки (не заполненной = «» ;)  в диапазоне (например А1:С300) или ячейки с значением = 0 ?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Нашли, дальше что? Перебрать диапазон/массив и при нахождении пустой/нулевой выйти из цикла с сообщением.

 

Антон

Пользователь

Сообщений: 617
Регистрация: 01.01.1970

#3

28.01.2014 01:20:21

посредством перебора каждого значения массива и сравнением )

Код
'перебираем строки 
For i=1 to 300 
'перебираем столбцы 
For y=1 to 3 
If cells(i,y).Value="" then 
Msgbox("пустая ячейка") 
Exit for
End if 
If cells(i,y).Value=0 then 
Msgbox("нуль.")  
Exit for 
End if    
Next y   
Next i

Изменено: Антон28.01.2014 01:25:02

 

Да, если такие ячейки имеются вывести сообщение и прекратить дальнейшее выполнение макроса, если таких ячеек нет продолжить выполнение макроса.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#5

28.01.2014 01:28:51

Код
Sub Test()
Dim Rng As Range, rCell As Range
    Set Rng = Range("A1:C300")
    For Each rCell In Rng
        If IsEmpty(rCell) Or rCell = 0 Then
            MsgBox "Найдено в ячейке " & rCell.Address(0, 0), 64, "Для сведения"
            Exit For
        End If
    Next
End Sub 
 
 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#7

28.01.2014 02:01:36

Без цикла, но и без адресов:

Код
Sub Test2()
Dim Rng As Range
    Set Rng = Range("A1:C300")
    x = Application.WorksheetFunction.CountA(Rng)
    y = Application.WorksheetFunction.CountIf(Rng, 0)
    If Rng.Cells.Count <> x Then MsgBox "Есть пустые."
    If y > 0 Then MsgBox "Есть нули."
End Sub 
 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Я сам — дурнее всякого примера! …

 

Max.il

Пользователь

Сообщений: 64
Регистрация: 05.12.2018

Юрий М, Юрий, добрый вечер. Развивая тему, если нужно проверить несколько ячеек, к примеру А3, Т16 и Т22, если они пустые — залить эту ячейку красным цветом. Если в ней есть что-то , пропустить. Если во всех ячейках есть данные, то просто прекратить выполнение макроса без вывода сообщения.
Спасибо  

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

 

Max.il

Пользователь

Сообщений: 64
Регистрация: 05.12.2018

Юрий М,Нет, т.к. проверка должна осуществляться после макроса.  

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

УФ сработает и после макроса. А макрос написать не смогу: нет у меня файла, где имеются перечисленные Вами ячейки ))
Вы бы уточнили: три ячейки — это только для примера? А по факту? И как макрос должен понять, какие именно ячейки проверять? Где-то есть список этих ячеек?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#13

27.05.2019 23:32:23

Нет ответа…

Код
Dim rCell As Range
    For Each rCell In Range("A3, T16, T22")
        If rCell = "" Then
            rCell.Interior.ColorIndex = 3
        Else
            rCell.Interior.ColorIndex = xlNone
        End If
    Next
 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#14

27.05.2019 23:39:10

Цитата
Max.il написал:
к примеру
Код
Sub qq()
    Dim r As Range
    Set r = [a1:c3]
    On Error Resume Next
    r.SpecialCells(4).Interior.ColorIndex = 3
End Sub
 

Max.il

Пользователь

Сообщений: 64
Регистрация: 05.12.2018

RAN,  Юрий М, Мужчины, спасибо, что помогаете . Искренняя благодарность.  

 

Николай Китаев

Пользователь

Сообщений: 2
Регистрация: 01.01.1970

#16

17.12.2021 13:26:01

Цитата
написал:
Подскажите как при помощи VBA определить наличие пустой ячейки

Такая конструкция не работает: If cells(i,y).Value=»» then….

А так — должно работать:
If IsEmpty(cells(i,y).Value) = True Then ……., где К — переменная содержащая или несодержащая значение, или переменная, содержащая адрес ячейки Cell, которую проверяем.

Изменено: Николай Китаев17.12.2021 14:07:17

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Николай Китаев, с момента создания темы прошло почти 8 лет, а ТС был последний раз почти 2 года назад — в курсе?  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ничего страшного. Можно считать, что памятка для себя. Тем более проверка вида cells(i,y).Value=»» не работает.

 

БМВ

Модератор

Сообщений: 21376
Регистрация: 28.12.2016

Excel 2013, 2016

#19

17.12.2021 14:19:40

Цитата
Николай Китаев написал:
Тем более проверка вида cells(i,y).Value=»» не работает.

докажите.

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Если вас что-то не устраивает, то не нужно поднимать со дна старую тему, тем более, что спросить автора не получится — создайте свою и там всё подробно опишите и/или спросите

И тут гляньте:

VBA. UDF. Функция для проверки значения на строку нулевой длины «=»»»

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#21

17.12.2021 23:29:31

Цитата
Николай Китаев написал: If IsEmpty(cells(i,y).Value) = True Then ……., где К — переменная

И где К? )

Перейти к содержимому

Макрос проверки заполнения ячеек.

Периодически при создании различных макросов в VBA Excel возникает потребность  в том, чтобы алгоритм макроса самостоятельно определял, пуста ли ячейка или заполнена данными.

Далее приведем несколько простых макросов  для определения заполнения ячейки данными и разберем принцип их работы. Фрагменты этих макросов вы можете добывать в свой код для реализации проверки заполнения ячеек.

Рассмотрим несколько вариантов VBA алгоритмов:Макро VBA Excel

Алгоритм для строго определенной ячейки с применением её адреса.

Пример для ячейки с адресом B6:

  •     Private Sub CommandButton1_Click() ‘наименование алгоритма
  •      If IsEmpty(Range(«B6»)) = True Then  ‘условие, если ячейка пустая, то
  •      MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
  •      Else  ‘в противном случае
  •      MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
  •      End If  ‘конец блока «если»
  •     End Sub ‘конец алгоритма

Алгоритм для выделенной (активной)  ячейки :

    • Private Sub CommandButton1_Click() ‘наименование алгоритма    
    • If IsEmpty(ActiveCell) = True Then ‘условие, если активная ячейка (ActiveCell)  пустая, то
    •      MsgBox («В ячейке нет данных»)  ‘вывод сообщения, что в ячейке нет данных
    •      Else  ‘в противном случае
    •      MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
    •      End If  ‘конец блока «если»
    •     End Sub ‘конец алгоритма

    Еще один способ определения в примере для активной ячейки, но можно использовать  и для конкретной ячейки с адресом.

      • Private Sub CommandButton1_Click() ‘наименование алгоритма    
      • If Len(ActiveCell) Then ‘если активная ячейка заполнена данными (имеет объем информации)
      • MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
      • Else  ‘в противном случае
      • MsgBox («Ячейка пустая») ‘вывод сообщения, что в ячейке нет данных
      • End If  ‘конец блока «если»
      •  End Sub  ‘конец алгоритма

      6 ответов

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

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

      Kano
      30 май 2012, в 07:17

      Поделиться

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

      Sharunas Bielskis
      27 июнь 2016, в 13:26

      Поделиться

      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`
      

      Уточнение будет предоставлено немного позже (сейчас я работаю)

      DeerSpotter
      30 июль 2015, в 15:38

      Поделиться

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

      Function IsRangeEmpty(ByVal rng As Range) As Boolean
      
          '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
      
              Dim arr As Variant
              arr = area.value
      
              For i = LBound(arr, 2) To UBound(arr, 2)        'columns
                  For j = LBound(arr, 1) To UBound(arr, 1)    'rows
      
                      'if cell is not empty then
                      If Len(Trim(arr(j, i))) > 0 Then
                          IsRangeEmpty = False
                          Exit Function
                      End If
      
                  Next j
              Next i
      
          Next area
      
          IsRangeEmpty = True
      
      End Function
      

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

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

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

      Marcucciboy2
      07 нояб. 2018, в 20:11

      Поделиться

      Dim cel As Range, hasNoData As Boolean
      
          hasNoData = True
          For Each cel In Selection
              hasNoData = hasNoData And IsEmpty(cel)
          Next
      

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

      TomM
      04 май 2018, в 14:35

      Поделиться

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

      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
      

      DJK
      04 сен. 2017, в 02:27

      Поделиться

      Ещё вопросы

      • 0Определить конструктор класса внутри пространства имен
      • 1Могу ли я использовать сигнализатор 2.x с .net 4.0, если я использую Microsoft.Bcl? (Обновление с 1.x на .NET 4.0)
      • 0Функция PDO MySql для приема нескольких параметров
      • 0Phalcon PHP: проверить уникальность на натуральном ключе?
      • 0Преобразовать случайный код повышения в объект класса
      • 1Альфа анимация не работает
      • 0как вставить несколько запросов в один запрос, чтобы получить результаты
      • 1MemoryError с большим .txt файлом Python при подсчете и ранжировании слов
      • 0Передача функции в качестве аргумента другой функции
      • 1Доступ к отдельным объектам дочернего элемента в расширяемом списке
      • 0ion-nav-back-button не работает с представлениями с параметрами
      • 0Не уверен, как исключить числовые значения из моего вывода
      • 1метод repaint () не работает должным образом
      • 1Показывать постоянный рекламный баннер на всех мероприятиях
      • 0распечатать массив с правильным отступом
      • 1Как использовать файл kml на mapView в Android
      • 1Пользовательский Razor ForEach View
      • 0Ошибка синтаксиса SQL при триггере
      • 0Как вызвать wcf webservice json, используя jquery?
      • 1Имитация тупика с использованием многомерного массива
      • 1Неправильная конфигурация отправки для модулей в Google App Engine
      • 0Событие Resize вызывается несколько раз
      • 0Соединение успешно загружается на одном экране, появляется ошибка на втором экране с практически одинаковым кодом
      • 1Подключение к удаленному рабочему столу с помощью pywinauto
      • 0Плавающие меню, мешающие моему плавающему контенту
      • 1Java (вертикальный) изменить размер случайных пробелов
      • 1Радио кнопки с дат.гуи
      • 1JavaScript упрощает цикл
      • 1Можно выбрать 1-й элемент, но не весь список узлов в JavaScript
      • 0Отображать поля, когда пользователь выбирает конкретное значение из поля со списком — Проблема логики проверки
      • 0EntityNotFoundException — Spring mvc не может запросить объект со свойством абстрактного класса, но может запросить объект свойства. И только на определенные наследства
      • 0Функция переключения jquery и установить cookie
      • 0MySQL: обновление значения идентификатора PK в другой таблице
      • 0переменная передается функции, прочитанной console.log, но не другой переменной
      • 1Как вставить массив в массив? (двумерный массив javascript codeigniter)
      • 0Не могу прочитать файл волнового фронта
      • 1firebird: код ошибки SQL = -504 Неверная ссылка на курсор
      • 0Проблема кодирования HTML, решение с использованием регулярных выражений?
      • 1SQL Azure и JAVA не хотят выполнять запрос
      • 1Как переместить значения vAxis в середине блоков
      • 0обоснование не работает должным образом
      • 0static_cast от char к enum, присваивающему неправильное значение
      • 0как добавить многоточие в столбце таблицы
      • 0Невозможно сохранить URL-ссылку в MySQL, используя JSON и PHP
      • 1Как включить всплывающее окно для аутентификации для электрона?
      • 1Как узнать, что ключи объекта являются строкой или массивом в JavaScript
      • 0Выберите и отобразите строки от 1 до 7
      • 1Класс объекта с виртуальными членами или нет?
      • 1Как VS intellisense узнает о свойствах анонимного класса во время компиляции?
      • 1Android — Как нарисовать письмо в определенной точке?

      Понравилась статья? Поделить с друзьями:
    • Excel месяц год текстом
    • Excel миф если выбрана ячейка
    • Excel месяц выделять цветом
    • Excel миф если в ячейке то
    • Excel миф добавить строки