2015-04-30 3 views
2

У меня проблема с макросом VBA, который я написал, с частью, предназначенной для поиска самого низкого значения в диапазоне. Линия выглядит следующим образом:VBA Range.Find функция на округленных отрицательных числах

Min = Application.WorksheetFunction.Min(a0eqB) Set MinCell = a0eqB.Find(Min, LookIn:=xlValues)

И это возвращает Object variable or With block variable not set ошибку. Теперь я знаю, почему это происходит - иногда Find находит Nothing, и я узнал, как обращаться с такими типами ситуаций. Хотя, он также находит Nothing, когда значение dispayed в ячейке отличается от значения в переменной Min.

Например, когда Min = -11.2641373534338, значение в ячейке равно -11.264137, а затем возникает ошибка. Но если я изменил количество десятичных знаков, отображаемых для этой ячейки с помощью кнопок пользовательского интерфейса Excel, пока не будет -11.2641373534338, все будет хорошо. Значение в ячейке на самом деле является результатом вычисления формулы, если это помогает.

Я вижу два пути решения этой проблема:

  1. Выяснить, как показываются много знаков после запятой, а затем округление фактического значения, так они совпадают. Но таким образом совпадение на самом деле может пойти не так, поскольку числа, подобные 11.321 и 11.322, если округлить до 2 десятичных знаков, будут одинаковыми. Кроме того, это невозможно из-за того, что мне нужно найти адрес ячейки, чтобы это сделать, и это сделано в строке 2 вышеприведенного кода, что вызывает проблему.
  2. Как-то сказать Find функция использовать фактические и не отображаемые номера, но я понятия не имею, как это сделать. Я несколько раз искал Google, но до сих пор не добился успеха.

Я по-настоящему благодарю вас за помощь.

ответ

0

Рассмотрев проблемы с отрицательными номерами и используя его с функцией поиска; возможным решением будет форматирование диапазона поиска и номера для поиска с одинаковым номером. (На основании кода, предоставленного Студентом Gary's)

Код ниже для этого.

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

Sub GetLowest() 

    Dim sFormat As String: sFormat = "0.000000000" 
    Dim wf As WorksheetFunction: Set wf = Application.WorksheetFunction 
    Dim rng As Range: Set rng = Range("MinRange") 
    rng.NumberFormat = sFormat 
    Dim Lowest As Double: Lowest = Format(wf.Min(rng), sFormat) 
    Dim WhereIs As Range: Set WhereIs = rng.Find(What:=Lowest) 

    MsgBox WhereIs.Address 

End Sub 
+0

Это действительно странное поведение «Найти». Большое спасибо! – gBop

1

Есть по крайней мере две возможные проблемы:

  • не используют Min в качестве имени переменной
  • Dim переменная вы используете

Для пример:

Sub GetLowest() 
    Dim wf As WorksheetFunction 
    Set wf = Application.WorksheetFunction 
    Dim rng As Range, Lowest As Double, WhereIs As Range 
    Set rng = Range("A1:F9") 

    Lowest = wf.Min(rng) 
    Set WhereIs = rng.Find(What:=Lowest, After:=rng(1)) 
    MsgBox WhereIs.Address 
End Sub 

при запуске на:

enter image description here

не имеет никаких проблем с поиском B2 независимо от форматирования.

+0

Эти функции не работают с отрицательными значениями. Я попробовал свой код в диапазоне с -46/13 в ячейке и получил то же сообщение об ошибке, что и OP. – Tragamor

+0

@Flephal ..................... очень странно .............. он работает на моем старом компьютере .... ..... ** Win 7 - Excel 2007 ** –

+0

Благодарим вас за ответ! Пробовал оба метода, ни один из них не работал для меня :(@Flephal может быть прав, в моем файле минимальное число всегда должно быть отрицательным, так что это может быть причиной – gBop

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