Макрос Excel проверяет, пуста ли ячейка, и выполняет поиск определенного слова в столбце

#excel #excel-formula #is-empty

Вопрос:

Парень, я новичок в языке VBA, и у меня есть вопрос, который нужно решить.

Как создать макроскрипт, чтобы проверить, являются ли КАКИЕ-либо строки столбца B входным словом «C», А ЛЮБЫЕ строки столбца C пустыми, затем он вызовет выделение этой строки цветом и вызовет окно сообщения, чтобы напомнить пользователю об исправлении.

Кроме того, в столбце D используется формула и метод «ячейка за ячейкой» для проверки вышеуказанного требования.

 =IF(ISBLANK(B4),"",IF(OR(B4="C",B4="O"),IF(AND(B4="C", ISBLANK(C4)),"WARNING: Case Closed! Please Write Down Resolution!",""),"ERROR: Invalid Value - Status! Please Input The Right Value!"))
 

Например, строка 4 соответствует требованиям и затронута.

Есть ли способ сделать это? Пожалуйста, помогите. Спасибо.

Рис


ОБНОВЛЕНИЕ:Спасибо Variatus!

Когда я сохраняю файл, он запрашивает это окно сообщения. Что я могу сделать? Спасибо.

Макроэкран

экран

Ошибка

ошибка

Комментарии:

1. Добавив макрос в свою книгу, теперь он должен быть сохранен в формате XLSM.Если вы нажмете «Да» в ответ на отправленное вами сообщение, код не будет сохранен, и, следовательно, его функциональность будет потеряна. Нажмите кнопку Сохранить и сохраните книгу с включенным макросом .

Ответ №1:

При нормальных обстоятельствах вас попросили бы проявить больше собственных усилий, прежде чем получать помощь на этом форуме, в том числе и от меня. Но, по-видимому, обстоятельства ненормальны. Итак, поехали. Вставьте эту процедуру в стандартный модуль кода (по умолчанию его имя будет вариантом Module1).

 Option Explicit

Sub MarkErrors()
    ' 283
    
    Dim Spike()         As String
    Dim i               As Long                 ' index of Spike
    Dim Rl              As Long                 ' last used row
    Dim R               As Long                 ' loop counter: rows

    Application.ScreenUpdating = False
    With Sheet1                                 ' this is the sheet's CodeName (change to suit)
        .UsedRange.Interior.Pattern = xlNone    ' remove all existing highlights
        Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
        ReDim Spike(1 To Rl)
        For R = 2 To Rl
            If Trim(.Cells(R, "B").Value) = "C" Then
                If IsEmpty(.Cells(R, "C")) Then
                    .Range(.Cells(R, "A"), .Cells(R, "D")).Interior.Color = vbYellow
                    i = i   1
                    Spike(i) = "Row " amp; R
                End If
            End If
        Next R
    End With
    Application.ScreenUpdating = True
    
    If i Then
        ReDim Preserve Spike(1 To i)
        MsgBox "Status errors were found in the following entries:-" amp; vbCr amp; _
               Join(Spike, "," amp; vbCr), vbInformation, "Corrections required"
    End If
End Sub
 

Обратите внимание на указанный рабочий лист Sheet1 . Это кодовое имя, и оно используется по умолчанию. Excel создаст лист с таким именем при создании книги. Кодовое имя не меняется, когда пользователь изменяет имя вкладки, но вы можете изменить его в редакторе VB. Это (Name) свойство рабочего листа.

Установите процедуру, описанную ниже, в кодовом листе Sheet1 (не стандартный кодовый модуль и, следовательно, не тот, в котором вы установили приведенный выше код. Этот модуль создается Excel для каждого листа в каждой книге. Используйте существующий.

 Private Sub Worksheet_Activate()
    ' 283
    MarkErrors
End Sub
 

Это процедура проведения мероприятий. Он будет запускаться автоматически всякий Sheet1 раз, когда он активирован (выбран). Таким образом, при нормальных обстоятельствах вам никогда не понадобится запускать первую процедуру вручную. Но я уже говорил об обстоятельствах. Они не всегда нормальны. 🙂

Комментарии:

1. Спасибо за вашу большую помощь. Но можно ли сделать это автоматизированным? И теперь мне нужно вручную запускать макрос каждый раз, чтобы выполнить его. Спасибо.

2. Макрос MarkErrors будет запускаться автоматически всякий раз, когда вы переключаетесь на просмотр другого рабочего листа и обратно. Если в вашей книге есть только один лист, добавьте Workbook_Open процедуру события в ThisWorkbook модуль и вызовите процедуру оттуда (точно так же, как Worksheet_Activate процедура, но с другим именем в другом модуле). Вы также можете привязать процесс к Worksheet_Change событию, но это выходит за рамки данного вопроса, поскольку он будет выполняться только при изменении одной ячейки.