#excel #vba
Вопрос:
Я в недоумении, почему я получаю ошибку 91 во время выполнения: «переменная объекта или с переменной блока не установлена», Что я здесь делаю не так и как это исправить?
Заранее благодарю вас!
Set StartCell = Worksheets("Data").Range("A5")
Set StartSheet = Worksheets("Data")
With Worksheets("Data").Range("A4:BZ4")
Set LastColumn = .Find("Comment", LookIn:=xlValues)
Debug.Print StartCell.Row
Debug.Print StartCell.Column
Set Workrange = Range(StartSheet.Cells(StartCell.Row, StartCell.Column), StartSheet.Cells(5000, LastColumn.Column)) 'This line is the issue
End With
If Not Intersect(Target, Workrange) Is Nothing Then
If Target.Count > 1 Then Exit Sub
StartSheet.Cells(Target.Row, LastColumn.Column 1).Value = Environ("username")
StartSheet.Cells(Target.Row, LastColumn.Column 2).Value = Format(Now, "dd/mm/yyyy_hh.mm.ss")
End If
End Sub
Комментарии:
1. Вы предполагаете, что
Find
это удалось. Этого не произошло, такLastColumn
и естьNothing
.2.
LastColumn
вероятно, не установлен, потому.find
что ничего не вернул. В стороне; в строке с ошибкой на внешнейrange
стороне должна быть ссылка на лист, и вы можете сократитьStartSheet.Cells(StartCell.Row, StartCell.Column)
доStartCell
3. Когда вы
Debug.Print LastColumn
, что это такое, что вы видите?4. Я все равно рекомендовал бы проверить ваши декларации. Я удалил свой предыдущий вопрос «ответ».
5. Если этот код является частью обработчика событий рабочего листа, то вам не нужно явно ссылаться на лист — это уже значение по умолчанию в модуле рабочего листа… Или вы можете использовать
Me
, если хотите быть откровенным.
Ответ №1:
Проблемы в вашем коде
Find
возможно, вы не ответите на удар, проверьте этоFind
использует последние заданные значения для нескольких параметров. Отсутствие их указания может привести к неожиданным результатам.
Другие улучшения
- Если вы собираетесь выйти на цель.Посчитайте > 1, а затем просто сделайте это
- В коде Worrksheet, стоящем за модулем, используйте
Me
ссылку на этот лист - Приглушите свои переменные
- Удалено избыточное С
- Очищена громоздкая ссылка на диапазон
Private Sub Worksheet_Change(ByVal Target As Range)
Dim StartCell As Range
Dim LastColumn As Range
Dim Workrange As Range
If Target.Count > 1 Then Exit Sub
Set StartCell = Me.Range("A5")
'Debug.Print StartCell.Row
'Debug.Print StartCell.Column
Set LastColumn = Me.Range("A4:BZ4").Find( _
What:="Comment", _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
MatchCase:=False, _
MatchByte:=TRUE) ' only need MatchByte if you have selected or installed double-byte language support.
If Not LastColumn Is Nothing Then
Set Workrange = Me.Range(StartCell, Me.Cells(5000, LastColumn.Column))
If Not Intersect(Target, Workrange) Is Nothing Then
Me.Cells(Target.Row, LastColumn.Column 1).Value = Environ("username")
Me.Cells(Target.Row, LastColumn.Column 2).Value = Format$(Now, "dd/mm/yyyy_hh.mm.ss")
End If
End If
End Sub