我的宏在所有打开的工作簿中搜索活动单元格值(例如98%)。但是,它只能找到值0.98,而不是其他单元格中的值98%。为什么呢?
这是我的宏:
Sub FindIt2()
Dim wSheet As Worksheet
Dim wBook As Workbook
Dim rFound As Range
Dim firstAddress As String
lookfor = Selection.Value
On Error Resume Next
For Each wBook In Application.Workbooks
For Each wSheet In wBook.Worksheets
Set rFound = wSheet.Cells.Find(What:=lookfor, After:=wSheet.Cells(1, 1), _
LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
If Not rFound Is Nothing Then
firstAddress = rFound.Address
Do
Application.Goto rFound, True
MsgBox "The Search String has been found these locations: "
Set rFound = wSheet.Cells.FindNext(rFound)
Loop While Not rFound Is Nothing And rFound.Address <> firstAddress
End If
Next wSheet
Next wBook
On Error GoTo 0
任何人都有一个想法如何解决这个问题?谢谢!
编辑:我希望它能找到:98%和0.98
答案 0 :(得分:0)
有时98%是细胞的价值。即当你在一个单元格中键入98%时。 Excel会将其视为98%。在其他情况下,单元格值为.98或.98231并显示98%。很可能你想要查找两位有效数字的综合数据,以便在值为.98321时找到.98。
我会尝试寻找两者。
cell.text和round(cell.value,2)
How to round up with excel VBA round()?
本文介绍如何在Excel VBA中使用圆形功能
答案 1 :(得分:0)
实际上,Find
缺少各种格式的值(不仅仅是百分比),即使数值与函数What
的参数Find)
相同。
在下面列出的各种条件下,Find
仅查找内容为0.98
的单元格,或者使用常规或数字(2位十进制数字)格式。
我尝试了什么:
使用lookfor = Selection.Value
。更改Selection
指向的(源)单元格的数字格式。 Selection
的格式是百分比,数字(带有任何小数位数)还是常规格式无关紧要。 Find
只能找到0.98
而不是0.980
的细胞,例如
使用lookfor = Selection.Text
。更改Selection
指向的(源)单元格的数字格式。 Find
仅查找与查看完全相同的单元格。
虽然可能很奇怪,但这需要一种解决方法,因为Find
无法同时找到0.98
和98%
。
一种选择是使用统一格式的一个或多个辅助列,并在这些列上执行find
。
答案 2 :(得分:0)
当FIND
不起作用时,一种解决方案是遍历单元格。如果您有大量单元格,这可能会很慢,因此读取要搜索到变量数组的范围会将速度提高十倍或更多。
但是这是一个循环的想法,可以帮助你入门。注意我使用了value2
属性。有关原因,请参阅Charles Williams Answer。
首先运行Setup
宏,然后运行findValuePercent
,看看情况如何运作。然后,您可以根据自己的具体要求进行调整。
Option Explicit
Sub Setup()
Dim WS As Worksheet
Set WS = Worksheets("sheet1")
With WS
.Cells(1, 1).Value = "98%"
.Cells(2, 1).Value = 0.98
Debug.Print .Cells(1, 1).Value, .Cells(1, 1).Text ' --> 0.98 98%
Debug.Print .Cells(2, 1).Value, .Cells(2, 1).Text ' --> 0.98 0.98
End With
End Sub
Sub findValuePercent()
Dim WS As Worksheet
Dim R As Range
Dim C As Range
Dim S As String
Const dWhat As Double = 0.98
Set WS = Worksheets("sheet1")
Set R = WS.UsedRange
For Each C In R
If C.Value2 = dWhat Then
S = S & vbLf & C.Address & vbTab & C.Text
End If
Next C
MsgBox "Matches in" & S
End Sub