2017-02-21 38 views
3

Я пытаюсь выполнить событие beforesave, не позволяя пользователям сохранять, если одна из двух заданных ячеек пуста. То, что мне удалось сделать до сих пор, - это соединение столбца 13 (M) и ячейки A4.перед сохранением события, нужна помощь для циклизации двух ячеек в то же время

Что бы я хотел сделать, это применить событие к комбинации из двух диапазонов и строк, A4-A19 и M4-M19. Таким образом: если A4 не пуст, а M4 пуст, появляется msgbox и блокирует сохранение и т. Д. 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, я сумел получить то, что я хотел, просто добавив Если не IsEmpty для столбца и замены 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 
+0

Код, который вы создали из моих проверок ответ: «Если Ai не пусто и Ми пусто, то ... ", обратите внимание, что' Не' применяется только к первому условию перед 'И'! Я не уверен, что это то, чего ты хочешь? – Wolfie

+0

да, это именно то, что я хотел, когда я получил ваши первые ответы, я понял, что мой первоначальный запрос не был прав ... на самом деле я хотел именно такого поведения: если A не пусто, а M пусто, тогда ..... ..:) – thom80

+0

Ну ладно, спасибо за помощь, я отредактировал свой ответ для некоторых заметок об использовании логических операций :) – Wolfie

ответ

0

Вы можете цикл по строкам, а просто проверить 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 

Edit:

Ваша правка предложил вы хотите несколько различных комбинаций ячеек порожняком. Вот некоторые примеры 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 ... 
+0

Я только что понял, что мое описание было неправильным, что я пытаюсь сделать, это наоборот. Я отредактировал описание. – thom80

+0

Для того, чтобы быть пустым (вместо * both *), просто используйте 'Or' вместо' And'! :) – Wolfie

+0

Спасибо, это правда :) – thom80

0

Дайте этому попытку:

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

+0

Это работает, но я понял, что мое описание ошибочно ... Я отредактирую его. – thom80

+0

Вы правы, это «Ячейки (строки, столбцы)», легко запоминающиеся, потому что это противоположность «Диапазон» ;-) Вы также можете ссылаться в «Ячейках» на букву столбца, поэтому вместо 'ColA' и 'ColM' вы можете просто использовать' 'A' 'и' 'M" ':) – Wolfie

1

Попробуйте это:

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 
+0

' Для 1 = от 4 до 19', вероятно, должно быть 'For i = от 4 до 19'. Опечатки - это весело! :) – FreeMan

+0

Спасибо за эту опечатку :) –

 Смежные вопросы

  • Нет связанных вопросов^_^