Excel 如果是,则检查2个变量,但赢了';不要忽略文本

Excel 如果是,则检查2个变量,但赢了';不要忽略文本,excel,vba,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

我正在运行一个
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

修正你的宏

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

由于VBA将隐式地将仅包含数字的文本字符串转换为用于此比较的数字(即
2>“1”
True
2>“3”
False
),因此您实际要检查的值是否为


正如格斯伯格在下面指出的那样,这也将捕获科学或程序员的符号,例如“&hFF”(“&h”表示十六进制,十六进制
FF
转换为十进制为
255
)或“1d2”/“1e2”(1的幂为2,或
1*10^2
=
100
)。如果这是一个问题,你可能需要考虑。

这个宏可以更好地工作

    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

如果您没有添加所有样板代码,而只是建议在值周围添加
Val()
。@Salim,我同意Gserg添加的内容:)我运行了它,效果会更好,但如果值以数字开头,后跟文本(如3G调制解调器),则情况会更清楚这真的取决于你为什么要检查它以及规则是什么。例如,如果单元格中有一个存储为文本的数字,是否应将其视为一个数字?@Gserg,Chronocidal所写的答案就是我需要的答案。我只需要检查这个值是否真的是一个数字——如果不是太清楚的话,很抱歉!它也解决了SalIMS回答中的问题,当值从一个数字开始,但后面包含文本。例如,
isnumeric(“1d2”)
=>
True
isnumeric(&ha”)
=>
True
@Gserg,只有一个数字,值中不能有文本或字母-因此在我的情况下,isnumeric似乎可以工作,因为没有检测到3G调制解调器。@CustomX然后
isnumeric
不会帮助您,除非你能绝对确定你的数据中不会有任何东西是你没有的。@GSerg but,
&ha
是一个数字:
&h
表示它是十六进制的,而十六进制
a
转换成十进制则是
10
。类似地,
xdy
xey
x*10^y
的同义词,因此
1d2
100
。“问题”在于
IsNumeric
识别科学和编程符号
    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