ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > 细品RibbonX(40):技巧—在注册表中保存值和从注册表中获取值

细品RibbonX(40):技巧—在注册表中保存值和从注册表中获取值

作者:绿色风 分类: 时间:2022-08-17 浏览:159
楼主
biaotiger1
Windows注册表是一个数据库,用于存储与计算机不同方面相关的设置,例如用户设置、应用程序设备、硬件设置,等等。
VBA提供了与注册表直接交互的方式,这不仅允许我们获取其它程序和硬件的信息,而且也能够使我们选择应用程序中的重要信息并将其存储在注册表中。
本文中,我们的目的是存储和获取关于UI的信息,我们将使用专门为VBA(和VB)配置而留出的部分。并且,我们不需要使用Windows APIs。
VBA提供了用于处理注册表的两个函数:GetSetting和SaveSetting,这两个函数仅能访问下面的注册表句柄键:
  1. HKEY_CURRENT_USER\Software\VB and VBA Program Settings


如下图所示,当切换按钮时,即使关闭了该工程,其状态值仍保存,因此,在重新打开该工程时,按钮的状态为关闭前的状态,不会因为关闭工程而使按钮的状态值丢失。

 
定义上图所示界面的XML代码如下:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
  2.     onLoad="rxIRibbonUI_onLoad">
  3.     <ribbon startFromScratch="false">
  4.         <tabs>
  5.             <tab idMso="TabHome">
  6.                 <group id="rxgrp1"
  7.                    insertBeforeMso="GroupClipboard"
  8.                    label="Toggle Custom Tabs">
  9.                     <toggleButton id="rxtglCustomReview"
  10.                        label="Toggle Custom Review Tab"
  11.                        imageMso="ReviewAcceptChangeMenu"
  12.                        size="large"
  13.                        getPressed="rxtglCustomReview_getPressed"
  14.                        onAction="rxtglShared_Click"/>
  15.                     <separator id="rxsep1"/>
  16.                     <toggleButton id="rxtglDataHandling"
  17.                        label="Toggle Data Handling Tab"
  18.                        imageMso="Consolidate"
  19.                        size="large"
  20.                        getPressed="rxtglDataHandling_getPressed"
  21.                        onAction="rxtglShared_Click"/>
  22.                 </group>
  23.             </tab>
  24.             <!-- THE CUSTOM REVIEW TAB UI STARTS HERE -->
  25.             <tab id="rxtabCustomReview"
  26.                  getVisible="rxtabCustomReview_getVisible"
  27.                  label="Custom Review"
  28.                  keytip="K">
  29.                 <group idMso="GroupClipboard"/>
  30.                 <group idMso="GroupFont"/>
  31.                 <group id="rxgrpProofingComments"
  32.                   label="Proofing and Comments">
  33.                   <box id="rxbox1" boxStyle="vertical">
  34.                       <button idMso="Spelling"/>
  35.                       <button idMso="Thesaurus"/>
  36.                       <button idMso="TranslationPane"/>
  37.                   </box>
  38.                   <separator id="rxsep2"/>
  39.                   <box id="rxbox2" boxStyle="vertical">
  40.                       <button idMso="ReviewNewComment"/>
  41.                       <button idMso="ReviewDeleteComment"
  42.                           label="Delete Comment"/>
  43.                       <toggleButton idMso="ReviewShowAllComments"/>
  44.                   </box>
  45.                 </group>
  46.                 <group id="rxgrpChanges"
  47.                    label="Worksheet related changes">
  48.                    <box id="rxbox" boxStyle="vertical">
  49.                        <button idMso="ReviewHighlightChanges"/>
  50.                        <button idMso="ReviewProtectAndShareWorkbook"/>
  51.                        <button idMso="ReviewAllowUsersToEditRanges"/>
  52.                        <button idMso="SheetProtect"/>
  53.                    </box>
  54.                 </group>
  55.             </tab>
  56.             <!-- END OF CUSTOM REVIEW TAB -->
  57.             <tab id="rxtabDataHandling"
  58.                  getVisible="rxtabDataHandling_getVisible"
  59.                  label="Data Handling"
  60.                  keytip="Z">
  61.             </tab>
  62.         </tabs>
  63.     </ribbon>
  64. </customUI>


