Modificar los controles ActiveX a través de un complemento personalizado en Excel

Estoy trabajando en mover una hoja de trabajo a un complemento para poder actualizar el código sin tener que dar nuevos libros de trabajo a todos. El process ha sido bastante sencillo hasta que llegué al área donde el código adicional necesita modificar los controles ActiveX presentes en la hoja.

El código anterior que estaba usando para modificar estos:

If Sheet1.Range(RowHighlightToggle.LinkedCell).Value = True Then RowHighlightToggle.Caption = "Row Highlight - On" HighlightStatus = 0 Else RowHighlightToggle.Caption = "Row Highlight - Off" HighlightStatus = 1 End If 

RowHightlightToggle es el control ActiveX en cuestión. No estoy seguro de cómo hacer reference a este button al codificar dentro del complemento. Intenté hacer Sheet1.RowHighlightToggle.LinkedCell y eso también me está dando un error. No estoy utilizando Sheet1 dentro del complemento ya que tengo una function para get nombres en key del libro de trabajo de destino, por lo que Sheet1 suele ser algo así como AWSheet1 pero es una variable de Worksheet , por lo que ese tampoco es el problema. Puedo leer el valor de la celda vinculada bastante fácil, pero no tengo forma de cambiar la leyenda del button sin referirme de alguna manera al button dentro del código.

Este button siempre estará presente en el libro de trabajo para el que se está creando este complemento, tengo un código adicional para asegurarme de que el complemento solo sea visible en ese libro de trabajo y se esconda por si mismo.

¿Hay alguna manera de referirse al button a través del complemento o posiblemente una forma de vincular el título a una celda para poder cambiar el valor de la celda y actualizar el título?

Después de investigar un poco más descubrí que puedo referirme a él utilizando OLEObjects , el código de trabajo que incluye el rest del submarino está debajo.

 Sub RowHighlightToggle() '-----Startup Code-------- With Application .ScreenUpdating = False .DisplayStatusBar = False .DisplayAlerts = False End With '------------------------ Dim HighlightStatus As Long, AWSheet1 As Worksheet, ThisButton As Object If TargetWorkbook Is Nothing Then Set TargetWorkbook = ActiveWorkbook Set AWSheet1 = GetWsFromCodeName(TargetWorkbook, "Sheet1") Set ThisButton = AWSheet1.OLEObjects("RowHighlightToggle") Call Common_Functions.StartUnlock If AWSheet1.Range(ThisButton.LinkedCell).Value = True Then ThisButton.Object.Caption = "Row Highlight - On" HighlightStatus = 0 Else ThisButton.Object.Caption = "Row Highlight - Off" HighlightStatus = 1 End If Call Common_Functions.StartLock If Worksheets.Count > 6 Then Call Common_Functions.SheetArrayBuild(TargetWorkbook) For i = LBound(SheetArray) To UBound(SheetArray) Sheets(SheetArray(i, 1)).Range("Z1").Value = HighlightStatus Next i End If '-----Finish Code-------- With Application .ScreenUpdating = True .DisplayStatusBar = True .DisplayAlerts = True .EnableEvents = True End With '------------------------ End Sub 

Y la function para get la hoja de trabajo del libro de trabajo

 Function GetWsFromCodeName(wb As Workbook, CodeName As String) As Excel.Worksheet Dim ws As Excel.Worksheet For Each ws In wb.Worksheets If ws.CodeName = CodeName Then Set GetWsFromCodeName = ws Exit For End If Next ws End Function 

Suponiendo que el control está en Sheet1, debería poder usar:

 Sheet1.RowHightlightToggle.Caption = "Row Highlight - On" 

Pero también puede get el control utilizando la colección de forms:

 Sheet1.Shapes("RowHightlightToggle").DrawingObject.Object.Caption = "Row Highlight - On" 

O bien, con una variable de libro de trabajo más genérica:

 Dim userWorkbook as Workbook Set userWorkbook = Workbooks("UserData.xlsm") userWorkbook.Worksheets("Foo").Shapes("RowHightlightToggle").DrawingObject.Object.Caption = "Row Highlight - On"