2014-10-06 21 views
0

我一直在尋找一個宏來檢查3列以確保內容是日期值。列可以包含空單元格。宏以檢查列中的非空白單元格以確保isdate()

下面的函數返回每個不是日期的單元格的消息框,即使是空格也是如此。

Sub DateCheck() 
With ActiveSheet 
    lastRow = .Range("AB" & Rows.Count).End(xlUp).Row 
    For RowCount = 2 To lastRow 
     POC = .Range("AB" & RowCount) 
    If Not IsDate(POC) Then 
     MsgBox ("Please enter valid date in Cell : AB" & RowCount & ". Example: dd/mm/yyyy") 
    End If 
    Next RowCount 

    End With 
End Sub 

可能有人會這麼好心來幫助調整這個要看3個非相鄰列,忽略空白單元格,只有在發現非日期值的情況下每列返回一個消息?

感謝一如既往

克里斯

回答

1

我想你的循環更改爲For Each In ... Next,並使用.Union來構建一系列非相鄰列。

Sub MultiDateCheck() 
    Dim lr As Long, cl As Range, rng As Range, mssg As String 
    With ActiveSheet 
     lr = .Range("AB" & Rows.Count).End(xlUp).Row 
     Set rng = Union(.Range("AB2:AB" & lr), .Range("AM2:AM" & lr), .Range("AZ2:AZ" & lr)) 
     For Each cl In rng 
      If Not IsDate(cl.Value) And Not IsEmpty(cl) Then _ 
       mssg = mssg & cl.Address(0, 0) & Space(4) 
     Next cl 
    End With 
    If CBool(Len(mssg)) Then 
     MsgBox ("Please enter valid date(s) in Cell(s): " & Chr(10) & Chr(10) & _ 
      mssg & Chr(10) & Chr(10) & _ 
      "Example: dd/mm/yyyy") 
    Else 
     MsgBox "All dates completed!" 
    End If 
    Set rng = Nothing 
End Sub 

我使用單個LASTROW從塔AB到確定待檢查的細胞的範圍,而是爲每列各行可以很容易地得到補償。

附錄:針對顯示流氓非日期/非空白單元格(如下所示)的單條消息修改的代碼。 Chr(10)只是一個換行字符。

Sample error message

+0

非常感謝你,這很好。關於.union的建議在我遇到的其他一些問題上非常有用。再次感謝你。 – chris1982 2014-10-07 07:47:09

+0

還有一個快速問題,是否有一種方法只顯示一條錯誤消息。作爲一個例子,我在一張紙上測試了這個日誌,有1000多個無效日期,以清除包含按下ok按鈕的錯誤消息。再一次感謝你。 – chris1982 2014-10-07 08:12:18

+0

@ chris1982 - 我很高興你整理出來了。我已根據原始請求的最後一部分調整了上面的代碼。感謝您的積極反饋! – Jeeped 2014-10-07 08:42:51

2

代碼:

Sub DateCheck() 
    Dim s(2) As String 
    Dim i As Integer 
    Dim o As String 
    Dim lastRow As Long 
    Dim r As Long 

    'Enter columns here: 
    s(0) = "A" 
    s(1) = "B" 
    s(2) = "C" 


For i = 0 To 2 
    With ActiveSheet 
     lastRow = .Range(s(i) & Rows.Count).End(xlUp).Row 
     For r = 2 To lastRow 
      POC = .Range(s(i) & r) 

      If Not IsDate(POC) Then 
       o = o & ", " & .Range(s(i) & r).Address 
      End If 
     Next r 
     MsgBox ("Please enter valid date in Cells : " & Right(o, Len(o) - 1) & ". Example: dd/mm/yyyy") 
     o = "" 
    End With 
Next i 
End Sub 
+0

我測試過這種方法,但我對「MSGBOX」得到了一個錯誤。當我有幾分鐘的時間時,我會再看看這個,因爲我喜歡這樣寫的方式。讓我意識到我的vba技能有多糟糕!感謝您花時間發佈答案! – chris1982 2014-10-07 07:49:21