У меня есть следующий метод, который находит самые большие и наименьшие значения в диапазоне. Затем я использую эти значения для определения фактической ячейки, в которой они находятся, поскольку мне нужно захватить значение из ячейки заголовка этого столбца. 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 имеет правильный диапазон, поэтому он не выполняет поиск в неправильном месте.
Единственная вещь, о которой я могу думать, это ячейка со значением, получает ее значение из очень длинной формулы, используя более дюжины названных диапазонов, может ли это быть загрязнение методом поиска?
Просто так мы все знаем, что я не сумасшедший, вот снимок части диапазона, в котором я ищу, где я тестирую.
EDIT на основе Тим Уильямс предложение, я изменил формат номера диапазона разыскивается до Находки вызова.
tempRange.NumberFormat = "0.00"
, а затем вызов Find работает как следует. Затем я просто вернул формат номера так, как хочу, в конце процедуры.
tempRange.NumberFormat = "$#,##0;[Red]$#,##0"
Работы как ожидалось сейчас.
Возможно, это проблема с десятичными знаками, которые вы не видите? Что произойдет, если вы установите lookat: = xlpart в своих параметрах поиска? Кроме того, bestPnL - это то, что вы ищете, и оно двойное. Убедитесь, что значения, которые вы смотрите, также являются числовыми, у меня были проблемы с этим раньше. Например, если вы пишете 'What: = Cstr (bestPnL)', посмотрите, работает ли он? –
попробовал кастинг в строку, что не работало – dinotom