我听说过很多关于使用的厌恶是可以理解的。在Excel VBA中选择
,但我不确定如何避免使用它。我发现,如果我能够使用变量而不是
Select
函数,我的代码将更加可重用。但是,如果不使用Select
,我不知道如何引用事物(如ActiveCell
,等等)
我找到了这篇关于范围的文章和这个关于不使用select的好处的示例,但是我找不到任何关于如何使用的内容
如何避免选择的一些例子
使用Dim
'd变量
变暗rng as范围
将变量设置为所需的范围。有许多方法可以引用单个单元格范围:
设置rng=范围(“A1”)
设置rng=单元(1,1)
设置rng=范围(“NamedRange”)
或多单元范围:
设置rng=范围(“A1:B10”)
设置rng=范围(“A1”、“B10”)
设置rng=范围(单元格(1,1),单元格(10,2))
设置rng=范围(“其他名称范围”)
设置rng=范围(“A1”)。调整大小(10,2)
您可以使用Evaluate
方法的快捷方式,但这效率较低,通常应在生产代码中避免
设置rng=[A1]
设置rng=[A1:B10]
以上所有示例均指活动工作表上的单元格。除非您特别希望仅使用活动工作表,否则最好将工作表
变量调暗:
Dim ws-As工作表
设置ws=工作表(“Sheet1”)
设置rng=ws.Cells(1,1)
与ws
设置rng=.Range(.Cells(1,1),.Cells(2,10))
以
如果您想使用ActiveSheet
,为了清晰起见,最好是明确的。但是要小心,因为一些工作表
方法会更改活动工作表
Set rng=ActiveSheet.Range(";A1";)
同样,这指的是活动工作簿。除非您特别希望只使用ActiveWorkbook
或thiswoolk
,否则最好也将Workbook
变量调暗
将wb设置为工作簿
设置wb=Application.workbook(“Book1”)
设置rng=wb.工作表(“Sheet1”).范围(“A1”)
如果您想使用ActiveWorkbook
,为了清晰起见,最好是明确的。但是要小心,因为许多工作簿
方法都会更改活动书本
Set rng=ActiveWorkbook.Worksheets(";Sheet1";).Range(";A1";)
您还可以使用ThisWorkbook
对象引用包含运行代码的书籍
Set rng=thispoolk.Worksheets(";Sheet1";).Range(";A1";)
一个常见的(错误的)代码是打开一本书,获取一些数据,然后再次关闭
这很糟糕:
子foo()
Dim v作为变体
工作手册(“Book1.xlsx”)。工作表(1)。范围(“A1”)。清除
工作簿.Open(“C:\Path\To\SomeClosedBook.xlsx”)
v=ActiveWorkbook.Sheets(1).范围(“A1”).值
工作簿(“SomeAlreadyOpenBook.xlsx”)。激活
ActiveWorkbook.Sheets(“SomeSheet”).Range(“A1”).Value=v
工作簿(2)。激活
ActiveWorkbook.Close()
端接头
最好是:
子foo()
Dim v作为变体
将wb1设置为工作簿
将wb2设置为工作簿
设置wb1=工作簿(“SomeAlreadyOpenBook.xlsx”)
设置wb2=Workbooks.Open(";C:\Path\To\SomeClosedBook.xlsx";)
v=wb2.图纸(“SomeSheet”).范围(“A1”).值
wb1.工作表(“SomeOtherSheet”).Range(“A1”).Value=v
wb2.Close()
端接头
将范围作为范围变量传递给Sub
s和Function
s:
次清除范围(r为范围)
r、 清晰内容
'....
端接头
子MyMacro()
变暗rng as范围
Set rng=ThisWorkbook.Worksheets(";SomeSheet";).Range(";A1:B10";)
净空距离
端接头
您还应将方法(如查找
和复制
)应用于变量:
调暗rng1作为范围
变暗rng2 As范围
Set rng1=ThisWorkbook.Worksheets(";SomeSheet";).Range(";A1:A10";)
设置rng2=ThisWorkbook.Worksheets(";SomeSheet";).Range(";B1:B10";)
rng1。复制rng2
如果要在一个单元格范围内循环,通常最好(更快)先将范围值复制到变量数组,然后在该数组上循环:
尺寸数据作为变量
变暗rng As范围
我想我会坚持多久
Set rng=ThisWorkbook.Worksheets(";SomeSheet";).Range(";A1:A10000";)
dat=rng。值“dat现在是数组(1到10000,1到1)
对于i=LBound(dat,1)到UBound(dat,1)
dat(i,1)=dat(i,1)*10'或任何需要执行的操作
下一个
rng.Value=dat'将新值放回工作表
这是一个很小的品尝者