ตัวอย่างของวิธีหลีกเลี่ยงการเลือก
ใช้Dim
ตัวแปร 'd
Dim rng as Range
Set
ตัวแปรเป็นช่วงที่ต้องการ มีหลายวิธีในการอ้างถึงช่วงเซลล์เดียว
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")
อีกครั้งนี่หมายถึงสมุดงานที่ใช้งานอยู่ ยกเว้นว่าคุณต้องการทำงานเฉพาะกับActiveWorkbook
หรือThisWorkbook
โดยเฉพาะจะเป็นการดีกว่าที่จะหรี่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
ส่งช่วงไปยังSub
s และFunction
s ของคุณเป็นตัวแปรช่วง
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
คุณควรใช้วิธีการ (เช่นFind
และCopy
) กับตัวแปร
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
นี่เป็นนักชิมเล็ก ๆ สำหรับสิ่งที่เป็นไปได้
Select
และ / หรือActiveSheet
อื่น ๆ เป็นต้นไม่สามารถหลีกเลี่ยงได้อย่างสมบูรณ์ นี่คือตัวอย่างที่ฉันพบ: stackoverflow.com/questions/22796286/…