Перед сохранением события, нужна помощь для зацикливания двух ячеек одновременно
Я пытаюсь сделать событие до сохранения, не позволяя пользователям сохранять, если одна из двух указанных ячеек пуста. Что мне удалось сделать, так это связать столбец 13 (M) и ячейку A4.
То, что я хотел бы сделать, это применить событие к комбинации двух диапазонов и строк, A4-A19 и M4-M19. Таким образом: Если A4 не пусто, а M4 пусто, появляется сообщение, которое блокирует сохранение и т. Д.A5-M5, A6-M6... до A19-M19. Если обе соответствующие ячейки пусты одновременно, сохранение должно быть возможным.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim i As Integer, MyWb As Object
i = 13
Set MyWb = ThisWorkbook.Sheets("Planning").Cells
Do While MyWb(4, i).Value <> ""
i = i + 1
Loop
If i = 13 Then
If ThisWorkbook.Sheets("Planning").Range("A4") <> "" Then
MsgBox ("You will need to enter topics before saving"), vbCritical
Cancel = True
End If
End If
End Sub
Основываясь на коде Wolfie, мне удалось получить то, что я хотел, просто добавив столбец If not isempty для столбца A и заменив 19 вместо 13.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim plansht As Worksheet
Set plansht = ThisWorkbook.Sheets("Planning")
' Loop over rows
Dim rw As Integer
For rw = 4 To 19
' Test if both the A and M column in row "rw" are blank
If Not IsEmpty(plansht.Range("A" & rw)) And plansht.Range("M" & rw).Value = "" Then
MsgBox ("You will need to enter topics before saving"), vbCritical
Cancel = True
End If
Next rw
End Sub
3 ответа
Вы можете перебрать строки и просто проверить A
а также M
столбцы, чтобы проверить, являются ли они оба пустыми для данной строки. Посмотрите код ниже...
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim plansht as Worksheet
Set plansht = ThisWorkbook.Sheets("Planning")
' Loop over rows
Dim rw as Integer
For rw = 4 to 13
' Test if both the A and M column in row "rw" are blank
If plansht.Range("A" & rw).Value = "" And plansht.Range("M" & rw).Value = "" Then
MsgBox ("You will need to enter topics before saving"), vbCritical
Cancel = True
End If
Next rw
End Sub
Редактировать:
Ваше редактирование предполагает, что вы хотите, чтобы различные комбинации ячеек были пустыми. Вот несколько примеров If
заявление для разных результатов
' If BOTH are empty
If plansht.Range("A" & rw).Value = "" And plansht.Range("M" & rw).Value = "" Then ...
If IsEmpty(plansht.Range("A" & rw)) And IsEmpty(plansht.Range("M" & rw)) Then ...
' If EITHER is empty
If plansht.Range("A" & rw).Value = "" OR plansht.Range("M" & rw).Value = "" Then ...
If IsEmpty(plansht.Range("A" & rw)) Or IsEmpty(plansht.Range("M" & rw)) Then ...
' If BOTH are NOT empty
If plansht.Range("A" & rw).Value <> "" And plansht.Range("M" & rw).Value <> "" Then ...
If Not IsEmpty(plansht.Range("A" & rw)) And Not IsEmpty(plansht.Range("M" & rw)) Then ...
Обратите внимание, что когда вы начинаете вводить Not
при множественных условиях логика может быстро стать трудной для интерпретации. Вы можете использовать скобки для группировки условий с Not
, но вы понимаете, что такие вещи логически означают одно и то же:
If Not IsEmpty(plansht.Range("A" & rw)) And Not IsEmpty(plansht.Range("M" & rw)) Then ...
If Not (IsEmpty(plansht.Range("A" & rw)) Or IsEmpty(plansht.Range("M" & rw))) Then ...
Попробуй это:
For i = 4 to 19
If ThisWorkbook.Sheets("Planning").Range("A" & i) <> "" AND _
ThisWorkbook.Sheets("Planning").Range("M" & i) <> "" Then
MsgBox("Hey bro you didn't wrote properly on line " & i)
Cancel = True
Next i
Попробуйте это:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Const FIRST_ROW as integer = 4
Const LAST_ROW as integer = 19
Const ColA As Integer = 4
Const ColM as integer = 13
Dim MyWb As Worksheet
Dim CurRow as Integer
Set MyWb = ThisWorkbook.Sheets("Planning")
For CurRow = FIRST_ROW to LAST_ROW
If len(mywb.cells(CurRow, ColA)) = 0 and len(mywb.cells(CurRow, ColM)) = 0 then
MsgBox ("You will need to enter topics before saving"), vbCritical
Cancel = True
Exit For
End If
Next
End Sub
Непроверенный код (я никогда не смогу вспомнить, является ли он (Row,Col) или (Col,Row)), но я думаю, что вы получите то, что вам нужно. Это прервет сохранение на первой паре, где они оба пустые.
Если это работает, вы можете получить фантазию и выделить пустые пары, удалить выделение для пар OK (если они были выделены ранее), обработав все пары и удалив Exit For
и предоставление одного сообщения об ошибке, что все выделенные должны быть рассмотрены.
Мне сказали, что Len(string) = 0
это более быстрый способ определить, что строка является нулевой, чем string = vbNullString
, Нет никаких гарантий относительно пригодности к цели, но это то, что я узнал.