ชุดคำหลักทำอะไรได้จริงใน VBA


150

หวังว่าเป็นคำถามง่าย ๆ แต่ฉันอยากได้คำตอบทางเทคนิคกับสิ่งนี้!

ความแตกต่างระหว่าง:

i = 4

และ

Set i = 4

ใน VBA? ฉันรู้ว่าคนหลังจะทำให้เกิดข้อผิดพลาด แต่ฉันไม่เข้าใจว่าทำไม


4
Backgrounder ที่นี่: stackoverflow.com/a/9924325/17034
Hans Passant

คำตอบ:


95

setใช้เพื่อกำหนดการอ้างอิงไปยังวัตถุ ค่า C จะเท่ากับ

 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)

5
การอ้างอิงวัตถุ VB นั้นค่อนข้างไม่เหมือนกับตัวชี้ C และไม่เท่ากับ "& i" ใน VB
Tomalak

10
ไม่เหมือนเดิมเลย แต่ใกล้พอที่จะเข้าใจแนวคิด
Treb

@ Tomalak: คุณสามารถใช้ VarPtr ()
Atmocreations

นี่ไม่ใช่การเปรียบเทียบที่ดี นำตัวอย่างนี้ ( ):VBA on the left | C on the right Dim A, B As Range | Range A, B;ไปกับการเปรียบเทียบของคุณA = B | A = B;จะถูกต้อง (และมันจะอยู่ใน C) แต่Set A = B | A = &B;ถูกต้องจริงใน VBA (และมันจะล้มเหลวใน C) ใน VBA A = BและSet A = Bทั้งสองเท่ากับ C A = B;! ความแตกต่างเกิดขึ้นที่อื่น
Niko O

77

ในกรณีของคุณมันจะสร้างข้อผิดพลาด :-)

Setกำหนดการอ้างอิงวัตถุ สำหรับการมอบหมายอื่น ๆ คำสั่ง (โดยปริยายตัวเลือกและใช้น้อย) Letนั้นถูกต้อง:

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

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)

44

จากMSDN :

Set Keyword: ใน VBA จำเป็นต้องตั้งค่าคีย์เวิร์ดเพื่อแยกความแตกต่างระหว่างการกำหนดวัตถุและการกำหนดคุณสมบัติเริ่มต้นของวัตถุ เนื่องจากคุณสมบัติเริ่มต้นไม่ได้รับการสนับสนุนใน Visual Basic .NET จึงไม่จำเป็นต้องใช้ชุดคำหลักและไม่สนับสนุนอีกต่อไป


ดีพบ แต่เชื่อมโยงไปยังบทความที่คุณพบใน MSDN จะดียิ่งขึ้น :)
นีลบาร์นเวล

1
@Neil - ลิงก์จะอยู่ที่นั่นถ้าคุณคลิก MSDN ในโพสต์ของฉัน
Galonian

2
เมื่อคัดลอกออกจาก MSDN อย่างน้อยก็เป็นบทความที่ถูกต้อง อันนี้อ้างถึง VB.NET ไม่ใช่กับ VBA
Tomalak

1
OP กำลังถามเกี่ยวกับ VBA และถึงแม้ว่าข้อมูลเกี่ยวกับ Set จะไม่จำเป็นสำหรับการใช้งานใน NET อีกต่อไปมีประโยชน์ แต่ก็เป็นหัวข้อที่ปิดและไม่เป็นประโยชน์สำหรับผู้ที่มาถึงที่นี่พร้อมObject variable or With block variable not setข้อผิดพลาดจาก VBA :)
AJP

7
ขอบคุณมากสำหรับสารสกัดจาก MSDN คำตอบอื่น ๆ ทั้งหมดแม้คำตอบที่ยอมรับจะหายไป 'set' เป็นข้อมูลเกี่ยวกับ DEFAULT PROPERTY เพิ่งอ่านstackoverflow.com/a/9924325/717732
quetzalcoatl

10

ชุดใช้สำหรับการตั้งค่าการอ้างอิงวัตถุซึ่งตรงข้ามกับการกำหนดค่า


1

ปิดส่วนหัวของฉัน Set ใช้เพื่อกำหนดวัตถุ COM ให้กับตัวแปร ด้วยการตั้งค่าฉันสงสัยว่าภายใต้ประทุนนั้นกำลังเรียกใช้ AddRef () บนวัตถุเพื่อจัดการกับอายุการใช้งาน


1
มันไม่เพียง แต่ใช้สำหรับวัตถุ COM แต่สำหรับวัตถุทั้งหมด เหตุผลหลักที่คุณใช้ SET ถูกอธิบายโดย Gal Norwegian
Ikke

0

ดังนั้นเมื่อคุณต้องการตั้งค่าคุณไม่จำเป็นต้องมี "Set"; มิฉะนั้นถ้าคุณอ้างถึงวัตถุเช่นแผ่นงาน / ช่วง ฯลฯ คุณต้องใช้ "ชุด"


-1

Set เป็นคีย์เวิร์ดและใช้เพื่อกำหนดการอ้างอิงไปยัง Object ใน VBA

ตัวอย่างเช่น * ตัวอย่างด้านล่างแสดงวิธีการใช้ Set ใน VBA

Dim WS เป็นแผ่นงาน

ตั้งค่า WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.