2015-08-24 5 views
2

Это мой код:Excel-VBA: поиск ячейки с определенным значением времени

Sub FindMatchingValue() 
    Dim i As Integer, TimeValueToFind As Date 
    TimeValueToFind = "00:00:00" 
    Sheets("Vessels").Range("F07").ClearContents 
    For i = 1 To 25 ' 
     If 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 в течение времени, введенного в формате хх: хх: хх И где вход и где время написано, устанавливаются как формат «Время»

Существует стол со временем с 00:00:00 до 23:00:00 в столбце A. По какой-то причине этот код будет работать только тогда, когда пытаясь найти 00:00:00, никакое другое значение времени не найдено вообще. Я не могу понять причину.
Я думал, что это может быть потому, что TimeValueToFind - это «как дата». Однако, похоже, нет «как время»? Непонятно, почему это не работает. И если это так, почему это не работает, почему 00:00:00 найдено, но ничего больше? Это простая ошибка, я готов поспорить, но помощь будет принята с благодарностью.

Для получения дополнительной информации:

Tidal Время Колонка А.

Tidal Time Tidal Height 
00:00:00  
01:00:00  
02:00:00  
03:00:00  
04:00:00 4.40 
05:00:00 4.00 
06:00:00 3.60 
07:00:00 3.20 
08:00:00 2.80 
09:00:00 2.40 
10:00:00 2.00 
11:00:00 2.37 
12:00:00 2.74 
13:00:00 3.11 
14:00:00 3.49 
15:00:00 3.86 
16:00:00 4.23 
17:00:00 4.60 
18:00:00 4.13 
19:00:00 3.67 
20:00:00 3.20 
21:00:00 2.73 
22:00:00 2.27 
23:00:00 1.80 

Entirity в колонке А время. Теперь важно понять, что на какое-то время я уже пробивал себе лицо, так как для i до 25 должно было быть от 2 до 25, String Tidal Height - неправильный формат, и это стало причиной ошибки missmatch.

+0

Проверьте, действительно ли IsDate (ячейка типа 00:00:00) возвращает значение true. –

ответ

1

Это потому, что вы пытаетесь сравнить яблоки и апельсины. TimeValueToFind имеет тип Date и Sheets("Vessels").Cells(i, 1).Value дает double (добавьте оба окна часов и проверьте).

Вы можете заставить его работать либо путем преобразования TimeValueToFind в double или отливки Sheets("Vessels").Cells(i, 1).Value к Date:

' (...) 
If CDate(Sheets("Vessels").Cells(i, 1).Value) = TimeValueToFind Then 
' (...) 

Или:

' (...) 
delta = Sheets("Vessels").Cells(i, 1).Value - CDbl(TimeValueToFind) 
If Abs(delta) <= tolerance Then 
' (...) 
+0

Отлично, спасибо большое – Savagefool

+1

Хм с CDate Я получаю ошибку типа missmatch. И преобразование TimeValueToFind в CDbl не находит значение времени, введенное либо из-за допусков, а только для примечания. – Savagefool

+0

Обновлен ответ, чтобы отразить недостаток точности двойника, как вы (и другие) отметили. Старые привычки умирают тяжело ... Что касается несоответствия типа, это может быть связано с форматом ценности вашей ячейки, так как функция «CDate» учитывает ваши региональные настройки при конвертировании. – ssarabando

1

Excel хранит раз в долях суток. Таким образом, час 00:00:00 составляет 0/24 дня. Час 01:00:00 - 1/24-й день или .041666 и т. Д. Вам нужно сравнить эти значения. Если вы проверите значение в столбце A, вы увидите, что это число от 0 до 1. Если вы запускаете что-то вроде этого, вы можете видеть, что происходит.

Sub Test() 
Dim i As Integer 
Dim Test As Variant 

For i = 1 To 24 
    Test = Sheets("Sheet1").Cells(i, 1).Value 
    Sheets("Sheet1").Cells(i, 2).Value = Test 
Next i 

End Sub 
1

Внутренне, Excel хранит номера как double. Хорошо известно, что выражение a==b, скорее всего, вернет False, когда a и b оба являются удвоенными, хотя вы могли бы подумать, они одинаковы. Это связано с конечной точностью, с которой хранятся числа с плавающей запятой.

У вас есть различные варианты.

1) Установите допуск. If abs(a-b)<tolerance Then

2) Преобразуйте в строку с фиксированным количеством цифр и сравните строки. Это явно делает то, что указано выше, неявно

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

+0

Ah awesome, спасибо за разъяснение! – Savagefool