使用命令按钮搜索行内容——命名范围问题
问题描述
我写了一个宏,功能是用命令按钮(Command Button)的标题内容搜索第2行中匹配的值,目前运行正常。我想使用
Application.GoTo的Scroll方法替代MyRange.Select来优化代码,但没法让命名范围"MyRange"在这个方法里生效,求代码改写建议。现有代码如下:
Sub Navigator_Sections() Dim ButtonName As String Dim lnRow As Long, lnCol As Long Dim MyRange As Range ButtonName = ActiveSheet.Buttons(Application.Caller).Caption lnRow = 2 lnCol = ActiveSheet.Cells(lnRow, 1).EntireRow.Find(What:=ButtonName, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column Set MyRange = Cells(lnRow, lnCol) Set MyRange = MyRange.Offset(0, -2) Application.Goto Reference:=ActiveSheet.Range("MyRange"), Scroll:=True End Sub
代码改写建议
你这里的MyRange是代码里定义的Range变量,不是工作表中创建的命名范围,所以用ActiveSheet.Range("MyRange")会让Excel去查找名为"MyRange"的单元格区域,自然无法匹配到你定义的变量。直接传入变量即可解决问题,同时建议增加错误判断避免找不到匹配值时报错,修改后的代码如下:
Sub Navigator_Sections() Dim ButtonName As String Dim lnRow As Long, lnCol As Long Dim MyRange As Range Dim findResult As Range ButtonName = ActiveSheet.Buttons(Application.Caller).Caption lnRow = 2 ' 先查找匹配结果,避免找不到时触发错误 Set findResult = ActiveSheet.Cells(lnRow, 1).EntireRow.Find( _ What:=ButtonName, _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not findResult Is Nothing Then lnCol = findResult.Column ' 直接定位到目标偏移区域 Set MyRange = Cells(lnRow, lnCol).Offset(0, -2) ' 传入Range变量,无需加引号 Application.Goto Reference:=MyRange, Scroll:=True Else MsgBox "未找到与按钮标题匹配的内容" End If End Sub
关键修改点
- 移除
ActiveSheet.Range("MyRange")的引号,直接传入MyRange变量,因为Application.GoTo的Reference参数支持直接接收Range对象。 - 增加
Find结果的空值判断,避免找不到匹配内容时代码崩溃,同时给用户弹出提示。 - 合并了
MyRange的赋值语句,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者Steven Gilbert
相关产品推荐
相关产品推荐

