如何避免在excelvba中使用Select

我听说过很多关于使用的厌恶是可以理解的。在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")

同样,这指的是活动工作簿。除非您特别希望只使用ActiveWorkbookthiswoolk,否则最好也将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()
端接头

将范围作为范围变量传递给Subs和Functions:

次清除范围(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'将新值放回工作表

这是一个很小的品尝者

发表评论