如果VBA中存在特定工作表,如何在Excel中禁用功能区按钮

如果VBA中存在特定工作表,如何在Excel中禁用功能区按钮,vba,excel,Vba,Excel,我正在构建一个Excel加载项,允许用户与PowerPoint交互并导出数据。用户可以通过功能区中的按钮将模板插入现有工作簿。当他们单击此按钮时,该按钮将被禁用,因为一个工作簿中不能有两个模板 然后,用户可以保存他们的工作簿,并在稍后返回。我的问题是,我需要检测他们是否将模板插入到现有工作簿中,我通过尝试检测是否存在命名范围(称为LoadedToken)来实现这一点 我遇到的问题是,功能区的onLoad功能和VBA类Auto_Open在大型工作簿完全加载之前启动。因此,我没有实际检测模板是否存在

我正在构建一个Excel加载项,允许用户与PowerPoint交互并导出数据。用户可以通过功能区中的按钮将模板插入现有工作簿。当他们单击此按钮时,该按钮将被禁用,因为一个工作簿中不能有两个模板

然后,用户可以保存他们的工作簿,并在稍后返回。我的问题是,我需要检测他们是否将模板插入到现有工作簿中,我通过尝试检测是否存在命名范围(称为
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功能?我的代码应该足够详细。