Vba 在Options.DefaultHighlightColorIndex更改后刷新内置功能区按钮并避免退出";文本突出显示颜色“;

Vba 在Options.DefaultHighlightColorIndex更改后刷新内置功能区按钮并避免退出";文本突出显示颜色“;,vba,ms-word,Vba,Ms Word,我正在努力实现的目标: Sub cycleThroughSomeDefaultHighlightColorIndexOptions() Dim zeNewColor As Long Select Case Options.DefaultHighlightColorIndex Case wdYellow: zeNewColor = wdBrightGreen Case wdBrightGreen: zeNewColor = wdTurquoise

我正在努力实现的目标:

Sub cycleThroughSomeDefaultHighlightColorIndexOptions()
Dim zeNewColor As Long

Select Case Options.DefaultHighlightColorIndex
       Case wdYellow:      zeNewColor = wdBrightGreen
       Case wdBrightGreen: zeNewColor = wdTurquoise
       Case wdTurquoise:   zeNewColor = wdPink
       Case wdBlue:        zeNewColor = wdRed
       Case wdRed:         zeNewColor = wdYellow
       Case Else:          zeNewColor = wdYellow
End Select
Application.Options.DefaultHighlightColorIndex = zeNewColor

End Sub
  • 通过键绑定激活文本高亮显示颜色命令(不是问题)
  • 通过相同的键绑定循环5种默认文本高亮显示颜色(或仅高亮显示所选内容,具体取决于所选内容。在下面的函数外选中类型)
    • 在相应按钮(内置功能区)中显示当前颜色
我被困的地方:

Sub cycleThroughSomeDefaultHighlightColorIndexOptions()
Dim zeNewColor As Long

Select Case Options.DefaultHighlightColorIndex
       Case wdYellow:      zeNewColor = wdBrightGreen
       Case wdBrightGreen: zeNewColor = wdTurquoise
       Case wdTurquoise:   zeNewColor = wdPink
       Case wdBlue:        zeNewColor = wdRed
       Case wdRed:         zeNewColor = wdYellow
       Case Else:          zeNewColor = wdYellow
End Select
Application.Options.DefaultHighlightColorIndex = zeNewColor

End Sub

不会引发任何错误,会更改Application.Options.DefaultHighlightColorIndex

但不更新/显示相应(内置功能区主选项卡)按钮上新设置的颜色

然后退出文本高亮显示颜色模式

  • 有没有可能继续下去

  • 如果需要重新开始:有没有比这更好的方法 脏键/干扰键调用文本高亮显示等命令 颜色

  • 更新2019-04-03: 同时,我找到了
    IRibbonUI.invalidateControl控件ID
    s的列表:

    因此,在创建一个隐藏的自定义ribbon并在onLoad上为其获取句柄后,我可以
    zeWdRibbon.InvalidateControlMso“TextHighlightColorPicker”
    而不会引发任何错误

    但它也不会改变任何事情


    有没有可能,微软只是在没有检查Application.Options.DefaultHighlightColorIndex的情况下获取默认图像MSO“TextHighlightColorPicker”(黄色),或者我遗漏了什么

    我每次都会这样做
    gRibbon.Invalidate

    #If VBA7 Then
        Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
            ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    #Else
        Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
            ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    #End If
    
    Public gRibbon As IRibbonUI
    
    #If VBA7 Then
    Function GetRibbon(ByVal lRibbonPointer As LongPtr) As Object
    #Else
    Function GetRibbon(ByVal lRibbonPointer As Long) As Object
    #End If
    
        Dim objRibbon As Object
        Call CopyMemory(objRibbon, lRibbonPointer, LenB(lRibbonPointer))
        Set GetRibbon = objRibbon
        Set objRibbon = Nothing
    End Function
    
    Public Sub OnRibbonLoad(ribbon As IRibbonUI)
        Set gRibbon = ribbon
        'SAVE SETTINGS TO REGISTRY
        SaveSetting "POP", "RIBBON", "ribbonPointer", ObjPtr(gRibbon)
    End Sub
    
    Public Sub OnActionButton(control As IRibbonControl)
            If gRibbon Is Nothing Then
                Set gRibbon = GetRibbon(GetSetting("POP", "RIBBON", "ribbonPointer"))
            End If
        On Error Resume Next
            gRibbon.Invalidate
        On Error GoTo 0
    End Sub
    

    查看
    IRibbonUI.Invaludate
    -如果您正在尝试刷新功能区,它可能就是您想要的。我相信您可以在本文中找到您的答案,以及VBA代码(运行表单),当我测试您的代码片段时,我得到了
    所需对象
    。请发布复制该问题所需的所有内容。-->显示旧颜色的不仅仅是GUI。如果我更改它,然后单击按钮,那么该值将更改回默认值7。因此,功能区似乎用存储在别处的内容覆盖了该值。
    Application.ScreenRefresh
    将是答案。这对于保留公共功能区对象非常有用,在发生未处理的错误后,该对象将被设置为零,但我这里的问题似乎是,还有第二个,未记录类型的Application.Options.DefaultHighlightColorIndex.Set或returns用于突出显示用突出显示按钮格式化的文本的颜色
    Application.Options.DefaultHighlightColorIndex=wdColorIndex.wdGreen
    Application.Options.DefaultHighlightColorIndex被IRIBONUI.invalidate和Application.CommandBars.ExecuteMso“TextHighlightColorPicker”(以及相应的按钮)完全忽略因此,必须有一个不同的属性,我直到现在才找到。@blub如果此GetRibbon函数实际上为您提供了当前功能区的句柄,那么您应该能够直接修改功能区。