此代碼根據您的規則驗證ActiveSheet。對於B列,我理解你的意思是該值實際上是文本,而不是該單元格用前導零格式化。
Sub Validate()
Dim lRow As Long
Dim lNumRows As Long
Dim bRowValid As Boolean
Dim bSheetValid As Boolean
With ActiveSheet
bSheetValid = True ' initial assumption is sheet is valid
lNumRows = .Cells(.Rows.Count, 1).End(xlUp).Row
For lRow = 2 To lNumRows
bRowValid = IsInteger(.Cells(lRow, 1).Value)
bRowValid = bRowValid And IsFormatted(.Cells(lRow, 2).Value)
If .Cells(lRow, 3).Value = 1 Then
bRowValid = bRowValid And IsInteger(.Cells(lRow, 4).Value)
End If
bRowValid = bRowValid And IsTime(.Cells(lRow, 5).Value)
bSheetValid = bSheetValid And bRowValid
If Not bRowValid Then
' do something here if you want to flag this row
End If
Next lRow
End With
If bSheetValid Then
' copy data to historical sheet
End If
End Sub
Function IsInteger(vValue As Variant) As Boolean
If VarType(vValue) = vbDouble Then
IsInteger = (Fix(vValue) = vValue)
Else
IsInteger = False
End If
End Function
Function IsFormatted(vValue As Variant) As Boolean
If VarType(vValue) = vbString Or VarType(vValue) = vbDouble Then
IsFormatted = vValue Like "[0-9][0-9][0-9][0-9]"
Else
IsFormatted = False
End If
End Function
Function IsTime(vValue As Variant) As Boolean
If IsFormatted(vValue) Then
IsTime = IsDate(Left$(vValue, 2) & ":" & Right$(vValue, 2))
Else
IsTime = False
End If
End Function
以下是你可能要考慮一些改變:
- 更改
For...Loop
到Do...Loop
這樣就可以儘快停止無效的數據中找到。如果您不關心哪些行無效,請執行此操作。
- 如果您想查看錯誤,請爲無效數據添加突出顯示。在
If Not bRowValid...
塊中執行此操作。
- 將
Sub Validate
更改爲以工作表爲參數並返回boolean
的函數。 IOW將驗證與將數據複製到歷史數據表的代碼分開。
對於A,D,E數據驗證應該工作(數據選項卡,數據驗證)。用於具有數據驗證的B輸入掩碼。它將首先防止數據錯誤。但如果你不能這樣做,那麼VBA將是必需的。 – xQbert
可以說我沒有控制輸入文件。我用vba讀取它並檢查錯誤,在vba中使用自動驗證程序的任何方法? – d0lph1n
你想在編輯時檢查一個新的excel文件(從excel內),還是你必須檢查一大堆已經存在的excel文件(例如導入/批量加載到數據庫中)?它是否必須是VBA? – knb