Posso declarar e atribuir uma variável no VBA simultaneamente?

163

Sou novo no VBA e quero saber se posso converter a seguinte declaração e atribuição em uma linha:

Dim clientToTest As String
clientToTest = clientsToTest(i)

ou

Dim clientString As Variant
clientString = Split(clientToTest)
Ian R. O'Brien
fonte

Respostas:

237

Infelizmente, não há taquigrafia no VBA. O mais próximo que você vai chegar é uma coisa puramente visual, usando o :caractere de continuação, se você o quiser em uma linha para facilitar a leitura;

Dim clientToTest As String:  clientToTest = clientsToTest(i)
Dim clientString As Variant: clientString = Split(clientToTest)

Dica (resumo de outras respostas / comentários): Também funciona com objetos (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"
Alex K.
fonte
13
+1, lembro que a Microsoft sugeriu durante a criação do .NET que os desenvolvedores do VB6 começaram a fazer isso para nos prepararmos para o VB.NET.
John M Gant
Essa é minha maior reclamação sobre o VBA; Aposto que levaria um programador júnior apenas um dia para adicionar esse atalho ao VBA se a gerência quisesse adicioná-lo.
Pete Alvin
21

Você pode fazer isso com objetos, como a seguir.

Dim w As New Widget

Mas não com strings ou variantes.

John M Gant
fonte
Isso não está correto, como um todo. Você pode declarar e inicializar uma variável na mesma linha com qualquer tipo de dados (valor ou objeto), simplesmente separando a "ação" com o semicolo :. Existem algumas limitações, pois você não pode ter várias declarações de valor na mesma linha (ou seja var1 = val1: var2 = val2). Irá funcionar de maneira esperada e permitir que você faça esse tipo de tarefa algumas vezes, mas como um todo, não sugerido por esta notação.
GoldBishop 10/10
2
@GoldBishop, sim, usar os dois pontos para combinar várias declarações em uma única linha geralmente funciona (como disse Alex K.). O que estou dizendo não funcionará com strings ou variantes (ou provavelmente com outras primitivas) é a Dim x As New Tsintaxe, que funciona apenas com objetos.
John M Gant
Sim, não funcionará em uma linha de inicialização do construtor, mas funcionará com as atribuições de variantes e seqüências. Eu o uso o tempo todo para tipos de valor e alguns tipos de objeto. dim str as String: str = "value"e dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")ambos funcionam repetidamente. Embora, se eu fizer uma instanciação de objeto, ocorrerá dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")um erro como qualquer outra operação inválida no VBA.
GoldBishop 10/10
3
O truque de dois pontos funciona com atribuições de variantes e seqüências de caracteres. A Newpalavra-chave não. É tudo o que estou dizendo.
John M Gant
2
@JohnMGrant pode querer esclarecer sua resposta, como eu a li, afirma: que você não pode fazer a mesma linha com a inicialização do construtor e os tipos de valor de string / variante. Pode ser um pouco confuso para alguns.
GoldBishop 10/10
2

de fato, você pode, mas não dessa maneira.

Sub MySub( Optional Byval Counter as Long=1 , Optional Byval Events as Boolean= True)

'code...

End Sub

E você pode definir as variáveis ​​de maneira diferente ao chamar o sub, ou deixá-los com seus valores padrão.

Patrick Lepelletier
fonte
5
Isso é para argumentos, não para variáveis ​​locais.
Ivan_pozdeev 9/07
1

Em alguns casos, toda a necessidade de declarar uma variável pode ser evitada usando a Withinstrução .

Por exemplo,

    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    If fd.Show Then
        'use fd.SelectedItems(1)
    End If

isso pode ser reescrito como

    With Application.FileDialog(msoFileDialogSaveAs)
      If .Show Then
        'use .SelectedItems(1)
      End If
    End With
Vadzim
fonte
0

Você pode definir e atribuir valor como mostrado abaixo em uma linha. Dei um exemplo de duas variáveis ​​declaradas e atribuídas em uma única linha. se o tipo de dados de várias variáveis ​​for o mesmo

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Arpan Saini
fonte