如果可以,则检查2个变量,但不会忽略文本

时间:2019-08-16 14:31:48

标签: excel vba

我正在运行for循环,并有一条if/else语句,该语句检查当前范围的值并查看其是否大于或等于1。问题在于,当前范围,也可以是文本而不是数字。

就像我现在看到的那样,它看到的文本大于或等于1,但是如何添加额外的条件以查看它是文本还是数字?

LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row

For i = 3 To LastRow
    If Range("A" & i).Value >= 1 Then
        ws2.Range("A" & var1).Value = ws1.Range("A" & i).Value
        var1 = var1 + 1
    End If
Next i

3 个答案:

答案 0 :(得分:2)

由于VBA会将隐含仅包含数字的文本字符串转换为用于此比较的数字(即2>"1"True,而2>"3"False),所以您实际上要检查值IsNumeric

If Range("A" & i).Value >= 1 And IsNumeric(Range("A" & i).Value) Then

如GSerg所指出的,这还将捕获科学或程序员表示法,例如“&hFF”(“&h”表示十六进制,而十六进制FF则转换为255的Decimal)或“ 1d2 ” /“ 1e2”(decimal exponent为1的幂2或1 * 10^2 = 100)。如果这是一个问题,则可能要考虑使用using RegEx

答案 1 :(得分:0)

更正您的宏

Option Explicit
Sub compaire_with_1()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim LastRow%, i%, var1%: var1 = 1
Set ws1 = Sheets("sheet1"): Set ws2 = Sheets("sheet2")
LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row

For i = 3 To LastRow
    If Val(ws1.Range("A" & i)) >= 1 Then
        ws2.Range("A" & var1).Value = ws1.Range("A" & i).Value
        var1 = var1 + 1
    End If
Next i
End Sub

答案 2 :(得分:0)

也许这个宏可以更好地工作

    Option Explicit
Sub compaire_with_Digit()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim LastRow%, i%, var1%: var1 = 1
Set ws1 = Sheets("Sheet1"): Set ws2 = Sheets("Sheet2")
LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row
ws2.Range("A1").CurrentRegion.ClearContents
For i = 3 To LastRow
   If ws1.Range("A" & i) Like "[1-9]*" Then
        ws2.Range("A" & var1).Value = _
        ws1.Range("A" & i).Value
        var1 = var1 + 1
    End If
Next i
End Sub