VBA查找功能忽略百分比 - >只找到小数

时间:2017-07-30 10:46:57

标签: excel vba excel-vba

我的宏在所有打开的工作簿中搜索活动单元格值(例如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

3 个答案:

答案 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位十进制数字)格式。

我尝试了什么:

  1. 使用lookfor = Selection.Value。更改Selection指向的(源)单元格的数字格式。 Selection的格式是百分比,数字(带有任何小数位数)还是常规格式无关紧要。 Find只能找到0.98而不是0.980的细胞,例如

  2. 使用lookfor = Selection.Text。更改Selection指向的(源)单元格的数字格式。 Find仅查找与查看完全相同的单元格。

  3. 虽然可能很奇怪,但这需要一种解决方法,因为Find无法同时找到0.9898%。 一种选择是使用统一格式的一个或多个辅助列,并在这些列上执行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