如果VBA中存在特定工作表,如何在Excel中禁用功能区按钮
我正在构建一个Excel加载项,允许用户与PowerPoint交互并导出数据。用户可以通过功能区中的按钮将模板插入现有工作簿。当他们单击此按钮时,该按钮将被禁用,因为一个工作簿中不能有两个模板 然后,用户可以保存他们的工作簿,并在稍后返回。我的问题是,我需要检测他们是否将模板插入到现有工作簿中,我通过尝试检测是否存在命名范围(称为如果VBA中存在特定工作表,如何在Excel中禁用功能区按钮,vba,excel,Vba,Excel,我正在构建一个Excel加载项,允许用户与PowerPoint交互并导出数据。用户可以通过功能区中的按钮将模板插入现有工作簿。当他们单击此按钮时,该按钮将被禁用,因为一个工作簿中不能有两个模板 然后,用户可以保存他们的工作簿,并在稍后返回。我的问题是,我需要检测他们是否将模板插入到现有工作簿中,我通过尝试检测是否存在命名范围(称为LoadedToken)来实现这一点 我遇到的问题是,功能区的onLoad功能和VBA类Auto_Open在大型工作簿完全加载之前启动。因此,我没有实际检测模板是否存在
LoadedToken
)来实现这一点
我遇到的问题是,功能区的onLoad
功能和VBA类Auto_Open
在大型工作簿完全加载之前启动。因此,我没有实际检测模板是否存在,也不能实际禁用按钮
Excel中是否存在可以在工作表级别(如工作表_open
)调用但在类中检测到的事件
我的代码是:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' When the Ribbon loads
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub OnRibbonLoad(ribbonUI As IRibbonUI)
Set MyRibbonUI = ribbonUI
Dim Authenticate As New AuthenticationClass
On Error Resume Next
' Enable/Disable buttons based on authentication status
If Authenticate.Authentify = False Then
Authenticated = False
Debug.Print ("Unauthorized!")
Else
Authenticated = True
Debug.Print ("Authorized!")
End If
' If the template doesn't exist then disable a grouping on the ribbon
If TemplateExists = False Then
Call RefreshRibbon(Tag:="Grouping1")
Else
Call RefreshRibbon(Tag:="Grouping2")
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Check if the Template sheet is visible and prevent other buttons from working
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function TemplateExists()
Dim Helpers As New HelpersClass
If Helpers.IsNamedRange("LoadedToken") Then
TemplateExists = True
Else
TemplateExists = False
End If
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' From the Helpers Class - Check if a named range exists
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function IsNamedRange(RName As String) As Boolean
Dim N As name
IsNamedRange = False
For Each N In ActiveWorkbook.Names
If N.name = RName Then
IsNamedRange = True
Exit For
End If
Next
End Function
注意:身份验证类只是连接到我的API的另一个类。@findwindow没有必要,因为这是一个推理类question@findwindow很好的反馈。我已经讲了最后一句话。嗯,这不是最花哨的,但是你可以在自动打开的窗口中添加一个
Application.OnTime(Now+Timevalue(“00:00:02”)
,以延迟检查。这感觉不太对,而且可能不稳定。哦,也许你可以尝试从类中用with events
抓取事件。@vacip我添加了一些代码,让我们可以制定一个答案。您能否演示WithEvents功能?我的代码应该足够详细。@findwindow没有必要,因为这是一个散漫的代码question@findwindow很好的反馈。我已经讲了最后一句话。嗯,这不是最花哨的,但是你可以在自动打开的窗口中添加一个Application.OnTime(Now+Timevalue(“00:00:02”)
,以延迟检查。这感觉不太对,而且可能不稳定。哦,也许你可以尝试从类中用with events
抓取事件。@vacip我添加了一些代码,让我们可以制定一个答案。您能否演示WithEvents功能?我的代码应该足够详细。