#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