Excel VBA:With Worksheets("Oracle")仅在目标工作表激活时生效,求错因
问题分析与解决
嘿,这个问题我太熟悉了——你踩了VBA里一个超常见的「隐式引用」坑!
你说得没错,With Worksheets("Oracle")的设计就是为了让块内的代码默认指向这个工作表,但你忽略了一个关键细节:所有属于这个工作表的对象(比如Range)都需要加上.前缀,否则VBA会自动引用当前激活的工作表,这就是为什么只有Oracle工作表激活时代码才正常运行。
具体出错的地方
你的代码里有两处Range引用没绑定到With块的工作表:
- 定义名称时的
Range("A1", Range("A1").End(xlToRight).End(xlDown)) - 设置表头加粗时的
Range("A1").End(xlToRight)
这两处的Range都没有加.,所以VBA会去找当前激活工作表的单元格,而不是Oracle工作表的。
修正后的完整代码
With Worksheets("Oracle") On Error Resume Next ActiveWorkbook.Names("bron").Delete On Error GoTo 0 ' 建议用完错误捕获就恢复,避免隐藏其他错误 ' 所有Range前加上.,绑定到Oracle工作表 ActiveWorkbook.Names.Add Name:="bron", RefersTo:=.Range("A1", .Range("A1").End(xlToRight).End(xlDown)) ' 避免使用Select/Selection,直接操作Cells对象 With .Cells.Font .Name = "Verdana" .FontStyle = "Standaard" .Size = 8 End With ' 同样给第二个Range加上. .Range("A1", .Range("A1").End(xlToRight)).Font.Bold = True MsgBox "Tabblad ‘Oracle’ is klaar!", vbOKOnly End With
额外小建议
- 尽量不要用
Select和Selection,直接操作对象(比如上面改成.Cells.Font),这样代码更高效也更不容易出错。 On Error Resume Next要谨慎使用,最好在完成需要忽略错误的操作后,用On Error GoTo 0恢复默认错误处理,防止后续代码的错误被隐藏。
内容的提问来源于stack exchange,提问作者PeterEZ
相关产品推荐
相关产品推荐

