Мой код до сих пор, как это:Excel-Vba - Double/Дата/время согласования и толерантность
Sub FindMatchingValue()
Dim i As Integer, TimeValueToFind As Date
TimeValueToFind = "04:00:00"
Sheets("Vessels").Range("F07").ClearContents
For i = 1 To 25 '
If CDate(Sheets("Vessels").Cells(i, 1).Value) = TimeValueToFind Then
MsgBox ("Found value on row " & i)
Sheets("Vessels").Range("F07").Value = Cells(i, 1).Offset(1, 1).Resize(1).Value
Exit Sub
End If
Next i
MsgBox ("Value not found in the range!")
End Sub
Этот код проверяет Столбец A в течение времени, введенного в формате хх: хх: хх И где ввод и где время написано, устанавливаются как формат «Время». Изначально редактирование CDate
не было добавлено. И это заставило код всегда возвращать false, потому что, поскольку он был поставлен, я пытался «сравнить яблоки с апельсинами».
Однако добавление CDate
добавляет ошибку несоответствия. Точно так же изменения, как быть двойной также не работают:
Sub FindMatchingValue()
Dim i As Integer, TimeValueToFind As Date
TimeValueToFind = "04:00:00"
Sheets("Vessels").Range("F07").ClearContents
For i = 1 To 25 '
If Sheets("Vessels").Cells(i, 1).Value = CDbl(TimeValueToFind) Then ' < This was the line changed
MsgBox ("Found value on row " & i)
Sheets("Vessels").Range("F07").Value = Cells(i, 1).Offset(1, 1).Resize(1).Value
Exit Sub
End If
Next i
MsgBox ("Value not found in the range!")
End Sub
Однако это одна другая причина, так как магазины Excel значение, как плавающая точка, каждое значение по-прежнему отличается. «Хорошо известно, что выражение a == b, скорее всего, вернет False, когда a и b оба удваиваются, хотя вы можете подумать, что они одинаковы. Это связано с конечной точностью, с которой хранятся числа с плавающей запятой. "
Путь вокруг этого заключается в установке допуска. If abs(a-b)<tolerance Then
Однако я не особо уверен в том, какую терпимость использовать и как ее можно включить, не запуская первый цикл.
Интересно, может ли кто-нибудь пролить свет на это и направить меня, какие дополнения мне нужно сделать, и какие допуски будут приемлемыми? Я думаю, что вопрос по существу двоякий. Заранее спасибо!
hm ... первый работает для меня. При сравнении «CDate (sheetvalue) =« 04:00:00 »« Я получаю истинное значение – rst
Возможно, стоит отметить, что объект «Range» имеет свойство «.Value2», которое не использует типы даты или валюты, поэтому вернет Вариант/Двойное значение. –
Вы пытались использовать 'TimeValue()' вместо этого? –