VBA'da aynı anda bir değişken tanımlayıp atayabilir miyim?


165

VBA'da yeniyim ve aşağıdaki beyanı ve atamayı tek bir satıra dönüştürüp dönüştüremeyeceğimi bilmek istiyorum:

Dim clientToTest As String
clientToTest = clientsToTest(i)

veya

Dim clientString As Variant
clientString = Split(clientToTest)

Yanıtlar:


239

Ne yazık ki VBA'da kısayol yok, en yakın alacağınız, :okunabilirlik için bir satırda istiyorsanız , devam karakterini kullanan tamamen görsel bir şeydir ;

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

İpucu (diğer cevapların / yorumların özeti): Nesnelerle de çalışır (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"

13
+1, Microsoft'un .NET'i oluşturma sırasında VB6 geliştiricilerinin kendimizi VB.NET için hazır hale getirmeye başladığını önerdiğini hatırlıyorum.
John M Gant

Bu VBA ile ilgili en büyük şikayetim; Bahse girerim, genç bir programcıya yönetim eklemek için bu kısayolu VBA'ya eklemek sadece bir gün sürer.
Pete Alvin

21

Bunu, aşağıdakiler gibi, nesnelerle yapabilirsiniz.

Dim w As New Widget

Ancak dizelerle veya varyantlarla değil.


Bu bir bütün olarak doğru değil. Herhangi bir veri türüyle (değer veya nesne) aynı satırdaki bir değişkeni, yalnızca "eylemi" noktalı virgülle ayırarak bildirebilir ve başlatabilirsiniz :. Aynı satırda (yani var1 = val1: var2 = val2) birden fazla değer bildirimine sahip olamayacağınız için bazı sınırlamalar vardır . Speradik bir şekilde ortaya çıkacak ve bazen bu tür bir ödev yapmanıza izin verecek, ancak bir bütün olarak bu gösterimle önerilmeyecektir.
GoldBishop

2
@ GoldBishop, evet, iki ifadeyi tek bir satıra birleştirmek için iki nokta üst üste kullanmak genellikle işe yarar (Alex K.'nın dediği gibi). Dediğim şey, dizelerle veya varyantlarla (veya muhtemelen diğer ilkellerle) çalışmaz Dim x As New T, yalnızca nesnelerle çalışan sözdizimidir.
John M Gant

evet bir Oluşturucu Başlatma satırında çalışmaz ama Varyant ve Dize atamaları ile çalışır. Değer Türleri ve bazı Nesne Türleri için her zaman kullanıyorum. dim str as String: str = "value"ve dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")her ikisi de tekrar tekrar çalışıyor. Ancak, bir Nesne örnekleme yaparsanız dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1"), VBA herhangi bir geçersiz işlem gibi hata olur.
GoldBishop

3
İki nokta üst üste hile, varyant ve dize atamalarıyla çalışır. NewAnahtar kelime yok. Tüm söylediğim bu.
John M Gant

2
@JohnMGrant cevabınızı, okuduğum gibi açıklığa kavuşturmak isteyebilir: yapıcı başlatma ve dize / varyant değer türleriyle aynı satır ataması yapamazsınız. Bazıları için biraz kafa karıştırıcı olabilir.
GoldBishop

2

aslında, yapabilirsiniz, ama bu şekilde değil.

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

'code...

End Sub

Alt değişkenleri çağırırken değişkenleri farklı şekilde ayarlayabilir veya varsayılan değerlerine bırakabilirsiniz.


5
Bu, bağımsız değişkenler içindir, yerel değişkenler için değildir.
ivan_pozdeev

1

Bazı durumlarda, bir değişkenin beyan edilmesine ilişkin tüm ihtiyaç, deyim kullanılarak önlenebilir.With .

Örneğin,

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

bu şu şekilde yeniden yazılabilir

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

0

Aşağıda gösterildiği gibi bir satırda değer tanımlayabilir ve atayabilirsiniz. Tek bir satırda bildirilen ve atanan iki değişkenin bir örneğini verdim. birden çok değişkenin veri türü aynıysa

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.