O que a palavra-chave Set realmente faz no VBA?

150

Espero que seja uma pergunta fácil, mas eu gostaria de uma resposta técnica para isso!

Qual é a diferença entre:

i = 4

e

Set i = 4

no VBA? Eu sei que o último lançará um erro, mas não entendo completamente o porquê.

Jon Artus
fonte
4
Backgrounder aqui: stackoverflow.com/a/9924325/17034
Hans Passant

Respostas:

95

seté usado para atribuir uma referência a um objeto. O equivalente C seria

 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
fonte
5
Uma referência de objeto VB não é exatamente a mesma que um ponteiro C. E não há equivalente a "& i" no VB.
Tomalak
10
Não é exatamente o mesmo, não. Mas perto o suficiente para eu entender o conceito.
8238 Treb
@Tomalak: Você poderia usar VarPtr ()
Atmocreations
Esta não é uma boa analogia. Veja este exemplo ( VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Indo com sua analogia, A = B | A = B;seria correto (e seria em C), mas Set A = B | A = &B;na verdade é correto no VBA (e falharia em C). Em VBA, A = Be Set A = Bsão ambos equivalentes a C's A = B;! A distinção acontece em outro lugar.
Niko O
77

No seu caso, isso produzirá um erro. :-)

Setatribui uma referência a objeto. Para todas as outras atribuições, a Letinstrução (implícita, opcional e pouco usada) está correta:

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

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

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

Do MSDN :

Definir palavra- chave: no VBA, a palavra-chave Definir é necessária para distinguir entre a atribuição de um objeto e a atribuição da propriedade padrão do objeto. Como as propriedades padrão não são suportadas no Visual Basic .NET, a palavra-chave Set não é necessária e não é mais suportada.

Galego
fonte
Bem encontrado, mas um link para o artigo que você encontrou no MSDN seria ainda melhor :)
Neil Barnwell
1
@ Neil - o link está lá se você clicar em MSDN no meu post.
#
2
Ao copiar o MSDN, pelo menos o artigo correto. Este se refere ao VB.NET, não ao VBA.
Tomalak
1
OP é perguntando sobre VBA, e embora a informação em ser mais necessário para o uso Situado no .NET é útil, é um fora do tópico e não é útil para pessoas que chegam aqui com o Object variable or With block variable not seterro do VBA :)
AJP
7
Muito obrigado pela extração do MSDN. Todas as outras respostas, mesmo as aceitas, estão faltando. 'set' é sobre PROPRIEDADE PADRÃO. Basta ler stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Set é usado para definir referências de objetos, em vez de atribuir um valor.

LeppyR64
fonte
1

Em cima da minha cabeça, Set é usado para atribuir objetos COM a variáveis. Ao fazer um Set, suspeito que, sob o capô, ele esteja fazendo uma chamada AddRef () no objeto para gerenciar sua vida útil.

Sean
fonte
1
Não é usado apenas para objetos COM, mas para todos os objetos. O principal motivo pelo qual você usa o SET é explicado pelo Galwegian.
Ikke
0

Então, quando você deseja definir um valor, não precisa de "Set"; caso contrário, se você estiver se referindo a um objeto, por exemplo, planilha / intervalo etc., precisará usar "Definir".

Eric Wang
fonte
-1

Set é uma palavra-chave e é usado para atribuir uma referência a um objeto no VBA.

Por exemplo, * O exemplo abaixo mostra como usar o Set no VBA.

Dim Dim WS As Worksheet

Defina WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Amit Singh
fonte