Если рабочий лист не отображается при запуске макроса, .find() — это ничто

#excel #vba

Вопрос:

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

вариант использования: Макрос должен активировать/выбрать лист в активной книге. Затем найдите на этом активном листе дату/строку. Если он найден, он сохранит диапазон в переменной. В случае, если переменная ничего не значит, то макрос должен остановиться.

проблема: Если лист не был выбран/активирован при запуске макроса, то .find() не работает. Каждый раз, когда я получал «ничего» в ответ. Если рабочий лист был выбран/активирован при запуске макроса (отображается на моем мониторе), то он работает.

Я также проверил проблему на другом компьютере. Но это происходит и там…

     Dim rngFirst As Range
    Dim rngNext As Range
    Dim rngArea As Range
    Set rngArea = Range("A:Z")
    Dim defaultValue As Date, insertedDate As Date
    defaultValue = Format(Date, "dd.mm.yyyy")
    insertedDate = Application.InputBox(message, title, Format(defaultValue, "dd.mm.yyyy"), Type:=1)

    ActiveWorkbook.Sheets("mySheet").Activate
    Do
      If rngFirst Is Nothing Then
         Set rngFirst = rngArea.Find(What:=insertedDate, After:=rngArea(1))     'the problem start with this code line. What I got back is "Nothing"
         Set rngNext = rngFirst
         If rngNext Is Nothing Then
            MsgBox "There was a problem with finding the meeting date. Please check!"   Chr(10)   "The Macro will end here."
            Exit Sub
         End If
      Else
         'Do something with what was found
         'find the next entry in the sheet
         Set rngNext = rngArea.Find(What:=insertedDate, After:=rngNext)
         If rngNext.Address = rngFirst.Address Then Exit Do
      End If
    Loop

 

Примечание: К сожалению, у меня нет администратора на моем рабочем компьютере… Но я думаю, что это не имеет значения.

Комментарии:

1. Set rngArea = Range("A:Z") ссылается на активный лист, и это происходит перед активацией нужного вам листа . На самом деле нет необходимости активировать лист в обсуждении. Попробуйте Set rngArea = Sheets("mySheet").Range("A:Z") и ничего не активируйте.

2. Спасибо! Я добавил рабочий код ниже.

Ответ №1:

Это решено. Это был неправильный способ мышления… Комментарий под моим вопросом объясняет решение.

Вот рабочий код:

     Dim rngFirst As Range
    Dim rngNext As Range
    Dim rngArea As Range
    Set rngArea = Sheets("mySheet").Range("A:Z")       'added solution here
    Dim defaultValue As Date, insertedDate As Date
    defaultValue = Format(Date, "dd.mm.yyyy")
    insertedDate = Application.InputBox(message, title, Format(defaultValue, "dd.mm.yyyy"), Type:=1)

    Do
      If rngFirst Is Nothing Then
         Set rngFirst = rngArea.Find(What:=insertedDate, After:=rngArea(1))     'the problem start with this code line. What I got back is "Nothing"
         Set rngNext = rngFirst
         If rngNext Is Nothing Then
            MsgBox "There was a problem with finding the meeting date. Please check!"   Chr(10)   "The Macro will end here."
            Exit Sub
         End If
      Else
         'Do something with what was found
         'find the next entry in the sheet
         Set rngNext = rngArea.Find(What:=insertedDate, After:=rngNext)
         If rngNext.Address = rngFirst.Address Then Exit Do
      End If
    Loop