2015-07-16 1 views
1

Я работаю над электронной таблицей, которая будет принимать список дат и находить эти даты на другом листе и заполнять некоторую информацию в ячейке ниже даты сопоставления. Данные для поиска выглядят примерно так:
ROW23: dates generated by formula (formatted: d-mmm) ROW24: Mix of empty cells and cells with text and numbers. ROW25: dates generated by formula (formatted: d-mmm) ROW26: Mix of empty cells and cells with text and numbers. and so on
Этот диапазон называется «Календарь» и является Sheet9 (B23: O74). Этот список дат для поиска - «List_Holidays» и является листом5 (B9: B12, B16: B21). После того, как дата будет установлена, текст, который будет возвращен в ячейке ниже, будет «List_HolAbbr» на Sheet5 (A9: A12, A16: A21).Ни с помощью VBA .Find, ни Application.Match, чтобы соответствовать датам в Excel Range, найдите дату

В настоящее время я застрял на стадии 1 этого кода: попробуйте запустить только одну дату.
Этап 2 - это поиск списка дат. Этап 3 заключается в том, что он выполняет поиск только по строкам, которые фактически содержат даты из приведенного выше примера (пропустите строку пустых ячеек и ячеек с текстом/# s.
Этап 4: заполнить ячейку под найденной датой некоторый текст

Моя попытка до сих пор:..

Sub holidays() 
Dim Cal As Range 
Dim vholidays As Long 
Dim cl As Range 
Dim clgcaldate As Range 
Set Cal = Sheets("2015_Consolidated").Range("Calendar") 
'Find this 
Set rgholidays = Worksheets("Holidays_EndPeriods").Range("F10")  'This is the date of the holiday to find in range Calendar 
vholidays = DateValue(rgholidays) 
MsgBox "vholidays is " & vholidays 
'Search this range 
MsgBox "g47 is: " & Sheets("2015_Consolidated").Cells(47, "G") 'G47 is the match to the cell in "rgholidays". 
For Each cl In Cal 
    'With Range("List_Holidays) 
    Set rFound = Cells.Find(what:=vholidays, _ 
         LookIn:=xlValues, _ 
         lookat:=xlWhole, _ 
         SearchOrder:=xlByRows)    'The cell in range Calendar that matches to vholidays 
'Match found 
    If Not rFound Is Nothing Then 
     MsgBox "rFound is " & rFound 
    End If 
    'End With 
    Next cl 
MsgBox "vholidays is " & vholidays & " and is located: " & rFound 
End Sub` 

первые 2 msgbox s являются правильными, но не находит соответствия в G47

Я также попробовал этот код, найденный по адресу: Excel VBA - Using Find method on a range of dates
Вторая попытка, используя те же переменные, что и выше.

`MsgBox "vhol is " & vholidays & " rghol is " & rgholidays 
For Each cl In Cal 
    With rgholidays 
     Set rFound = .Find(vholidays, LookIn:=xlValues, lookat:=xlWhole) 
     If Not rFound Is Nothing Then 
      MsgBox cell 
     End If 
    End With 
Next cl 
End Sub` 

Опять же, это не возвращает соответствия.

http://www.cpearson.com/excel/DateTimeVBA.htm рекомендует использовать DateValue(), чтобы преобразовать даты в серийный номер, что представляется разумным для меня, и я попробовал его в первом примере.

Я нашел несколько других ссылок, но они еще больше удалены из того, что я пытаюсь сделать.
Любые предложения, чтобы сделать эту работу?

Редактировать: Я установил условие, чтобы проверить, были ли форматы одинаковыми для значения поиска и значения, которое оно должно найти. Он сказал, что они такие же. Тестирование окна поиска/замены gui в электронной таблице «find» не определяет правильную ячейку независимо от параметров поиска/замены.

Редактировать: Я попробовал Application.Match. Не найдено совпадений. Это проходит через каждый столбец в диапазоне, который ищет совпадение с датой, но ничего не находит.

Sub holidays() 

Dim Calendar As Range 
Dim cl As Range 
Dim rFound As Variant 
Dim findthis As Double 
Dim rng As Range 
Dim Cal As Range 

Set Cal = Sheets("2015_Consolidated").Range("Calendar") 
findthis = CDate(CLng(Sheets("2015_Consolidated").Range("K17"))) '"1/13/2015" 
Debug.Print "find this:" & findthis 
Debug.Print "cell d23: " & ActiveSheet.Cells(23, 4) 
For Each rng In Range("Calendar").Columns 
    Debug.Print rng.Address 
    rFound = Application.Match(findthis, rng.Address, 0) 

    If IsError(rFound) Then 
    Debug.Print "Not found" 
    Else 
    Debug.Print rFound 
    End If 
Next rng 
End Sub 

ответ

0

Afer вы установили «Cal» и «rgholidays» переменные в коде, попробуйте:

For each cell in Cal 
    if format(rgholidays,"m/d/yyyy")=format(cell,"m/d/yyyy") then 
     'Cell has the same date, do some code 
    endif 
Next cell 

При работе с датами, другой способ работы с ними форматировать их ггггммдд, то Например, большие числа всегда более поздние, чем более мелкие. Это должно стать первой стадией вашего вопроса, чтобы найти даты. Этап 2 и 4 должны быть некоторыми версиями этого кода в сочетании с тем, что вы пишете. Этап 3 может быть сложным, если только ваша строка не-дат всегда постоянна.

+0

Для «ячейки», вы имеете в виду мою переменную «cl»? – mechengr02

+0

Пробовал. Он все еще не находит его. Я установил условие для проверки, были ли форматы одинаковыми для значения поиска и значения, которое оно должно найти. Он сказал, что они такие же. – mechengr02

+0

Не находите это вы имеете в виду код, который вы написали вместо комментария «сделать какой-то код», который не запускался или что-то другое? – user3476534

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

  • Нет связанных вопросов^_^