Функция VBA Range.Find () не работает с большими числами с плавающей запятой - PullRequest
1 голос
/ 09 октября 2019

Я пишу код для поиска наибольшей суммы в долларах в столбце и возврата значения, а также значения ячеек в соседних столбцах с 9 знаками в целевой ячейке

Когда я устанавливаю переменную диапазонаон показывает значение «12000.88», которое работает нормально, однако, как только это значение превышает 9 цифр «123000.55», «set fnd» не находит его, а переменная диапазона - Nothing. Я проверил много других вещей и обнаружил, что единственная разница - это длина значения

Sub Populate()

    Dim Fnd As Range    
    Set Fnd = Range("L:L").Find(WorksheetFunction.Large(Range("L:L"), 1), , xlValues)

End Sub

. У меня нет проблем с меньшими числами, но я не понимаю, почему это не будет работать с большими числами.

1 Ответ

0 голосов
/ 09 октября 2019

Проблема в разных десятичных разделителях, которые используются в Excel и VBA. Таким образом, в значениях с плавающей точкой есть «скрытая особенность». Функция Find() на самом деле ищет string, а двойное число «строковое», очевидно, не правильным способом - с запятой, а не с точкой. Попробуйте разобрать строку и заменить запятую точкой, чтобы она заработала:

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, единственный способ найти его - это проанализировать содержимое ячейки в String.

...