检查 Excel 中的数据类型 VBA

FMT*_*FMT 0 excel vba integer

我编写了一段代码,使用 isNumeric 函数检查输入的数据是否为数字。现在我想指定并检查它是否是一个整数。据我所知,没有像isInteger这样的函数。如何检查数据类型?

我在下面发布了一段代码,我希望它能像这样有意义。如果没有,请告诉我。

感谢您的帮助!

Sub CheckColumnsHardwareDefinition()


 
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Hardware Definition") 
Dim Target As Range
Dim Target2 As Range
Dim lr As Long
Dim lr2 As Long


Dim DblLengthMin As Double
Dim DblLengthMax As Double
Dim DblWeightMin As Double
Dim DblWeightMax As Double

Dim dynamicArray1() As String
Dim dynamicArray2() As String

Dim f1 As Integer
Dim f2 As Integer
f1 = 0
f2 = 0

DblLengthMax = 20000
DblLengthMin = 5
DblWeightMin = 0.0001
DblWeightMax = 10000


lr3 = Application.WorksheetFunction.Max( _
        ws.Range("A" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("B" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("C" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("D" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("E" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("F" & ws.Rows.Count).End(xlUp).Row)

For Each Target3 In Range("A2:F" & lr3)

    If IsEmpty(Target3) Then
    Target3.Interior.ColorIndex = 8
    End If
    
Next Target3

lr = Application.WorksheetFunction.Max( _
        ws.Range("C" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("D" & ws.Rows.Count).End(xlUp).Row, _
        ws.Range("E" & ws.Rows.Count).End(xlUp).Row)
        
        
For Each Target In Range("C2:E" & lr)
    If **Not IsNumeric(Target)** Then
    
     f1 = f1 + 1
     Target.Interior.ColorIndex = 3
    ReDim Preserve dynamicArray1(0 To f1)
  
          dynamicArray1(f1) = "Row " & Target.Row & " Column " & Target.Column & " wrong 
          entry: " & Target.Value
    End If
    
    If **IsNumeric(Target)** And Target.Value > DblLengthMax Or Target.Value < 
    DblLengthMin 
    Then
 
    f2 = f2 + 1
 
    Target.Interior.ColorIndex = 46
    
    ReDim Preserve dynamicArray2(0 To f2)
         dynamicArray2(f2) = "Row " & Target.Row & " Column " & Target.Column & " wrong 
         entry: " & Target.Value
          
    End If
    

Next Target

       Inhalt1 = Join(dynamicArray1, vbCrLf)
       MsgBox ("Wrong datatype! " & vbCrLf & vbCrLf & f1 & " Datatype Errors (marked 
       red)" & vbCrLf & "Only numbers can be entered. Check again" & vbCrLf & Inhalt1)

       Inhalt2 = Join(dynamicArray2, vbCrLf)
       MsgBox ("Entries out of range!" & vbCrLf & vbCrLf & f2 & " Range errors (marked 
       orange)" & vbCrLf & "The value is out of range. Check for unit [mm] " & vbCrLf & 
       Inhalt2)
    

End Sub
Run Code Online (Sandbox Code Playgroud)

Sto*_*rax 5

让我们利用 VBA 的“内部”转换

 Function isInteger(val As Variant) As Boolean

    Dim i As Integer

    On Error GoTo EH
    
    i = CInt(val)  
    
    If i = val Then  ' check if it was cut or not
        isInteger = True
    Else
        isInteger = False
    End If
    
    Exit Function

EH:
    isInteger = False

End Function
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Asi声明为integer i=val会导致溢出,因此 33000 的结果为 FALSE。如果您不想这样做,则必须声明ilong并使用CLng()

简短的版本看起来像这样

Function isInteger(val As Variant) As Boolean

    On Error GoTo EH
    isInteger = (val = CInt(val))
    Exit Function

EH:

End Function
Run Code Online (Sandbox Code Playgroud)