2016-12-23 3 views
0

Я хочу, чтобы иметь возможность сравнивать 2 ячейки в VBA. Проблема, с которой я сталкиваюсь, заключается в том, что она не делает точное совпадение.Найти точное значение другой ячейки - Excel - VBA

Dim WeekNum2 As Integer 
WeekNum2 = Cells(1, 12).Value 
Range("F2:F60").Find(WeekNum2).Activate 
U = ActiveCell.Row 
Range(Cells(U, 7), Cells(U, 7)).Value = GreenCountP4 
Range(Cells(U, 8), Cells(U, 8)).Value = YellowCountP4 
Range(Cells(U, 9), Cells(U, 9)).Value = RedCountP4 

Выше приведен фрагмент кода, который не работает идеально. Значение в Cells(1,12) генерируется с использованием формулы , поэтому в зависимости от даты в K1 оно возвращает значение от 1-52. Я хочу, чтобы он принял это значение, а затем нашел эквивалентное значение в диапазоне F2: F60.

В F2:F60 У меня есть значения, идущие в порядке от «w46» - «w52», а затем «w1» - «w52». Проблема в том, что если значение в Cells(1, 12) равно, например, 5, оно выберет первую строку с 5 в ней в диапазоне (в этом случае w50).

Можно ли сравнивать только числа в ячейке (так что не включайте «w», пока он все еще присутствует). Если нет, то как я могу это сделать, чтобы получить точные значения (Итак, если значение в Cells(1, 12) равно 5, то оно идет вправо 5 вместо первых 5 в диапазоне)

ответ

0

использование xlWhole значение для lookat аргумента Find() метода:

Range("F2:F60").Find("W" & WeekNum2, lookat:=xlWhole, LookIn:=xlValues).Activate 
U = ActiveCell.Row 

Кроме того, вы можете избежать Select и прямо идти, как следует:

U = Range("F2:F60").Find("W" & WeekNum2, lookat:=xlWhole, LookIn:=xlValues).Row 
+0

Используя этот метод, потому что он более лаконичен, приветствует! – Dullspark

0

Вы можете «обмануть» мало, сделайте значение 5 как «W5», а затем найдите совпадение для этого в вашем диапазоне. Просто добавьте еще одну переменную, назовем ее WeekNum2String и добавим «W» в качестве префикса. Теперь вы можете искать свой диапазон с помощью Range("F2:F60").Find(WeekNum2String).

Dim WeekNum2String As String 

WeekNum2String = "W" & Cells(1, 12).Value 

Примечание: вы должны использовать метод Find путем определения диапазона, а затем установить его на Find результат (а не с Activate) .Этот метод позволит вам перехвата ошибок, если нет Find.

Как это:

Dim FindRng As Range 
Set FindRng = Range("F2:F60").Find(WeekNum2String) 

If Not FindRng Is Nothing Then 
    U = FindRng.Row 
Else 
    MsgBox "Week number " & Cells(1, 12).Value & " not found in Range" 
End If 
+0

Хорошо исправить, хороший способ вокруг него ура! – Dullspark

+0

@Dullspark спасибо, посмотрите отредактированный код, как ловушка, если 'Find' не увенчался успехом –

0

Я предлагаю вам использовать дополнительный аргумент метода Find, которая позволяет утверждать, что вся клетка соответствует, а не только некоторое подмножество текста внутри. Вы хотите использовать аргумент LookAt и установить его в xlWhole. Теперь ничего не будет найдено для «5», потому что ни одна ячейка не будет полностью соответствовать «5». Ячейки, содержащие «w5», не совпадают с LookAt: = xlWhole. Я знаю, что именование аргументов совсем не интуитивно ...

Кроме того, жизнь была бы намного проще, если бы вы просто использовали строку «w5» в своем поиске. Альтернативой было бы вывести w из ячеек в диапазон поиска (поиска). Это можно сделать с помощью метода split.

+0

Я, вероятно, избавлюсь от w в диапазоне поиска. Я предполагаю, что нет возможности заставить функцию = WEEKNUM() возвращать «w5» вместо «5»? – Dullspark

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