このコードは、ルールに従って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
あなたが考慮する必要がありますいくつかの変更です:あなたは、すぐに無効なデータが検出されたように停止することができるよう
- 変更
Do...Loop
からFor...Loop
。どの行が無効であるかを気にしない場合は、これを実行します。
- エラーを表示する場合は、無効なデータの強調表示を追加します。これは
If Not bRowValid...
ブロックで行います。
Sub Validate
をワークシートをパラメータとし、boolean
を返す関数に変更します。 IOWでは、データを履歴シートにコピーするコードからバリデーションを分離します。
FOR A、D、Eデータ検証が機能するはずです(データタブ、データ検証)。データ入力付きB入力マスク用。データが最初から間違っているのを防ぎます。しかし、あなたがそれを行うことができない場合は、VBAが必要になります。 – xQbert
私は入力ファイルを制御できないと言います。私はvbaでそれを読んで、フォールト、vbaの自動バリデーターを使用する方法を確認しますか? – d0lph1n
編集時に新しいExcelファイルをチェックしますか(Excel内から)、既存のExcelファイルをたくさんチェックする必要がありますか?それはVBAでなければならないのですか? – knb