2016-01-20 40 views
0

謝謝大家。如果我嘗試將一個或多個指定單元保留爲空白,我使用以下代碼來獲取彈出錯誤消息。但是,當我返回並填充所有指定的空白單元格,然後保存時,仍然收到錯誤消息。我哪裏錯了?試圖找到代碼來強制用戶不要讓細胞無人填充

Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Dim Cell As Range 
Dim flag As Boolean 
flag = False 
If Cells(1, 1) = "" Then flag = True 
For Each Cell In Range("C9:C14") 
If Cell = "" Then 
flag = True 
Exit For 
End If 
Next Cell 
For Each Cell In Range("C18:C25") 
If Cell = "" Then 
flag = True 
Exit For 
End If 
Next Cell 
For Each Cell In Range("C30:E35") 
If Cell = "" Then 
flag = True 
    Exit For 
End If 
Next Cell 
Cancel = flag 
If flag Then MsgBox "error message" 
End Sub 
+0

給你一個開始......首先你需要決定策略:A)用戶總是顯示當前狀態(不完整/完整+錯誤總和/完整+正確)或B)信息會在離開此表單時顯示,或者C)應該在結算單上顯示(有或沒有保存)...從這取決於您選擇實施該檢查的事件觸發器 – MikeD

+0

一種簡單的方法,'A2 = IF(COUNT (A3:A7)<> 5, 「未完成」,SUM(A3:A7))' – Davesexcel

回答

0

這裏有兩個小的功能檢查,如果「範圍」包含任何空單元格,並且如果「一個範圍」的總和等於總結「另一範圍」的。我說這有點抽象,因爲你的範圍可能在明天或不同的位置更大,你可能不想再次重新編碼你的應用時間&。

Function IsFilled(TestRange As Range) As Boolean 
Dim C As Range 

    IsFilled = True 
    For Each C In TestRange.Cells 
     If C = "" Then 
      IsFilled = False 
      Exit For 
     End If 
    Next C 
End Function 

Function IsSum(TestRange As Range, TestSum As Range) As Boolean 

    IsSum = (Application.WorksheetFunction.Sum(TestRange) = Application.WorksheetFunction.Sum(TestSum)) 

End Function 

在您的上下文中,兩個函數都必須計算爲True以使用戶條目有效。

現在你可以

  • 進入這些功能集成到您的工作表的兩個單元格(如=isfilled(A2:A7)=issum(A3:A7;A2)),並告訴用戶他們必須努力工作,以使雙方True
  • 從上面的兩個結果評估任何適當的事件Sub(),例如在Worksheet_Deactivate()Workbook_BeforeSave()(我喜歡BeforeSave over BeforeClose,因爲用戶可能希望在沒有保存的情況下轉義),在這種情況下我不需要驗證)
  • 直接調用並評估這兩個函數,而不使用它們在工作表
  • 無論如何驗證Sub()必須終止其默認操作,並在驗證失敗的情況下顯示MsgBox()