gpt4 book ai didi

excel - 如何避免在 Excel VBA 中使用 Select

转载 作者:行者123 更新时间:2023-12-01 16:14:26 25 4
gpt4 key购买 nike

我听说过很多关于在 Excel VBA 中使用 .Select 的厌恶情绪,这是可以理解的,但我不确定如何避免使用它。我发现如果我能够使用变量而不是 Select 函数,我的代码将更具可重用性。但是,如果不使用 Select,我不确定如何引用事物(例如 ActiveCell 等)。

我找到了this article on rangesthis example on the benefits of not using select ,但我找不到任何关于如何的信息。

最佳答案

如何避免选择的一些示例

使用Dim变量

Dim rng as Range

将变量设置到所需的范围。有多种方法可以引用单个单元格范围:

Set rng = Range("A1")
Set rng = Cells(1, 1)
Set rng = Range("NamedRange")

或多单元格范围:

Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1, 1), Cells(10, 2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10, 2)

可以使用Evaluate方法的快捷方式,但这效率较低,通常应该在生产代码中避免。

Set rng = [A1]
Set rng = [A1:B10]

以上所有示例均引用事件工作表上的单元格。除非您特别想仅使用事件工作表,否则最好也将 Worksheet 变量调暗:

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1, 1)
With ws
Set rng = .Range(.Cells(1, 1), .Cells(2, 10))
End With

如果您确实想要使用ActiveSheet,为了清楚起见,最好明确说明。但请小心,因为某些 Worksheet 方法会更改事件工作表。

Set rng = ActiveSheet.Range("A1")

同样,这指的是事件工作簿。除非您特别想仅使用 ActiveWorkbookThisWorkbook,否则最好也调暗 Workbook 变量。

Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")

如果您确实想要使用ActiveWorkbook,为了清楚起见,最好明确说明。但请小心,因为许多 WorkBook 方法会更改事件书籍。

Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")

您还可以使用 ThisWorkbook 对象来引用包含正在运行的代码的书籍。

Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")

一段常见(糟糕)的代码是打开一本书,获取一些数据然后再次关闭

这很糟糕:

Sub foo()
Dim v as Variant
Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = ActiveWorkbook.Sheets(1).Range("A1").Value
Workbooks("SomeAlreadyOpenBook.xlsx").Activate
ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
Workbooks(2).Activate
ActiveWorkbook.Close()
End Sub

这样会更好:

Sub foo()
Dim v as Variant
Dim wb1 as Workbook
Dim wb2 as Workbook
Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = wb2.Sheets("SomeSheet").Range("A1").Value
wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
wb2.Close()
End Sub

将范围作为 Range 变量传递给您的 SubFunction:

Sub ClearRange(r as Range)
r.ClearContents
'....
End Sub

Sub MyMacro()
Dim rng as Range
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
ClearRange rng
End Sub

您还应该将方法(例如 FindCopy)应用于变量:

Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2

如果要循环某个单元格范围,通常最好(更快)先将范围值复制到变体数组,然后循环:

Dim dat As Variant
Dim rng As Range
Dim i As Long

Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
dat(i,1) = dat(i, 1) * 10 ' Or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet

这是对可能性的一个小尝试。

关于excel - 如何避免在 Excel VBA 中使用 Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com