2016-10-11 6 views
-1

Начальник VBA и стараюсь учиться как можно больше, поэтому, пожалуйста, не стесняйтесь переубеждать.Excel «Ошибка выполнения« 424 »: требуется объект« При вызове логической функции

Goal: Внутри подпрограммы вызывается функция, возвращающая логическое значение true, когда два объекта перекрываются. Идея заключается в том, чтобы пользователь мог перетаскивать фигуры друг в друга, чтобы легко создавать иерархию.

Проблема: Я получаю «нужный объект» ошибку , как указано в названии на комментировал линии. RecA и RecB - это формы, о которых идет речь в аргументах функции. Функция, названная «Перекрытие», находится в Модуле 1.

Public Sub CommandButton1_Click() 
    Dim Function_Result As Boolean 
    Function_Result = Overlap(RecA, RecB) '<--------! 

    If Function_Result = True Then 
      MsgBox ("swiggity swooty") 
    End If 
End Sub 

Из исследования я только смог найти решение с помощью set модификатора предшествующей Function_Result который я пытался (наряду с другими возможными решениями) безрезультатно.

Если код функции полезен, сообщите мне, и я могу добавить его в этот пост.

Excel 2010

Заранее благодарен!

+0

Где эти формы определены? Если эти фигуры находятся на рабочем листе, и это все код, который у вас есть в CommandButton1_Click() (который, я думаю, должен быть приватным, а не общедоступным), тогда я могу сказать вам, что VBA не распознает RecA и RecB как ничего, кроме пустых переменных , – Tyeler

+0

По крайней мере, опубликуйте заголовок 'Overlap' и где/как' RecA' и 'RecB' определены –

+0

Кроме того, ваша функция использует свойства формы для этого определения? Как '.Left',' .Top', '.Width',' .Height'? – Tyeler

ответ

1

Вы не правильно определили свои формы. Если ваша функция использует свойство объекта для определения совпадения, вам нужно сделать что-то вроде следующего в вашем CommandButton1_Click события:

Private Sub CommandButton1_Click() 
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 'Assumed on worksheet index 1 
    Dim RecA As Shape: Set RecA = ws.Shapes("RecA") 'Assumed RecA is the name of your shape? 
    Dim RecB As Shape: Set RecB = ws.Shapes("RecB") 
    Dim Function_Result As Boolean 

    Function_Result = Overlap(RecA, RecB) 

    If Function_Result = True Then 
      MsgBox ("swiggity swooty") 
    End If 
End Sub 

Таким образом, вы установили свои формы в качестве объектов в VBA и может теперь ссылаются на их свойства объектов.

+0

Это была моя ошибка. Благодаря! Я также ответил на свой вопрос со всем своим кодом для тех, кто пришел после этого, возможно, захочет получить лучшую картину. – JPT

+1

Вы можете удалить часть '= TRUE' инструкции' If ... Then' или, альтернативно, использовать 'IF Overlap (RecA, RecB) Then' и полностью удалить часть' Function_Result'. –

+0

это чище, спасибо! – JPT

0

код, который работает:

Private Sub CommandButton1_Click() 
    Dim Function_Result As Boolean 
    Dim RecA As Shape 
    Dim RecB As Shape 

    Function_Result = Overlap(RecA, RecB) 

    If Function_Result = True Then 
      MsgBox "swiggity swooty" 
    End If 
End Sub 

Я был в состоянии держать его немного более простой, чем ответ Tyeler в, так как я set свои формы в моем Overlap самой (показано ниже) функции.

Function Overlap(RecA As Shape, RecB As Shape) As Boolean 

Dim Shp1Left As Single 
Dim Shp1Right As Single 
Dim Shp1Top As Single 
Dim Shp1Bottom As Single 

Dim Shp2Left As Single 
Dim Shp2Right As Single 
Dim Shp2Top As Single 
Dim Shp2Bottom As Single 

Dim HorOverlap As Boolean 
Dim VertOverlap As Boolean 

Set RecA = Sheet1.Shapes("RecA") 
Set RecB = Sheet1.Shapes("RecB") 

With RecA 
    Shp1Left = .Left 
    Shp1Right = .Left + .Width 
    Shp1Top = .Top 
    Shp1Bottom = .Top + .Height 
End With 

With RecB 
    Shp2Left = .Left 
    Shp2Right = .Left + .Width 
    Shp2Top = .Top 
    Shp2Bottom = .Top + .Height 
End With 
'''''''''''''''''''''''''''''''''''''''''''''' 
' do they overlap horizontally? 
If Shp1Left > Shp2Left Then 
    If Shp1Left < Shp2Right Then 
     HorOverlap = True 
    End If 
End If 
If Shp1Left < Shp2Left Then 
    If Shp1Right > Shp2Left Then 
     HorOverlap = True 
    End If 
End If 

' do they overlap vertically? 
If Shp1Top > Shp2Top Then 
    If Shp1Top < Shp2Bottom Then 
     VertOverlap = True 
    End If 
End If 
If Shp1Top < Shp2Top Then 
    If Shp1Bottom > Shp2Top Then 
     VertOverlap = True 
    End If 
End If 

Overlap = HorOverlap And VertOverlap 

End Function 
+0

В этом случае нет необходимости определять 'RecA' и' RecB' в событии click, просто определите их в Overlap и измените функцию на 'Function Overlap() как boolean' - если вы держите их в щелчке хотя вы могли передавать разные формы функции из других процедур. –

Смежные вопросы