Một số ví dụ về cách tránh chọn
Sử dụng Dim
biến 'd
Dim rng as Range
Set
biến đến phạm vi yêu cầu. Có nhiều cách để chỉ một phạm vi đơn
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
hoặc một phạm vi đa ô
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)
Bạn có thể sử dụng phím tắt cho Evaluate
phương thức, nhưng điều này ít hiệu quả hơn và thường nên tránh trong mã sản xuất.
Set rng = [A1]
Set rng = [A1:B10]
Tất cả các ví dụ trên đề cập đến các ô trên trang hoạt động . Trừ khi bạn đặc biệt chỉ muốn làm việc với trang tính hoạt động, tốt hơn là nên Worksheet
thay đổi một biến
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
Nếu bạn làm muốn làm việc với ActiveSheet
, cho rõ ràng nó là tốt nhất để được rõ ràng. Nhưng hãy cẩn thận, vì một số Worksheet
phương pháp thay đổi bảng hoạt động.
Set rng = ActiveSheet.Range("A1")
Một lần nữa, điều này đề cập đến bảng tính hoạt động . Trừ khi bạn đặc biệt chỉ muốn làm việc với ActiveWorkbook
hoặc ThisWorkbook
, tốt hơn là nên Workbook
thay đổi Dim .
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Nếu bạn làm muốn làm việc với ActiveWorkbook
, cho rõ ràng nó là tốt nhất để được rõ ràng. Nhưng hãy cẩn thận, vì nhiều WorkBook
phương pháp thay đổi cuốn sách hoạt động.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Bạn cũng có thể sử dụng ThisWorkbook
đối tượng để tham khảo cuốn sách có chứa mã đang chạy.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Một đoạn mã (xấu) phổ biến là mở một cuốn sách, lấy một số dữ liệu rồi đóng lại
Thật tệ:
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
Và sẽ tốt hơn như:
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
Truyền phạm vi cho Sub
s và Function
s của bạn dưới dạng biến Phạm vi
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
Bạn cũng nên áp dụng Phương thức (như Find
và Copy
) cho các biến
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
Nếu bạn đang lặp qua một phạm vi ô, thường thì tốt hơn (nhanh hơn) để sao chép các giá trị phạm vi vào một mảng biến thể trước và lặp qua đó
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
Đây là một taster nhỏ cho những gì có thể.
Select
và / hoặcActiveSheet
vv vv là hoàn toàn không thể tránh khỏi. Đây là một ví dụ mà tôi đã tìm thấy: stackoverflow.com/questions/22796286/ Kẻ