Ошибка VBA - переменная объекта или переменная блока не задана в событии рабочего листа - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть макрос, настроенный для добавления блоков на диаграмму и связывания их с таблицами на двух других листах.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Declare and assign values to sh1 and sh2
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = ActiveWorkbook.Sheets("Training Master")
Set sh2 = ActiveWorkbook.Sheets("Attendance Master")




'Declare and assign values to sp1 and sp2
Dim sp1 As Range
Dim sp2 As Range
Set sp1 = sh1.Range("C:C").Find("2nd Process")
Set sp2 = sh2.Range("C:C").Find("2nd Process")

'Adds boxes to organizational chart
Target.Borders(xlEdgeBottom).LineStyle = xlDouble
Target.Borders(xlEdgeLeft).LineStyle = xlDouble
Target.Borders(xlEdgeRight).LineStyle = xlDouble
Target.Borders(xlEdgeTop).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeBottom).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeLeft).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeRight).LineStyle = xlDouble
Target.Interior.ColorIndex = 45
Target.Font.ColorIndex = 3

'Adds line to table in Training Master, links appropriate cells to 
organizational chart
sp1.Offset(0, -2).Resize(1, 19).Insert
sp1.Offset(-2, -1).Copy sp1.Offset(-1, -1)
sp1.Offset(-2, 9).Copy sp1.Offset(-1, 9)

'Adds line to table in Attendance Master, returns error 91
sp2.Resize(1, 7).Insert 'Debug identifies this line as error 91
sp2.Offset(-2).Copy sp2.Offset(-1)

End Sub

Кажется, что каждой переменной было присвоено значение, и я дважды и трижды проверил, что написание имен листов соответствует ссылке в коде.Почему я получаю:

ошибка 91 Переменная объекта или переменная блока не установлена ​​

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Ошибка возникает из-за того, что sp1 - ничто, ошибка Offest не выполняется.Немного измените свой код на этот, чтобы проверить, является ли он «Нечто», и действуйте соответственно:

'Adds line to table in Training Master, links appropriate cells to
    MsgBox sp1 Is Nothing
If Not sp1 Is Nothing Then
    MsgBox sp1.Address
    sp1.Offset(0, -2).Resize(1, 19).Insert
    sp1.Offset(-2, -1).Copy sp1.Offset(-1, -1)
    sp1.Offset(-2, 9).Copy sp1.Offset(-1, 9)
End If
0 голосов
/ 08 февраля 2019

После использования метода Range.Find всегда проверяйте, если поиск прошел успешно:

Set sp1 = sh1.Range("C:C").Find("2nd Process")

If sp1 Is Nothing Then
    MsgBox "2nd Process was not found in " & sh1.Name
    Exit Sub
End If

Я настоятельно рекомендую всегда указать параметр LookAt дляметод поиска:

  • Либо Find(What:="2nd Process", LookAt:=xlWhole) для поиска значений всей ячейки,
  • или Find(What:="2nd Process", LookAt:=xlPart) для поиска части значения ячейки.

Если вы не укажете параметр LookAt, Excel будет использовать тот, который использовался последним либо VBA, либо вручную, используя find.Поэтому, если вы не укажете его, вы никогда не узнаете, какой из Excel использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...