作者:绿色风
分类:
时间:2022-08-17
浏览:159
楼主 biaotiger1 |
Windows注册表是一个数据库,用于存储与计算机不同方面相关的设置,例如用户设置、应用程序设备、硬件设置,等等。 VBA提供了与注册表直接交互的方式,这不仅允许我们获取其它程序和硬件的信息,而且也能够使我们选择应用程序中的重要信息并将其存储在注册表中。 本文中,我们的目的是存储和获取关于UI的信息,我们将使用专门为VBA(和VB)配置而留出的部分。并且,我们不需要使用Windows APIs。 VBA提供了用于处理注册表的两个函数:GetSetting和SaveSetting,这两个函数仅能访问下面的注册表句柄键:
- HKEY_CURRENT_USER\Software\VB and VBA Program Settings
如下图所示,当切换按钮时,即使关闭了该工程,其状态值仍保存,因此,在重新打开该工程时,按钮的状态为关闭前的状态,不会因为关闭工程而使按钮的状态值丢失。
定义上图所示界面的XML代码如下:
- <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
- onLoad="rxIRibbonUI_onLoad">
- <ribbon startFromScratch="false">
- <tabs>
- <tab idMso="TabHome">
- <group id="rxgrp1"
- insertBeforeMso="GroupClipboard"
- label="Toggle Custom Tabs">
- <toggleButton id="rxtglCustomReview"
- label="Toggle Custom Review Tab"
- imageMso="ReviewAcceptChangeMenu"
- size="large"
- getPressed="rxtglCustomReview_getPressed"
- onAction="rxtglShared_Click"/>
- <separator id="rxsep1"/>
- <toggleButton id="rxtglDataHandling"
- label="Toggle Data Handling Tab"
- imageMso="Consolidate"
- size="large"
- getPressed="rxtglDataHandling_getPressed"
- onAction="rxtglShared_Click"/>
- </group>
- </tab>
- <!-- THE CUSTOM REVIEW TAB UI STARTS HERE -->
- <tab id="rxtabCustomReview"
- getVisible="rxtabCustomReview_getVisible"
- label="Custom Review"
- keytip="K">
- <group idMso="GroupClipboard"/>
- <group idMso="GroupFont"/>
- <group id="rxgrpProofingComments"
- label="Proofing and Comments">
- <box id="rxbox1" boxStyle="vertical">
- <button idMso="Spelling"/>
- <button idMso="Thesaurus"/>
- <button idMso="TranslationPane"/>
- </box>
- <separator id="rxsep2"/>
- <box id="rxbox2" boxStyle="vertical">
- <button idMso="ReviewNewComment"/>
- <button idMso="ReviewDeleteComment"
- label="Delete Comment"/>
- <toggleButton idMso="ReviewShowAllComments"/>
- </box>
- </group>
- <group id="rxgrpChanges"
- label="Worksheet related changes">
- <box id="rxbox" boxStyle="vertical">
- <button idMso="ReviewHighlightChanges"/>
- <button idMso="ReviewProtectAndShareWorkbook"/>
- <button idMso="ReviewAllowUsersToEditRanges"/>
- <button idMso="SheetProtect"/>
- </box>
- </group>
- </tab>
- <!-- END OF CUSTOM REVIEW TAB -->
- <tab id="rxtabDataHandling"
- getVisible="rxtabDataHandling_getVisible"
- label="Data Handling"
- keytip="Z">
- </tab>
- </tabs>
- </ribbon>
- </customUI>
代码包含了一些必须由VBA处理的关键回调。设置了getPressed属性,因为它返回从注册表中获取toggleButton的按下状态的回调,状态是true或false。 接下来,处理Click事件(该事件通过OnAction属性定义为共享的回调)。每次单击时,都会将按钮当前状态保存到注册表。 最后,getVisible属性根据toggleButton的状态决定是否选项卡可见。 本例中,将下面的两个VBA函数封装到自已的函数中,这样可以传递参数到自定义函数中,并且在一定程度上能够控制程序:
- Function getRegistry(ByVal strKey As String) As Boolean
- On Error Resume Next
- getRegistry = GetSetting("AddInProject", "TabVisibility", strKey)
- If Err > 0 Then getRegistry = False
- End Function
- Function saveRegistry(ByVal strKey As String, _
- ByVal blnSetting As Boolean)
- SaveSetting "AddInProject", "TabVisibility", strKey, blnSetting
- End Function
因为如果键不存在的话,getRegistry函数将返回错误,所以需要添加错误处理以捕获错误。如果发生错误,那么知道该键不存在,getRegistry函数应该返回False。 回调代码如下:
- Public gblnShowCustomReviewTab As Boolean
- Public gblnShowCustomDataHandlingTab As Boolean
- Public gblnCalledOnOpen As Boolean
- Public grxIRibbonUI As IRibbonUI
- Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
- Set grxIRibbonUI = ribbon
- End Sub
- Sub rxtglCustomReview_getPressed(control As IRibbonControl, ByRef returnedVal)
- returnedVal = getRegistry("CustomReviewTab")
- gblnShowCustomReviewTab = getRegistry("CustomReviewTab")
- grxIRibbonUI.InvalidateControl ("rxtabCustomReview")
- End Sub
- Sub rxtglDataHandling_getPressed(control As IRibbonControl, ByRef returnedVal)
- returnedVal = getRegistry("CustomDataHandlingTab")
- gblnShowCustomDataHandlingTab = getRegistry("CustomDataHandlingTab")
- grxIRibbonUI.InvalidateControl ("rxtabDataHandling")
- End Sub
- Sub rxtglShared_Click(control As IRibbonControl, pressed As Boolean)
- Select Case control.ID
- Case "rxtglCustomReview"
- gblnShowCustomReviewTab = pressed
- saveRegistry "CustomReviewTab", pressed
- gblnCalledOnOpen = False
- Case "rxtglDataHandling"
- gblnShowCustomDataHandlingTab = pressed
- gblnCalledOnOpen = False
- saveRegistry "CustomDataHandlingTab", pressed
- End Select
- grxIRibbonUI.Invalidate
- End Sub
- Sub rxtabCustomReview_getVisible(control As IRibbonControl, ByRef returnedVal)
- returnedVal = gblnShowCustomReviewTab
- If Not gblnCalledOnOpen Then
- If gblnShowCustomReviewTab = True Then Application.SendKeys ("%K{RETURN}")
- End If
- End Sub
- Sub rxtabDataHandling_getVisible(control As IRibbonControl, ByRef returnedVal)
- returnedVal = gblnShowCustomDataHandlingTab
- If Not gblnCalledOnOpen Then
- If gblnShowCustomDataHandlingTab = True Then Application.SendKeys ("%Z{RETURN}")
- End If
- End Sub
现在,就可以试试了!关闭工作簿后再打开,处理控件的设置将根据记录在注册表键中的值更新。 |
2楼 omnw |
阅读完毕,留下脚印 |
3楼 byhwcm |
我已经阅读,可以回复不? |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一