Как правильно назначить макрос фигуре?

У меня есть книга под названием BOOK1, в которой есть лист TEST и фигура TESTSHAPE. В коде vba для листа у меня есть следующий код, который позволяет пользователю щелкать фигуру и переключаться между цветами.

  Dim sh As Shape
   Set sh = Me.Shapes(Application.Caller)
   
   
  'If red go black
If sh.Fill.ForeColor.RGB = RGB(255, 1, 2) Then
sh.Fill.ForeColor.RGB = RGB(0, 0, 0)
sh.Fill.Transparency = 0.45
sh.Line.ForeColor.RGB = RGB(198, 0, 241)
sh.Line.Visible = False

'If black go white
ElseIf sh.Fill.ForeColor.RGB = RGB(0, 0, 0) Then
sh.Fill.ForeColor.RGB = RGB(255, 255, 255)
sh.Fill.Transparency = 0.95
sh.Line.ForeColor.RGB = RGB(198, 0, 241)
sh.Line.Visible = False

'If white go red
ElseIf sh.Fill.ForeColor.RGB = RGB(255, 255, 255) Then
sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
sh.Fill.Transparency = 0.55
sh.Line.ForeColor.RGB = RGB(198, 0, 241)
sh.Line.Visible = False


ElseIf sh.Fill.ForeColor.RGB = RGB(255, 255, 255) Then
sh.Fill.ForeColor.RGB = RGB(0, 200, 20)
sh.Fill.Transparency = 0.55
sh.Line.ForeColor.RGB = RGB(198, 0, 241)
sh.Line.Visible = False

Else
sh.Fill.ForeColor.RGB = RGB(255, 255, 255)
sh.Fill.Transparency = 0.89
sh.Line.ForeColor.RGB = RGB(198, 0, 241)
sh.Line.Visible = False
End If

End Sub

Это работает нормально, но если я скопирую лист в новую книгу, например, КНИГУ2, макрос, назначенный фигуре, перестанет работать, поскольку он все еще связан с листом в первой книге. Тогда мне придется вручную переназначить макрос

Когда я переименовываю макрос в имя листа, ссылка на макрос для фигуры становится TEST.One_Click, что имеет смысл, но после копирования листа в BOOK2 ссылка становится !BOOK1.TEST.One_Click, что, очевидно, не работает в BOOK2.

Как сделать так, чтобы он перестал ссылаться на книгу и оставался только на листе?

Есть ли способ полностью разместить макрос на листе, чтобы его можно было скопировать в другие книги и при этом работать без необходимости работы пользователя с макросами?

thespreadsheetguru.com/…
BigBen 22.04.2024 19:59
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, попробуйте добавить это в модуль кода листа, где находится Tester:

Private Sub Worksheet_Activate()
    Dim shp As Shape, arr, el
    'list of macros to re-link
    arr = Array("Tester", "DoSomething", "LastOne")
    For Each shp In Me.Shapes
        Debug.Print shp.OnAction
        For Each el In arr
            If InStr(shp.OnAction, el) > 0 Then
                shp.OnAction = Me.CodeName & "." & el
                Exit For 'stop checking this shape
            End If
        Next el
    Next shp
End Sub

Sub Tester()
    Debug.Print "Tester"
End Sub
Sub DoSomething()
    Debug.Print "DoSomething"
End Sub
Sub LastOne()
    Debug.Print "LastOne"
End Sub

Он переназначит любые фигуры, OnAction которых указывает на один из макросов, перечисленных в arr.

Альтернативно вы можете просто проверить любую фигуру на наличие OnAction и заменить первую часть:

Private Sub Worksheet_Activate()
    Dim shp As Shape, a, arr
    For Each shp In Me.Shapes
        a = shp.OnAction
        If Len(a) > 0 Then
            arr = Split(a, ".")
            shp.OnAction = Me.CodeName & "." & arr(UBound(arr))
        End If
    Next shp
End Sub

Привет! Спасибо, все сработало отлично. Как мне изменить его, чтобы он назначал определенные фигуры одному макросу, а определенные формы другому? Я подумывал добавить if внутри вашего кода, чтобы проверять наличие определенных имен фигур в массиве?

Matt Laming 23.04.2024 10:31

Вам нужно только переназначить существующие ссылки? Если проблема заключалась в копировании листа, я предполагаю, что все фигуры уже связаны?

Tim Williams 23.04.2024 17:34

Да, фигуры уже связаны. Но если у меня есть два типа фигур с разными макросами, я хочу, чтобы они могли повторно связать оба.

Matt Laming 23.04.2024 19:52

Второй пример выше повторно свяжет любую фигуру, у которой уже есть ссылка.

Tim Williams 23.04.2024 19:59

Другие вопросы по теме