Mac版Excel Ribbon下拉菜单设页面缩放:DropDown2_onAction未执行
Excel Ribbon自定义:页面缩放DropDown回调失效问题修复
基于可正常运行的页面大小选择Ribbon代码,适配实现页面缩放值设置功能时,DropDown2_onAction回调函数无法触发执行,页面缩放设置无响应。
原代码问题分析
- 回调逻辑匹配错误:
DropDown2_onAction中使用Right(id, 2)提取标识,但item的id是Scale_100/Scale_77/Scale_68,Right(id,2)得到的是00/77/68,而Case判断的是"100%"/"77%"/"68%",完全不匹配,导致无法进入分支设置缩放值。 - 返回类型不匹配:
GetPageScale函数返回类型为String,但getSelectedItemIndex回调要求返回整数类型的索引值,类型不匹配会导致Ribbon刷新异常,间接影响回调执行。 - 代码冗余与冲突:页面大小和缩放的代码分开定义了重复的
RibUI变量和LoadRibbon过程,实际使用时会导致Ribbon对象引用混乱。
修复方案
- 调整回调的标识匹配逻辑:通过
Split(id, "_")(1)提取id中的数字部分,或直接使用index参数判断选中项,避免字符串截取错误。 - 修正函数返回类型:将
GetPageScale的返回类型改为Integer,确保与getSelectedItemIndex的要求一致。 - 整合Ribbon代码:将页面大小和缩放的功能合并到同一个XML和标准模块中,避免重复定义导致的冲突。
- 处理Zoom特殊情况:当页面设置为“调整为指定页数”时,
PageSetup.Zoom会返回False,需添加默认处理逻辑。
完整修复代码
整合后的XML代码
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="LoadRibbon"> <ribbon> <tabs> <tab id="Tabv3.1" label="TOOLS" insertAfterMso="TabHome"> <!-- 页面大小选择组 --> <group id="GroupDemo2" label="SelectPapersize" imageMso="AddInManager"> <dropDown id="DropDown1" sizeString="xxxx" onAction="DropDown1_onAction" getSelectedItemIndex="DropDown1_GetSelectedItemIndex"> <item id="Item_A3" label="A3"/> <item id="Item_A4" label="A4"/> <item id="Item_A5" label="A5"/> </dropDown> </group> <!-- 页面缩放设置组 --> <group id="GroupDemo3" label="Page Scale" imageMso="AddInManager"> <dropDown id="DropDown2" sizeString="xxxx" onAction="DropDown2_onAction" getSelectedItemIndex="DropDown2_GetSelectedItemIndex"> <item id="Scale_100" label="100%"/> <item id="Scale_77" label="77%"/> <item id="Scale_68" label="68%"/> </dropDown> </group> </tab> </tabs> </ribbon> </customUI>
标准模块代码
Option Explicit Public RibUI As IRibbonUI Sub LoadRibbon(Ribbon As IRibbonUI) Set RibUI = Ribbon ' 初始化刷新两个下拉控件 RibUI.InvalidateControl "DropDown1" RibUI.InvalidateControl "DropDown2" End Sub ' 页面大小选择回调 Sub DropDown1_onAction(control As IRibbonControl, id As String, index As Integer) Dim iSize As Long Select Case Right(id, 2) Case "A3" iSize = xlPaperA3 Case "A4" iSize = xlPaperA4 Case "A5" iSize = xlPaperA5 End Select If iSize > 0 Then ActiveSheet.PageSetup.PaperSize = iSize End If End Sub Sub DropDown1_GetSelectedItemIndex(control As IRibbonControl, ByRef returnedVal) returnedVal = GetPageSize End Sub Function GetPageSize() As Integer Select Case ActiveSheet.PageSetup.PaperSize Case xlPaperA3 GetPageSize = 0 Case xlPaperA4 GetPageSize = 1 Case xlPaperA5 GetPageSize = 2 Case Else GetPageSize = 1 ' 默认选中A4 End Select End Function ' 页面缩放设置回调(修复后) Sub DropDown2_onAction(control As IRibbonControl, id As String, index As Integer) Dim iScale As Integer ' 通过Split提取id中的数字部分,避免截取错误 iScale = CInt(Split(id, "_")(1)) ' 或者直接用index判断: ' Select Case index ' Case 0: iScale = 100 ' Case 1: iScale = 77 ' Case 2: iScale = 68 ' End Select If iScale > 0 Then ' 先取消"调整为指定页数"的设置,确保Zoom生效 ActiveSheet.PageSetup.FitToPagesWide = False ActiveSheet.PageSetup.FitToPagesTall = False ActiveSheet.PageSetup.Zoom = iScale End If End Sub Sub DropDown2_GetSelectedItemIndex(control As IRibbonControl, ByRef returnedVal) returnedVal = GetPageScale End Sub Function GetPageScale() As Integer Dim currentZoom As Variant currentZoom = ActiveSheet.PageSetup.Zoom ' 处理Zoom为False的情况(即设置了FitToPages) If currentZoom = False Then GetPageScale = 0 ' 默认选中100% Else Select Case currentZoom Case 100 GetPageScale = 0 Case 77 GetPageScale = 1 Case 68 GetPageScale = 2 Case Else GetPageScale = 0 ' 默认选中100% End Select End If End Function
ThisWorkbook代码
Private Sub Workbook_SheetActivate(ByVal Sh As Object) If Not RibUI Is Nothing Then RibUI.InvalidateControl "DropDown1" RibUI.InvalidateControl "DropDown2" End If End Sub
内容的提问来源于stack exchange,提问作者user23636411
相关产品推荐
相关产品推荐

