Beberapa contoh cara menghindari pilih
Gunakan Dim
variabel d
Dim rng as Range
Set
variabel ke rentang yang diperlukan. Ada banyak cara untuk merujuk ke rentang sel tunggal
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
atau rentang multi-sel
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)
Anda dapat menggunakan cara pintas ke Evaluate
metode, tetapi ini kurang efisien dan umumnya harus dihindari dalam kode produksi.
Set rng = [A1]
Set rng = [A1:B10]
Semua contoh di atas merujuk ke sel di lembar aktif . Kecuali Anda secara khusus ingin bekerja hanya dengan lembar aktif, lebih baik untuk Dim Worksheet
variabel juga
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
Jika Anda tidak ingin bekerja dengan ActiveSheet
, untuk kejelasan yang terbaik untuk menjadi eksplisit. Tetapi berhati-hatilah, karena beberapa Worksheet
metode mengubah lembar aktif.
Set rng = ActiveSheet.Range("A1")
Sekali lagi, ini merujuk pada buku kerja aktif . Kecuali jika Anda secara khusus ingin bekerja hanya dengan ActiveWorkbook
atau ThisWorkbook
, lebih baik untuk Dim Workbook
variabel juga.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Jika Anda tidak ingin bekerja dengan ActiveWorkbook
, untuk kejelasan yang terbaik untuk menjadi eksplisit. Tapi hati-hati, karena banyak WorkBook
metode mengubah buku aktif.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Anda juga dapat menggunakan ThisWorkbook
objek untuk merujuk ke buku yang berisi kode yang sedang berjalan.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Sepotong kode yang umum (buruk) adalah membuka buku, mendapatkan beberapa data lalu tutup kembali
Ini buruk:
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
Dan akan lebih baik seperti:
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
Pass rentang ke Sub
dan Function
sebagai variabel Range
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
Anda juga harus menerapkan Metode (seperti Find
dan Copy
) ke variabel
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
Jika Anda mengulangi rentang sel, seringkali lebih baik (lebih cepat) untuk menyalin nilai rentang ke array varian terlebih dahulu dan mengulanginya.
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
Ini adalah pengecap kecil untuk apa yang mungkin.
Select
dan / atauActiveSheet
etc dll benar-benar tidak dapat dihindari. Berikut adalah contoh yang saya temukan: stackoverflow.com/questions/22796286/…