2016-07-08 7 views
0

У меня есть следующий метод, который находит самые большие и наименьшие значения в диапазоне. Затем я использую эти значения для определения фактической ячейки, в которой они находятся, поскольку мне нужно захватить значение из ячейки заголовка этого столбца. Range.Find всегда возвращает ничто, даже если исследуемый диапазон имеет КЛЕТКУ С ЭТОЙ ЦЕННОСТЬю.Метод VBA Range.Find не находит значение IS в диапазоне

Sub GetTopAndBottomFiveCommodities() 
    Dim tempRange As Range, x As Integer, bestPnL As Double, worstPnL As Double 
    Dim strTopRangeName As String, strBottomRangeName As String 
    Dim cCell As Range, commodityName As String 

    Set tempRange = dataSourceSheet.Range("A:A").Find(What:="Year Totals") 
    Set tempRange = Range(tempRange.Offset(0, 1), tempRange.End(xlToRight).Offset(0, -1)) 
    For x = 1 To 5 
     strTopRangeName = "TopCommodity" & CStr(x) 
     strBottomRangeName = "BottomCommodity" & CStr(x) 
     bestPnL = WorksheetFunction.Large(tempRange, x) 
     worstPnL = WorksheetFunction.Small(tempRange, x) 
     Debug.Print tempRange.Address 
     ' get the top commodity name and PnL  
     **Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues)** 
     commodityName = dataSourceSheet.Cells(5, cCell.Column).Value 
     Range(strTopRangeName).Value = commodityName 
     Range(strTopRangeName).Offset(0, 1).Value = bestPnL 
    Next x 
End Sub 

Код строки

Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues) 

не всегда возвращается ничего, но я проверил, что есть клетки с этим значением. Например, значение ячейки 66,152.61 (отображается в ячейке как 66,153), а переменная bestPnL - 66 152,21, поэтому я попробовал округлить bestPnL до 66,153, но все равно не нашел. Оператор отладки показывает, что tempRange имеет правильный диапазон, поэтому он не выполняет поиск в неправильном месте.

Единственная вещь, о которой я могу думать, это ячейка со значением, получает ее значение из очень длинной формулы, используя более дюжины названных диапазонов, может ли это быть загрязнение методом поиска?

Просто так мы все знаем, что я не сумасшедший, вот снимок части диапазона, в котором я ищу, где я тестирую.

enter image description here

EDIT на основе Тим Уильямс предложение, я изменил формат номера диапазона разыскивается до Находки вызова.

tempRange.NumberFormat = "0.00" 

, а затем вызов Find работает как следует. Затем я просто вернул формат номера так, как хочу, в конце процедуры.

tempRange.NumberFormat = "$#,##0;[Red]$#,##0" 

Работы как ожидалось сейчас.

+0

Возможно, это проблема с десятичными знаками, которые вы не видите? Что произойдет, если вы установите lookat: = xlpart в своих параметрах поиска? Кроме того, bestPnL - это то, что вы ищете, и оно двойное. Убедитесь, что значения, которые вы смотрите, также являются числовыми, у меня были проблемы с этим раньше. Например, если вы пишете 'What: = Cstr (bestPnL)', посмотрите, работает ли он? –

+0

попробовал кастинг в строку, что не работало – dinotom

ответ

2

Попробуйте удалить тысячу разделителей из формата чисел на ячейках. Когда я это делал в тестовом диапазоне, он работал нормально, но с разделителем ему не удалось найти значение.

Set f = rng.Find(what:=bestPnL, LookIn:=xlFormulas) 

будет работать даже с тысячелетней сепаратором (EDIT: работает только с жестко закодированных значений, не может с формулами).

EDIT2: это сработало для меня с разделителем тысяч и с использованием формул для значений (EDIT3 !: не работает с форматированием валюты).

Sub Tester() 

    Dim f As Range, v, rng As Range 

    Set rng = Range("C3:C21") 

    v = Application.Large(rng, 3) 

    v = Format(v, rng.Cells(1).NumberFormat) 

    Set f = rng.Find(what:=v, LookIn:=xlValues) 

    Debug.Print f.Address ' >> C19 

End Sub 
+0

Не меняя ничего, я пробовал использовать xlFormulas, который не работал, поскольку вы закончили с «будет работать даже с разделителем тысяч». Я также добавил Searchorder: = xlByColumns, так как его горизонтальная одна строка варьируется от его поиска. – dinotom

+0

Вы пытались удалить разделитель тысяч? –

+0

... Поскольку я не хочу удалять разделитель с листа, я собираюсь добавить его в переменную поиска и посмотреть, работает ли это. Да, это не сработает.Я пытаюсь переформатировать диапазон во время поиска, а затем верну его в конце. – dinotom

Смежные вопросы