代码包含了一些必须由VBA处理的关键回调。设置了getPressed属性,因为它返回从注册表中获取toggleButton的按下状态的回调,状态是true或false。
接下来,处理Click事件(该事件通过OnAction属性定义为共享的回调)。每次单击时,都会将按钮当前状态保存到注册表。
最后,getVisible属性根据toggleButton的状态决定是否选项卡可见。
本例中,将下面的两个VBA函数封装到自已的函数中,这样可以传递参数到自定义函数中,并且在一定程度上能够控制程序:
  1. Function getRegistry(ByVal strKey As String) As Boolean
  2.     On Error Resume Next
  3.     getRegistry = GetSetting("AddInProject", "TabVisibility", strKey)
  4.     If Err > 0 Then getRegistry = False
  5. End Function

  6. Function saveRegistry(ByVal strKey As String, _
  7.     ByVal blnSetting As Boolean)
  8.     SaveSetting "AddInProject", "TabVisibility", strKey, blnSetting
  9. End Function


因为如果键不存在的话,getRegistry函数将返回错误,所以需要添加错误处理以捕获错误。如果发生错误,那么知道该键不存在,getRegistry函数应该返回False。
回调代码如下:
  1. Public gblnShowCustomReviewTab As Boolean
  2. Public gblnShowCustomDataHandlingTab As Boolean
  3. Public gblnCalledOnOpen As Boolean
  4. Public grxIRibbonUI As IRibbonUI

  5. Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
  6.     Set grxIRibbonUI = ribbon
  7. End Sub

  8. Sub rxtglCustomReview_getPressed(control As IRibbonControl, ByRef returnedVal)
  9.     returnedVal = getRegistry("CustomReviewTab")
  10.     gblnShowCustomReviewTab = getRegistry("CustomReviewTab")
  11.     grxIRibbonUI.InvalidateControl ("rxtabCustomReview")
  12. End Sub

  13. Sub rxtglDataHandling_getPressed(control As IRibbonControl, ByRef returnedVal)
  14.     returnedVal = getRegistry("CustomDataHandlingTab")
  15.     gblnShowCustomDataHandlingTab = getRegistry("CustomDataHandlingTab")
  16.     grxIRibbonUI.InvalidateControl ("rxtabDataHandling")
  17. End Sub

  18. Sub rxtglShared_Click(control As IRibbonControl, pressed As Boolean)
  19.     Select Case control.ID
  20.         Case "rxtglCustomReview"
  21.             gblnShowCustomReviewTab = pressed
  22.             saveRegistry "CustomReviewTab", pressed
  23.             gblnCalledOnOpen = False

  24.         Case "rxtglDataHandling"
  25.             gblnShowCustomDataHandlingTab = pressed
  26.             gblnCalledOnOpen = False
  27.             saveRegistry "CustomDataHandlingTab", pressed
  28.     End Select
  29.     grxIRibbonUI.Invalidate
  30. End Sub

  31. Sub rxtabCustomReview_getVisible(control As IRibbonControl, ByRef returnedVal)
  32.     returnedVal = gblnShowCustomReviewTab
  33.     If Not gblnCalledOnOpen Then
  34.         If gblnShowCustomReviewTab = True Then Application.SendKeys ("%K{RETURN}")
  35.     End If
  36. End Sub

  37. Sub rxtabDataHandling_getVisible(control As IRibbonControl, ByRef returnedVal)
  38.     returnedVal = gblnShowCustomDataHandlingTab
  39.     If Not gblnCalledOnOpen Then

  40.         If gblnShowCustomDataHandlingTab = True Then Application.SendKeys ("%Z{RETURN}")
  41.     End If
  42. End Sub


现在,就可以试试了!关闭工作簿后再打开,处理控件的设置将根据记录在注册表键中的值更新。
2楼
omnw
阅读完毕,留下脚印
3楼
byhwcm
我已经阅读,可以回复不?

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap