Макрос для пустых ячеек excel

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

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

Периодически при создании различных макросов в 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  ‘конец алгоритма

      Определение с помощью кода 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


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


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

      Макрос для объединения пустых ячеек в столбце

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

      Отчет по магазинам.

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

      Необходимо объединить пустые ячейки в столбце B в каждой группе таким образом, чтобы каждая объединенная ячейка получила соответственное название города в своем значении. Тогда отчет будет читабельным и удобным для визуального анализа данных. Выполнение данной задачи вручную потребует много времени и сил, что повышает вероятность возникновения ошибок в структуре таблицы. Поэтому рационально написать макрос, который существенно облегчит процесс преобразования структуры таблицы и предотвратит возникновения ошибок, вызванных человеческим фактором. Стоит обратить внимание что в группах разное количество пустых ячеек.

      Откроем редактор Visual Basic (ALT+F11):

      Visual Basic.

      И создадим новый модуль с помощью инструмента в редакторе: «Insert»-«Module». И запишем в него VBA-код макроса:

      Sub JoinEmpty()
      Dim i As Long
      Dim pusto As Long
      pusto = 0
      For i = Selection.Rows.Count To 1 Step -1
        If Selection.Cells(i, 1) = "" Then
        pusto = pusto + 1
        ElseIf pusto > 0 Then
        ActiveSheet.Range(Selection.Cells(i, 1), Selection.Cells(i + pusto, 1)).Merge
        Selection.Cells(i, 1).VerticalAlignment = xlVAlignCenter
        pusto = 0
        End If
      Next
      End Sub

      Код макроса.

      Теперь если нам нужно автоматически объединять диапазоны групп магазинов, чтобы избавиться от пустых ячеек, выделите диапазон B2:B17. А потом запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«JoinEmpty»-«Выполнить». Ячейки объединяться в соответствии со всеми требованиями пользователя, а результат выполнения макроса показан на рисунке:

      Результат работы макроса.

      В коде определены 2 переменные:

      1. i – хранит в себе количество циклов соответственное количеству строк в выделенном диапазоне.
      2. pusto – хранит в себе количество пустых ячеек.

      Сначала для второй переменной pusto присваиваем число 0 в качестве первого значения. Далее циклом проходим по всех ячейках в первом столбце выделенного диапазона. Каждую ячейку проверяем, является ли она пустой. Если да тогда увеличиваем числовое значение в переменной pusto на 1. А если же ячейка не пустая и в переменной pusto значение больше чем 0, объединяем все ячейки, которые находятся ниже (с ней же включительно). Количество объединяемых ячеек, расположенных ниже зависит от текущего числа в переменной pusto

      В конце цикла, благодаря установленному свойству VerticalAlignment, включаем выравнивание текста в центре по вертикали для текущей объединенной ячейки. Далее снова обнуляем значение для переменной pusto, которая отвечает за количество пустых ячеек в цикле.

      Стоит отметить, что в этой версии макроса если мы выделим много столбцов, содержащих пустые ячейки, то после запуска макроса будут объединены ячейки только в первом столбце. Как изменить макрос, чтобы он был применим для нескольких столбцов рассмотрим ниже.

      

      Как макросом быстро объединить все пустые в таблице Excel

      Но что делать если у нас таблица содержит не 1, а множество таких столбцов? Как сделать так чтобы этот макрос можно было применить для всех столбцов целой таблицы одновременно? Для примера изменим сначала внешний вид и структуру исходной таблицы:

      Исходные данные.

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

      Dim j As Long

      Далее перед циклом, проходящим по всем выделенным ячейкам в первом столбце, введем строку с кодом начала нового цикла для прохода по всем столбцам выделенного диапазона:

      For j = 1 To Selection.Columns.Count

      В конце кода не забудем добавить конец нового цикла:

      Next

      Теперь следует внести изменения для ссылок аргументов внутри нового цикла. Во всех экземплярах объекта Cells, во втором аргументе вместо числа 1 введем переменную j:

      Selection.Cells(i,j)

      Полная версия измененного кода выглядит так:

      Sub JoinEmpty()
      Dim i As Long
      Dim pusto As Long
      Dim j As Long
      pusto = 0
      For j = 1 To Selection.Columns.Count
        For i = Selection.Rows.Count To 1 Step -1
          If Selection.Cells(i, j) = "" Then
          pusto = pusto + 1
          ElseIf pusto > 0 Then
          ActiveSheet.Range(Selection.Cells(i, j), Selection.Cells(i + pusto, j)).Merge
          Selection.Cells(i, j).VerticalAlignment = xlVAlignCenter
          pusto = 0
          End If
        Next
      Next
      End Sub

      Теперь достаточно выделить целую таблицу и запустить новую версию макроса:

      Пример макроса.

      Как видите теперь макрос можно применять одновременно для нескольких столбцов.

      Читайте также: макрос для объединения пустых ячеек в строках таблицы Excel

      Внимание! Если первая ячейка (в верхнем левом углу) выделенного диапазона – пуста, то она не будет объединена, а также не будут объединены пустые ячейки, находящиеся непосредственно под ней.

      Be it for troubleshooting formula errors or data integrity, you might find yourself trying to identify those cells going through the entire workbook. In this article we’re going to show to find in Excel if cell is blank using VBA and automate this process.

      How to find in Excel if cell is blank using VBA

      VBA has some predefined types for the cells that contains special values. These can be accessed with the SpecialCells method. The SpecialCells method uses two arguments to specify the cells; Type and Value. Using a combination of these two arguments you can easily access the cell or range type you desired. Below is a list of values both arguments can get.

      Type

      • xlCellTypeAllFormatConditions. Cells of any format
      • xlCellTypeAllValidation. Cells having validation criteria
      • xlCellTypeBlanks. Empty cells
      • xlCellTypeComments. Cells containing comments
      • xlCellTypeConstants. Cells containing constants
      • xlCellTypeFormulas. Cells containing formulas
      • xlCellTypeLastCell. The last cell in the selected range. Note that this will include empty cells that have had any cells that changed from their default format.
      • xlCellTypeSameFormatConditions. Cells having the same format
      • xlCellTypeSameValidation. Cells having the same validation criteria
      • xlCellTypeVisible. All visible cells

      Value

      • xlErrors
      • xlLogical
      • xlNumbers
      • xlTextValues

      To find the blank cells using VBA, using xlCellTypeBlanks constant for the type argument is enough. The value argument can be omitted.

      An important point in here is that the Selection.SpecialCells(xlCellTypeBlanks).Cells returns an array of cells. So, before returning any information, we need to step through each cell in the array. A For Each…Loop is perfect for arrays consisting of objects. We designed our code to return the address of all blank cells in a Message Box.

      To be able to run codes, you need to add a module into the workbook or the add-in file. Copy and paste the code into the module to run it. The main advantage of the module method is that it allows saving the code in the file, so that it can be used again later. Furthermore, the subroutines in modules can be used by icons in the menu ribbons or keyboard shortcuts. Remember to save your file in either XLSM or XLAM format to save your VBA code.

      Find blank cells

      Sub FindBlankCells()
      
          Dim rng As Range, message As String
      
          For Each rng In Selection.SpecialCells(xlCellTypeBlanks).Cells
      
              message = message & Chr(10) & rng.Address 'Chr(10) is for new line
      
          Next
      
          MsgBox message, vbOKOnly, "Empty Cells" 'vbOKOnly is the type of the message box
      
      End Sub

      Заполнение пустых ячеек значениями из соседних ячеек

      Как известно, для полноценной работы с данными (фильтрации, сортировки, подведения итогов и т.д.) нужен непрерывный список, т.е. таблица без разрывов (пустых строк и ячеек — по возможности). На практике же часто мы имеем как раз таблицы с пропущенными пустыми ячейками — например после копирования результатов сводных таблиц или выгрузок в Excel из внешних программ. Таким образом, возникает необходимость заполнить пустые ячейки таблицы значениями из верхних ячеек, то бишь…

      В общем случае, может возникнуть необходимость делать такое заполнение не только вниз, но и вверх, вправо и т.д. Давайте рассмотрим несколько способов реализовать такое.

      Способ 1. Без макросов

      Выделяем диапазон ячеек в первом столбце, который надо заполнить (в нашем примере, это A1:A12).

      Нажимаем клавишу F5 и затем кнопку Выделить (Special) и в появившемся окне выбираем Выделить пустые ячейки (Blanks):

      fill-blanks3.png

      Не снимая выделения, вводим в первую ячейку знак «равно» и щелкаем по предыдущей ячейке или жмём стрелку вверх (т.е. создаем ссылку на предыдущую ячейку, другими словами):

      fill-blanks4.png

      И, наконец, чтобы ввести эту формулу сразу во все выделенные (пустые) ячейки нажимаем Ctrl + Enter вместо обычного Enter. И все! Просто и красиво.

      В качестве завершающего мазка я советовал бы заменить все созданные формулы на значения, ибо при сортировке или добавлении/удалении строк корректность формул может быть нарушена. Выделите все ячейки в первом столбце, скопируйте и тут же вставьте обратно с помощью Специальной вставки (Paste Special) в контекстом меню, выбрав параметр Значения (Values). Так будет совсем хорошо.

      Способ 2. Заполнение пустых ячеек макросом

      Если подобную операцию вам приходится делать часто, то имеем смысл сделать для неё отдельный макрос, чтобы не повторять всю вышеперечисленную цепочку действий вручную. Для этого жмём Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), чтобы открыть редактор VBA, затем вставляем туда новый пустой модуль через меню Insert — Module и копируем или вводим туда вот такой короткий код:

      Sub Fill_Blanks()
          For Each cell In Selection
              If IsEmpty(cell) Then cell.Value = cell.Offset(-1, 0).Value
          Next cell
      End Sub
      

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

      Для удобства, можно назначить этому макросу сочетание клавиш или даже поместить его в Личную Книгу Макросов (Personal Macro Workbook), чтобы этот макрос был доступен при работе в любом вашем файле Excel.

      Способ 3. Power Query

      Power Query — это очень мощная бесплатная надстройка для Excel от Microsoft, которая может делать с данными почти всё, что угодно — в том числе, легко может решить и нашу задачу по заполнению пустых ячеек в таблице. У этого способа два основных преимущества:

      • Если данных много, то ручной способ с формулами или макросы могут заметно тормозить. Power Query сделает всё гораздо шустрее.
      • При изменении исходных данных достаточно будет просто обновить запрос Power Query. В случае использования первых двух способов — всё делать заново.

      Для загрузки нашего диапазона с данными в Power Query ему нужно либо дать имя (через вкладку Формулы — Диспетчер имен), либо превратить в «умную» таблицу командой Главная — Форматировать как таблицу (Home — Format as Table) или сочетанием клавиш Ctrl+T:

      Превращаем таблицу в умную

      После этого на вкладке Данные (Data) нажмем на кнопку Из таблицы / диапазона (From Table/Range). Если у вас Excel 2010-2013 и Power Query установлена как отдельная надстройка, то вкладка будет называться, соответственно, Power Query.

      В открывшемся редакторе запросов выделим столбец (или несколько столбцов, удерживая Ctrl) и на вкладке Преобразование выберем команду Заполнить — Заполнить вниз (Transform — Fill — Fill Down):

      Заполнение пустых ячеек в Power Query

      Вот и всё :) Осталось готовую таблицу выгрузить обратно на лист Excel командой Главная — Закрыть и загрузить — Закрыть и загрузить в… (Home — Close&Load — Close&Load to…)

      В дальнейшем, при изменении исходной таблицы, можно просто обновлять запрос правой кнопкой мыши или на вкладке Данные — Обновить всё (Data — Refresh All).

      Ссылки по теме

      • Объединение двух столбцов с данными
      • Быстрое выделение всех ячеек с формулами или константами
      • Быстрое заполнение пустых ячеек макросом из надстройки PLEX

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