Проблема со ссылкой на VBA

#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:

Проблемы в вашем коде

Другие улучшения

  • Если вы собираетесь выйти на цель.Посчитайте > 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