2016-02-21 3 views
0

У меня есть код следующим образом:VBA, Гото ячейки с определенным значением (типа: дата)

Sub Find_First() 
    Dim FindString As String 
    Dim Rng As Range 
    FindString = Range("A1") 
    If Trim(FindString) <> "" Then 
     With Sheets("Kalendarz").Range("A5:LY5") 
      Set Rng = .Find(What:=FindString, _ 
          After:=.Cells(.Cells.Count), _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchOrder:=xlByRows, _ 
          SearchDirection:=xlNext, _ 
          MatchCase:=False) 
      If Not Rng Is Nothing Then 
       Application.Goto Rng, True 
      Else 
       MsgBox "Nothing found" 
      End If 
     End With 
    End If 
End Sub 

, но он не работает с форматом даты, любое предложение?

Подробнее: В ячейке A1 я укажу дату, в строке 5. У меня есть список каждого дня в 2016 году. Я хочу (после запуска макроса) перейти к ячейке с датой из ячейки A1.

+0

[См это] (http://www.ozgrid.com/VBA/find-dates.htm). Ваш код работает для меня со стандартным форматированием даты в формате Excel (MM/DD/YYYY), поэтому, вероятно, это связано с вашим конкретным форматированием даты. – ARich

ответ

3

Использование функции Find, чтобы найти дату, как известно, сложно в Excel VBA. Функция зависит от того, отформатирована ли ваша дата поиска так же, как настройка по умолчанию в Excel. Кроме того, вам необходимо убедиться, что строка поиска преобразуется в дату в функции Find, используя CDate. OzGrid имеет хорошую статью о нем: http://www.ozgrid.com/VBA/find-dates.htm

Я исправленный код ниже, чтобы удовлетворить эти требования и добавлены дополнительные With Sheets... заявление для обеспечения FindString использует Range от вашего целевого листа.

Однако из-за непредсказуемости форматов даты для пользователей, я предпочитаю цикл VBA, используя Value2, который является численным представлением Excel в дате, поэтому его невозможно воспроизвести. Статья Ozgrid предпочитает не использовать циклы VBA, когда функция Find работает намного быстрее, но я думаю, что это вопрос личных предпочтений, и я чувствую, что на заказ цикл более надежный.

До вас, с кем вы хотите пойти.

Find метод:

Sub Find_First() 
    Dim FindString As String 
    Dim Rng As Range 

    With Sheets("Kalendarz") 
     FindString = .Range("A1") 
     If Trim(FindString) <> "" Then 
      With .Range("A5:LY5") 
       Set Rng = .Find(What:=CDate(FindString), _ 
           After:=.Cells(1), _ 
           LookIn:=xlValues, _ 
           LookAt:=xlWhole, _ 
           SearchOrder:=xlByRows, _ 
           SearchDirection:=xlNext, _ 
           MatchCase:=False) 
       If Not Rng Is Nothing Then 
        Application.Goto Rng, True 
       Else 
        MsgBox "Nothing found" 
       End If 
      End With 
     End If 
    End With 
End Sub 

Метод петли VBA:

Sub Find_First_VBA_Loop() 
    Dim dateVal As Long 
    Dim cell As Range 

    With Sheets("Kalendarz") 
     dateVal = .Range("A1").Value2 
     For Each cell In .Range("A5:LY5").Cells 
      If dateVal = cell.Value2 Then 
       Application.Goto cell, True 
       Exit For 
      End If 
     Next 
    End With 

End Sub 
+0

Да, это работает! благодаря :) – ana0890

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