Xin lỗi vì tôi là một người mới trong VBA.
Đôi khi tôi sử dụng
Dim r as Range
r = Range("A1")
Những lần khác tôi sử dụng
Set r = Range("A1")
Sự khác biệt là gì? Và khi nào tôi nên sử dụng những gì?
Câu trả lời:
Không có lý do gì để sử dụng set
trừ khi đề cập đến một tham chiếu đối tượng. Bạn chỉ nên sử dụng nó trong bối cảnh đó. Đối với tất cả các kiểu dữ liệu đơn giản khác, chỉ cần sử dụng một toán tử gán. Tuy nhiên, bạn nên dim
(thứ nguyên) TẤT CẢ các biến:
Ví dụ về các kiểu dữ liệu đơn giản sẽ là integer
, long
, boolean
, string
. Đây chỉ là các kiểu dữ liệu và không có các phương thức và thuộc tính riêng.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Ví dụ về một object
sẽ là a Range
, a Worksheet
hoặc a Workbook
. Chúng có các phương pháp và thuộc tính riêng.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Nếu bạn cố gắng sử dụng dòng cuối cùng mà không có Set
, VB sẽ báo lỗi. Bây giờ bạn đã object
khai báo, bạn có thể truy cập các thuộc tính và phương thức của nó.
myString = myRange.Value
Set
mà không Dim
nhập biến trước không?
Dim
khai báo biến .
Dim r As Range
Set
đặt biến thành một tham chiếu đối tượng .
Set r = Range("A1")
Tuy nhiên, tôi không nghĩ đây là điều bạn đang thực sự hỏi.
Đôi khi tôi sử dụng:
Dim r as Range r = Range("A1")
Điều này sẽ không bao giờ hiệu quả. Nếu không, Set
bạn sẽ nhận được lỗi thời gian chạy # 91 Biến đối tượng hoặc Với biến khối không được đặt . Điều này là do bạn phải sử dụng Set
để gán giá trị biến cho một tham chiếu đối tượng. Sau đó, đoạn mã trên sẽ hoạt động.
Tôi nghĩ đoạn mã dưới đây minh họa những gì bạn thực sự đang hỏi. Giả sử chúng ta không khai báo một kiểu và thay vào đó hãy r
là một Variant
kiểu.
Public Sub test()
Dim r
debug.print TypeName(r)
Set r = Range("A1")
debug.print TypeName(r)
r = Range("A1")
debug.print TypeName(r)
End Sub
Vì vậy, chúng ta hãy chia nhỏ những gì xảy ra ở đây.
r
được khai báo là một biến thể
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
được đặt thành Range
ô chứa "A1"
Set r = Range("A1") ' TypeName(r) returns "Range"
r
được đặt thành giá trị của thuộc tính mặc định của Range("A1")
.
r = Range("A1") ' TypeName(r) returns "String"
Trong trường hợp này, thuộc tính mặc định của một Phạm vi là .Value
, vì vậy hai dòng mã sau là tương đương.
r = Range("A1")
r = Range("A1").Value
Để biết thêm về các thuộc tính đối tượng mặc định, vui lòng xem "Thành viên mặc định của một lớp" của Chip Pearson .
Đối với Set
ví dụ của bạn :
Những lần khác tôi sử dụng
Set r = Range("A1")
Điều này sẽ không hoạt động nếu không khai báo trước đó r
là một Range
hoặc Variant
đối tượng ... bằng cách sử dụng Dim
câu lệnh - trừ khi bạn chưa Option Explicit
bật, điều bạn nên làm. Luôn luôn. Nếu không, bạn đang sử dụng số nhận dạng mà bạn chưa khai báo và tất cả chúng đều được khai báo ngầm là Biến thể .
Dim: bạn đang xác định một biến (ở đây: r là một biến kiểu Range)
Đặt: bạn đang đặt thuộc tính (ở đây: đặt giá trị của r thành Phạm vi ("A1") - đây không phải là một kiểu, mà là một giá trị).
Bạn phải sử dụng set với các đối tượng, nếu r là kiểu đơn giản (ví dụ: int, string), thì bạn chỉ cần viết:
Dim r As Integer
r=5
Dim
chỉ cần khai báo giá trị và kiểu.
Set
gán một giá trị cho biến.
Nếu một biến được định nghĩa là một đối tượng, ví dụ như Dim myfldr As Folder, nó sẽ được gán một giá trị bằng cách sử dụng từ khóa, "Set".
Dim
là viết tắt của Dimension và được sử dụng trong VBA và VB6 để khai báo các biến cục bộ.
Mặt khác, thiết lập không liên quan gì đến khai báo biến. Các Set
từ khóa được sử dụng để gán một biến đối tượng đến một đối tượng mới.
Hy vọng rằng làm rõ sự khác biệt cho bạn.
Theo trợ giúp của VBA trên câu lệnh SET, nó thiết lập một tham chiếu đến một đối tượng. Vì vậy nếu bạn thay đổi một thuộc tính thì đối tượng thực tế cũng sẽ thay đổi.
Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue
các thuộc tính khác của Vars cũng thay đổi, vì vậy:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
thực tế tất cả các vars đều giống nhau!