通过Excel中的自定义加载项来修改ActiveX控件
我正在将一个工作表移动到一个加载项中,这样我就可以更新代码,而无需向每个人提供新的工作簿。 这个过程相当直接,直到我到了附加代码需要修改表单中存在的ActiveX控件的区域。
我之前使用的代码来修改这些:
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
是有问题的ActiveX控件。 在加载项内编码时,我不确定如何引用此button。 我试过做Sheet1.RowHighlightToggle.LinkedCell
,这也给我一个错误。 我没有在加载项中使用Sheet1
,因为我有一个函数从目标工作簿中获取代码名,所以Sheet1
通常是类似AWSheet1
东西,但它是一个Worksheet
variables,所以这也不是问题。 我可以很容易地阅读链接的单元格的值,但我没有办法改变button标题,而不用参考代码中的button。
此button将始终存在于正在制作此加载项的工作簿中,我还有其他代码以确保加载项仅在该工作簿中可见,并隐藏其他任何人。
有没有办法通过加载项引用button或可能的方式将标题链接到单元格,所以我可以更改单元格值来更新标题?
经过多一点的研究后,我发现我可以通过使用OLEObjects
来引用它,包括其余的sub的工作代码如下。
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
以及从工作簿中获取工作表的function
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
假设控件在Sheet1上,你应该可以使用:
Sheet1.RowHightlightToggle.Caption = "Row Highlight - On"
但是你也可以使用形状集合进行控制:
Sheet1.Shapes("RowHightlightToggle").DrawingObject.Object.Caption = "Row Highlight - On"
或者,使用更通用的工作簿variables:
Dim userWorkbook as Workbook Set userWorkbook = Workbooks("UserData.xlsm") userWorkbook.Worksheets("Foo").Shapes("RowHightlightToggle").DrawingObject.Object.Caption = "Row Highlight - On"