如何阻止VBA将查找(Ctrl+F)默认文本设为选中内容?
解决VBA编辑器查找对话框无法保留上次查找内容的问题
在VBA 7.1搭配Excel 365(包括其他Office应用)的环境里,用Ctrl+F打开查找对话框时,编辑器会自动把「Find What」文本框填成当前代码窗口选中的内容。但关闭对话框再打开,上次输的查找内容就没了——这和常规程序的体验不一样,而且翻遍标准菜单也找不到能改这个行为的设置。
实现思路
通过VBA捕获查找命令的点击事件,手动保存上次的查找内容,打开对话框时自动填充,覆盖编辑器默认的选中内容。
具体步骤
插入类模块
打开VBA编辑器,右键点击项目→插入→类模块,把类模块改名为clsVBEFindHandler,然后粘贴下面的代码:Option Explicit Private WithEvents cmdFind As CommandBarButton Private lastFindText As String Private Sub Class_Initialize() Set cmdFind = Application.VBE.CommandBars.FindControl(ID:=1849) ' 查找命令的固定ID End Sub Private Sub cmdFind_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) Dim findDlg As Dialog Set findDlg = Application.VBE.Dialogs(vbext_dlg_Find) ' 填充上次保存的查找内容 If lastFindText <> "" Then findDlg.FindWhat = lastFindText End If ' 显示对话框,用户点确定后保存新的查找内容 If findDlg.Show = vbOK Then lastFindText = findDlg.FindWhat End If CancelDefault = True ' 拦截默认的查找对话框触发 End Sub插入标准模块
再插入一个标准模块,命名为modVBEUtils,粘贴初始化代码:Option Explicit Private findHandler As clsVBEFindHandler Sub InitializeFindHandler() Set findHandler = New clsVBEFindHandler MsgBox "查找内容记忆功能已开启", vbInformation End Sub Sub TerminateFindHandler() Set findHandler = Nothing MsgBox "查找内容记忆功能已关闭", vbInformation End Sub启用功能
运行InitializeFindHandler宏,之后用Ctrl+F打开查找对话框,就会自动保留上次的查找内容了。要是想关掉这个功能,运行TerminateFindHandler就行。
注意事项
- 这个功能只在当前Office会话中有效,关掉软件后下次打开得重新运行初始化宏;
- 要是你自定义过工具栏按钮,查找命令的ID可能变,得自己确认ID值(默认是1849);
- 打开对话框时,不管有没有选中代码,都会优先填充上次的查找内容,符合你要的常规程序体验。
内容的提问来源于stack exchange,提问作者Patrick Kelley
相关产品推荐
相关产品推荐

