#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
событию, но это выходит за рамки данного вопроса, поскольку он будет выполняться только при изменении одной ячейки.