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

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

Другие вопросы по тегам