Excel VBA Range.Find()函数不能处理大浮点数
我正在编写代码来查找列中的最高金额,并返回值以及目标单元格中包含9个字符的相邻列中单元格的值 当我设置范围变量时,它会显示“12000.88”的值,该值工作正常,但是一旦该值扩展到9位数以上“123000.55”,则“set fnd”找不到它,范围变量为零。我已经测试了很多其他东西,发现唯一的区别是值的长度Excel VBA Range.Find()函数不能处理大浮点数,excel,vba,range,max,long-integer,Excel,Vba,Range,Max,Long Integer,我正在编写代码来查找列中的最高金额,并返回值以及目标单元格中包含9个字符的相邻列中单元格的值 当我设置范围变量时,它会显示“12000.88”的值,该值工作正常,但是一旦该值扩展到9位数以上“123000.55”,则“set fnd”找不到它,范围变量为零。我已经测试了很多其他东西,发现唯一的区别是值的长度 Sub Populate() Dim Fnd As Range Set Fnd = Range("L:L").Find(WorksheetFunction.Larg
Sub Populate()
Dim Fnd As Range
Set Fnd = Range("L:L").Find(WorksheetFunction.Large(Range("L:L"), 1), , xlValues)
End Sub
我对较小的数字没有问题,但我不明白为什么这对较大的数字不起作用。问题在于Excel和VBA使用的不同的十进制分隔符。因此,在浮点值中存在一个“隐藏特性”。
Find()。考虑对字符串进行解析并用逗号替换逗号以使其有效:
Sub Populate()
Dim foo As Range
Dim biggus As Double
biggus = WorksheetFunction.Large(Range("A:A"), 1)
Set foo = Range("A:A").Find(ReplaceCommas(biggus), , xlValues)
Debug.Print foo.Address
End Sub
Function ReplaceCommas(valueAsString As Variant) As String
Dim valueToReplace As String
valueToReplace = valueAsString
ReplaceCommas = Replace(valueAsString, ",", ".")
End Function
当xlFormulas
位于SearchIn
参数中时,“功能”不会出现,这是因为xlFormulas
将单元格的内容转换为字符串,以便在其中搜索。例如,如果存在=SUM(A1+A2)
并且我们正在寻找1+A
,找到它的唯一方法是将单元格内容解析为字符串。问题在于Excel和VBA使用的不同十进制分隔符。因此,在浮点值中存在一个“隐藏特性”。Find()。考虑对字符串进行解析并用逗号替换逗号以使其有效:
Sub Populate()
Dim foo As Range
Dim biggus As Double
biggus = WorksheetFunction.Large(Range("A:A"), 1)
Set foo = Range("A:A").Find(ReplaceCommas(biggus), , xlValues)
Debug.Print foo.Address
End Sub
Function ReplaceCommas(valueAsString As Variant) As String
Dim valueToReplace As String
valueToReplace = valueAsString
ReplaceCommas = Replace(valueAsString, ",", ".")
End Function
当xlFormulas
位于SearchIn
参数中时,“功能”不会出现,这是因为xlFormulas
将单元格的内容转换为字符串,以便在其中搜索。例如,如果存在=SUM(A1+A2)
并且我们正在寻找1+A
,找到它的唯一方法是将单元格内容解析为字符串。它与xlformulas
一起工作-别问我为什么!如果整列都是空的,它会抛出1004个错误。我已经在这上面敲了8个小时了。。。xl公式。。。它是有效的。。。如此沮丧但却如释重负。谢谢。@JeffF-Find
有时确实有点问题,会给双倍和日期带来意想不到的结果。通常,如果可能的话,我会编写自己的函数(并缓慢循环)或解析为字符串。它适用于xlformulas
-别问我为什么!如果整列都是空的,它会抛出1004个错误。我已经在这上面敲了8个小时了。。。xl公式。。。它是有效的。。。如此沮丧但却如释重负。谢谢。@JeffF-Find
有时确实有点问题,会给双倍和日期带来意想不到的结果。通常,如果可能的话,我会编写自己的函数(并缓慢循环)或解析为字符串@SJR-我只是觉得它是马车。无论如何,问题出在、
和
中。VBA使用点,Excel使用逗号作为十进制分隔符。我已经编辑了。@JvdV-事实上我也是。我对它进行了编辑以使其正常工作。我仍然不确定答案。由于您将值解析为字符串,因此它显然可以工作,Find
的What
参数。如果我们首先尝试检查变量WorksheetFunction.Large(Range(“A:A”),1)
,我们可以看到VBA使用一个点来存储它,因为它是基于en_US的。你确定这是一个bug并且Find
只接受字符串吗?为什么9岁以下的人能工作?此外,为什么xlFormulas
会起作用。我也在试图弄明白这台自动取款机的意义@JvdV-WorksheetFunction.Large(范围(“A:A”),1)
工作正常,并将其正确传递给double
类型的biggus
变量。当搜索A:A
列以查找该变量时,会出现问题-它错误地“读取”了点和逗号,因此无法找到它。@JvdV-关于其他问题-find()
不仅接受字符串,而且会解析为参数字符串,因此出现问题。我想,9个字符以下的函数应该是某种优化,以便使函数快速。而aboutxlFormulas
会自动将单元格的输入转换为字符串,这样就可以工作了。毕竟,=SUM(A1+A2)
是一个纯字符串(例如,不是长的
,也不是日期
,也不是双的
@SJR-我只是认为它有缺陷。无论如何,问题在于,
和
。VBA使用点,Excel使用逗号作为十进制分隔符。我编辑过。@JvdV-事实上和我一样。我编辑它是为了让它工作。我仍然不确定a是否正确。)nswer。由于您将值解析为字符串,它显然会起作用,Find
的What
参数。如果我们首先尝试检查变量WorksheetFunction.Large(范围(“A:A”),1)
我们可以看到,VBA使用一个点来存储它,因为它是基于en_US的。你确定这是一个bug并且Find
只接受字符串吗?为什么少于9个字符可以工作?此外,为什么xlFormulas
可以工作。我还试图理解这个atm。=@JvdV-工作表函数。大(范围(“a:a”),1)
工作正常,并将其正确地传递给double
类型的biggus
变量。当搜索A:A
列以查找该变量时,会出现问题-它错误地“读取”了点和逗号,因此无法找到它。@JvdV-关于其他问题-find()
不仅接受字符串,它还解析为参数字符串,因此问题就出现了。9个字符以下的函数应该是某种优化,以便