Apa yang sebenarnya dilakukan oleh Set Kata Kunci di VBA?

150

Semoga pertanyaan yang mudah, tetapi saya ingin jawaban teknis untuk ini!

Apa perbedaan antara:

i = 4

dan

Set i = 4

dalam VBA? Saya tahu bahwa yang terakhir akan membuat kesalahan, tetapi saya tidak sepenuhnya mengerti mengapa.

Jon Artus
sumber
4
Backgrounder di sini: stackoverflow.com/a/9924325/17034
Hans Passant

Jawaban:

95

setdigunakan untuk menetapkan referensi ke suatu objek. Setara C akan menjadi

 int i;
int* ref_i;

i = 4; // Assigning a value (in VBA: i = 4)
ref_i = &i; //assigning a reference (in VBA: set ref_i = i)
Treb
sumber
5
Referensi objek VB tidak cukup sama dengan pointer C. Dan tidak ada yang setara dengan "& i" di VB.
Tomalak
10
Tidak persis sama, tidak. Tetapi cukup dekat bagi saya untuk memahami konsepnya.
Treb
@ Tomalak: Anda bisa menggunakan VarPtr ()
Atmocreations
Ini bukan analogi yang baik. Ambil contoh ini ( VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Pergi dengan analogi Anda, A = B | A = B;akan benar (dan itu akan di C), tetapi Set A = B | A = &B;sebenarnya benar di VBA (dan itu akan gagal di C). Dalam VBA, A = Bdan Set A = BKEDUA setara dengan C's A = B;! Perbedaannya terjadi di tempat lain.
Niko O
77

Dalam kasus Anda, itu akan menghasilkan kesalahan. :-)

Setmemberikan referensi objek. Untuk semua tugas lain, pernyataan (tersirat, opsional, dan sedikit digunakan) Letbenar:

Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)
Tomalak
sumber
44

Dari MSDN :

Atur Kata Kunci: Di VBA, kata kunci Set diperlukan untuk membedakan antara penetapan objek dan penetapan properti default objek. Karena properti default tidak didukung dalam Visual Basic .NET, kata kunci yang ditetapkan tidak diperlukan dan tidak lagi didukung.

Orang belanda
sumber
Ditemukan dengan baik, tetapi tautan ke artikel yang Anda temukan di MSDN akan lebih baik :)
Neil Barnwell
1
@Neil - tautannya ada jika Anda mengklik MSDN di posting saya.
Galwegia
2
Saat menyalin MSDN, maka setidaknya artikel yang benar. Yang ini mengacu pada VB.NET, bukan ke VBA.
Tomalak
1
OP bertanya tentang VBA, dan meskipun info tentang Set tidak lagi diperlukan untuk digunakan dalam. NET bermanfaat, ini adalah topik yang tidak umum dan tidak membantu bagi orang yang datang ke sini dengan Object variable or With block variable not setkesalahan dari VBA :)
AJP
7
Terima kasih banyak untuk ekstrak dari MSDN. Semua jawaban lain, bahkan yang diterima pun tidak ada gunanya. 'set' adalah tentang PROPERTI DEFAULT. Baru saja membaca stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Set digunakan untuk mengatur referensi objek, sebagai lawan untuk menetapkan nilai.

LeppyR64
sumber
1

Dari atas kepala saya, Set digunakan untuk menetapkan objek COM ke variabel. Dengan melakukan Set saya menduga bahwa di bawah tenda itu melakukan panggilan AddRef () pada objek untuk mengelola itu seumur hidup.

Sean
sumber
1
Ini tidak hanya digunakan untuk objek COM, tetapi untuk semua objek. Alasan utama Anda menggunakan SET dijelaskan oleh Galwegian.
Ikke
0

Jadi, ketika Anda ingin menetapkan nilai, Anda tidak perlu "Set"; jika tidak, jika Anda merujuk ke objek, misalnya lembar kerja / rentang dll, Anda perlu menggunakan "Set".

Eric Wang
sumber
-1

Set adalah kata kunci dan digunakan untuk menetapkan referensi ke suatu objek di VBA.

Untuk Eg, * Contoh di bawah ini menunjukkan cara menggunakan Set in VBA.

Dim WS As Worksheet

Set WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Amit Singh
sumber