Автор Тема: Excel VBA Макросы: Условие на проверку наличия значений в диапазоне.  (Прочитано 211 раз)

Оффлайн Alejo

  • Посетитель форума
  • Сообщений: 7
Есть макрос, который удаляет значения в диапазоне (формулы остаются), но он не работает при отсутствии значений. Какое условие можно добавить для правильной работы макроса?

Макрос
Sub Clearing()
Dim E As String

        Application.ScreenUpdating = False 'отключение обновления экрана
        Application.Application.EnableEvents = False 'отключение обработки событий
        Application.DisplayAlerts = False 'отключение запросов программы
        Application.Calculation = xlManual 'отключение автоматического расчета ячеек
        Application.DisplayStatusBar = False 'отключение отображения значений в статусной строке

Worksheets("Вагжановская").Activate
    E = Cells.Find("end", , , , xlByRows, xlPrevious).Row
    Range(Cells(56, 4), Cells(E - 1, 27)).SpecialCells(xlCellTypeConstants, 23).ClearContents
Worksheets("Пролетарская").Activate
    E = Cells.Find("end", , , , xlByRows, xlPrevious).Row
    Range(Cells(56, 4), Cells(E - 1, 27)).SpecialCells(xlCellTypeConstants, 23).ClearContents
Worksheets("№1").Activate
    E = Cells.Find("end", , , , xlByRows, xlPrevious).Row
    Range(Cells(56, 4), Cells(E - 1, 27)).SpecialCells(xlCellTypeConstants, 23).ClearContents

        Application.DisplayStatusBar = True 'включение отображения значений в статусной строке
        Application.Calculation = xlAutomatic 'включение автоматического расчета ячеек
        Application.Application.EnableEvents = True 'включение обработки событий
        Application.DisplayAlerts = True 'включение запросов программы
        Application.ScreenUpdating = True 'включение обновления экрана
End Sub

Оффлайн Администратор

  • Administrator
  • Сообщений: 1686
В макросе две процедуры. Поместите их внутрь одного модуля.
Запускайте только процедуру "Clearing".

Макрос
Sub Clearing()

    ' Отключение событий.
    Application.ScreenUpdating = False 'отключение обновления экрана
    Application.Application.EnableEvents = False 'отключение обработки событий
    Application.DisplayAlerts = False 'отключение запросов программы
    Application.Calculation = xlManual 'отключение автоматического расчета ячеек
    Application.DisplayStatusBar = False 'отключение отображения значений в статусной строке
   
    '1. Удаление константных значений.
    УдалитьЗначения "Вагжановская"
    УдалитьЗначения "Пролетарская"
    УдалитьЗначения "№1"
   
    ' Включение событий.
    Application.DisplayStatusBar = True 'включение отображения значений в статусной строке
    Application.Calculation = xlAutomatic 'включение автоматического расчета ячеек
    Application.EnableEvents = True 'включение обработки событий
    Application.DisplayAlerts = True 'включение запросов программы
    Application.ScreenUpdating = True 'включение обновления экрана
   
End Sub

Private Sub УдалитьЗначения(ИмяЛиста As String)

    Dim sh As Worksheet, rng As Range
    Dim lr As Long
   
   
    '1. Присваиваем листу имя "sh". Далее в коде будем обращаться к листу по этому имени.
        ' Может быть так будет удобнее писать и читать код.
    Set sh = Worksheets(ИмяЛиста)
   
    '2. Поиск низа данных по слову "end".
    lr = sh.Cells.Find(What:="end", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    lr = lr - 1
       
    '3. Присваиваем имя "rng" фрагментам, в которых находятся константы.
        ' Если констант нет, то произойдёт run-ошибка, поэтому строка кода
        ' помещается в перехватчик ошибок.
    On Error Resume Next
    Set rng = sh.Range(sh.Cells(56, 4), sh.Cells(lr, 27)).SpecialCells(xlCellTypeConstants, 23)
    On Error GoTo 0
   
    '4. Очистка ячеек, в которых константы.
        ' Если констант нет, то в переменной "rng" будет слово "Nothing".
    If Not rng Is Nothing Then
        rng.ClearContents
    End If
   
End Sub

Оффлайн Alejo

  • Посетитель форума
  • Сообщений: 7