VBAで変数を同時に宣言して割り当てることはできますか?


163

私はVBAを初めて使用するので、次の宣言と割り当てを1行に変換できるかどうかを知りたいです。

Dim clientToTest As String
clientToTest = clientsToTest(i)

または

Dim clientString As Variant
clientString = Split(clientToTest)

回答:


237

残念ながらVBAには省略形はありません:。読みやすくするために1行に続けたい場合は、継続文字を使用して純粋に視覚的なものになります。

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

ヒント(他の回答/コメントの要約):オブジェクトでも機能します(Excel 2010):

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

13
+ 1、Microsoftが.NETの構築中にVB6開発者がVB.NETの準備をするためにこれを始めることを提案したことを覚えています。
ジョンMガント2010

これが、VBAに関する私の最大の不満です。このショートカットをVBAに追加するには、管理職がそれを追加したいと思った場合、ジュニアプログラマーがたった1日で済むと思います。
ピートアルビン

21

次のように、オブジェクトを使用して並べ替えることができます。

Dim w As New Widget

ただし、文字列やバリアントは使用できません。


全体として、これは正しくありません。「アクション」をsemi-coloで区切るだけで、同じ行の変数を任意のデータ型(値またはオブジェクト)で宣言して初期化できます:。同じ行に複数の値を宣言することはできないため、いくつかの制限があります(つまりvar1 = val1: var2 = val2)。それは散発的にバグアウトし、このタイプの割り当てを時々行うことを可能にしますが、全体として、この表記では示唆されていません。
GoldBishop 2012年

2
@GoldBishop、そうです、コロンを使用して複数のステートメントを1行に結合することは、一般的に機能します(Alex K.が言ったように)。文字列やバリアント(またはおそらく他のプリミティブ)でもDim x As New T機能しないのは、オブジェクトでのみ機能する構文です。
ジョンMガント

ええ、コンストラクタ初期化行では機能しませんが、バリアントと文字列の割り当てで機能します。値型と一部のオブジェクト型には常に使用しています。dim str as String: str = "value"そして、dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")繰り返し作業の両方。ただし、オブジェクトをインスタンス化dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")すると、VBAの他の無効な操作と同様にエラーが発生します。
GoldBishop 2012年

3
コロントリックは、バリアントと文字列の割り当てで機能します。Newキーワードはありません。私が言っているのはそれだけです。
ジョンMガント

2
@JohnMGrantは、私が読んだように、あなたの答えを明確にしたいと思うかもしれません。少し混乱するかもしれません。
GoldBishop 2012年

2

実際にはできますが、そうはできません。

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

'code...

End Sub

また、サブルーチンを呼び出すときに変数を別の方法で設定することも、デフォルト値のままにすることもできます。


5
これは引数用であり、ローカル変数ではありません。
ivan_pozdeev 2017

1

場合によっては、Withステートメントを使用することで、変数を宣言する必要性全体を回避できます。

例えば、

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

これは次のように書き直すことができます

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

0

以下に示すように、1行で値を定義して割り当てることができます。宣言して割り当てられた2つの変数の例を1行で示しました。複数の変数のデータ型が同じ場合

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.