EXCEL如何强制用户在工作簿中启用宏?

有朋友问:如果用户工作簿禁用了宏,怎样对特定工作表进行隐藏,让用户无法查看?只有当宏被打开时显示其他工作表?

宏被禁用提示

下表是当用户禁用工作簿宏时,隐藏其他工作表的同时显示提示:

提示表提示界面

要实现这样的功能,我们可以通过实现Workbook_Open、Workbook_BeforeClose、Workbook_BeforeSave等事件处理程序,我们可以控制工作簿在打开、关闭和保存时的行为。例如,在打开工作簿时自动显示所有工作表,并在关闭前检查是否需要保存更改;通过拦截标准的保存操作,我们可以调用自定义的保存函数CustomSave,该函数允许用户选择保存位置、格式,并在保存前隐藏所有非警告工作表,以避免不必要的干扰或数据泄露。同时,将介绍如何编写HideAllSheets和ShowAllSheets子程序来智能管理工作表的可见性。这些子程序将帮助用户隐藏除警告工作表外的所有工作表,并在需要时重新显示它们,从而保护敏感数据或简化工作簿的视图。代码片段如下:

'强制显式声明变量OptionExplicit'将警告工作表的名称分配给一个常量ConstWarningAsString="提示"'工作簿打开时自动执行的宏PrivateSubWorkbook_Open()'关闭屏幕更新=False'调用显示所有工作表的例程CallShowAllSheets'将工作簿的已保存属性设置为=True'打开屏幕更新=TrueSub'工作簿关闭前执行的宏PrivateSubWorkbook_BeforeClose(CancelAsBoolean)'声明变量DimAnsAsInteger'如果工作簿的已保存属性为False,则模拟Excel的默认保存提示=FalseThenDoAns=MsgBox("你想保存对'""'的更改吗?",vbQuestion+vbYesNoCancel)SelectCaseAnsCasevbYes'调用自定义保存例程=TrueCasevbCancelCancel='工作簿保存前执行的宏PrivateSubWorkbook_BeforeSave(ByValSaveAsUIAsBoolean,CancelAsBoolean)'取消常规保存Cancel=True'调用自定义保存例程CallCustomSave(SaveAsUI)Sub'自定义保存例程PrivateSubCustomSave(OptionalSaveAsAsBoolean)'声明变量DimActiveShtAsObjectDimFileFormatAsVariantDimFileNameAsStringDimFileFilterAsStringDimFilterIndexAsIntegerDimMsgAsStringDimAnsAsIntegerDimOrigSavedAsBooleanDimWorkbookSavedAsBoolean'关闭屏幕更新=False'关闭事件,防止在保存时再次触发BeforeSave事件=False'将工作簿的已保存属性保存到变量OrigSaved='获取当前活动的工作表SetActiveSht=ActiveSheet'调用隐藏所有工作表(除了提示工作表)的例程CallHideAllSheets'根据是否需要另存为或路径为空,处理保存逻辑'(此处省略了部分逻辑以保持注释简洁)''调用显示所有工作表的例程CallShowAllSheets'激活之前的活动工作表'根据是否成功保存,更新工作簿的已保存属性==OrigSavedIf'打开屏幕更新=True'打开事件=TrueSubPrivateSubHideAllSheets()DimShAsObjectSheets("提示").Visible==xlSheetVeryHiddenIfNextShSubPrivateSubShowAllSheets()=xlSheetVisibleIfNextShSheets("提示").Visible=xlSheetVeryHiddenSubPrivateFunctionIsLegalFilename(ByValfnameAsString)AsBooleanDimBadCharsAsVariantDimiAsLongIfLen(fname)218ThenIsLegalFilename=FalseExitFunctionElseBadChars=Array("\","/","","","?","[","]",":","|","*","""")fname=GetFileName(fname)Fori=LBound(BadChars)ToUBound(BadChars)IfInStr(1,fname,BadChars(i))0ThenIsLegalFilename=FalseExitFunctionIfNextiIfIsLegalFilename=TrueFunctionPrivateFunctionGetFileName(ByValFullNameAsString)AsStringDimiAsLongFori=Len(FullName)To1Step-1IfMid(FullName,i,1)==Mid(FullName,i+1)Function

通过本篇文章,读者将学习到如何通过VBA编程来扩展Excel的功能,使其更加符合个人或团队的特定需求。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