VBAの隠れた機能 質問する

VBAの隠れた機能 質問する

VBA 言語のどの機能のドキュメントが不十分か、または単にあまり使用されていないのでしょうか?

ベストアンサー1

このトリックは Access VBA でのみ機能し、Excel やその他のアプリケーションでは機能しません。ただし、モジュール名の前にアンダースコアを付けることで、標準モジュールをオブジェクト ブラウザーから非表示にすることができます。その後、オブジェクト ブラウザーを変更して非表示のオブジェクトを表示する場合にのみ、モジュールが表示されます。

このトリックは、すべての vb6 ベースの VBA バージョンの Enum で機能します。名前を括弧で囲み、その前にアンダースコアを付けることで、Enum の非表示メンバーを作成できます。例:

Public Enum MyEnum
    meDefault = 0
    meThing1 = 1
    meThing2 = 2
    meThing3 = 3
    [_Min] = meDefault 
    [_Max] = meThing3 
End Enum

Public Function IsValidOption(ByVal myOption As MyEnum) As Boolean
    If myOption >= MyEnum.[_Min] Then IsValidOption myOption <= MyEnum.[_Max]
End Function

Excel-VBAでは、セルを括弧で囲んで参照することができます。括弧は、評価コマンド数式の構文を評価できます。

Public Sub Example()
    [A1] = "Foo"
    MsgBox [VLOOKUP(A1,A1,1,0)]
End Sub

また、LSet を同じサイズのユーザー定義型と組み合わせることで、MemCopy (RtlMoveMemory) を使用せずに生データを渡すこともできます。

Public Sub Example()
    Dim b() As Byte
    b = LongToByteArray(8675309)
    MsgBox b(1)
End Sub

Private Function LongToByteArray(ByVal value As Long) As Byte()
    Dim tl As TypedLong
    Dim bl As ByteLong
    tl.value = value
    LSet bl = tl
    LongToByteArray = bl.value
End Function

8 進数と 16 進数のリテラルは実際には符号なしの型であり、どちらも -32768 を出力します。

Public Sub Example()
    Debug.Print &H8000
    Debug.Print &O100000
End Sub

前述のように、括弧内の変数を渡すと、ByVal で渡されます。

Sub PredictTheOutput()
    Dim i&, j&, k&
    i = 10: j = i: k = i
    MySub (i)
    MySub j
    MySub k + 20
    MsgBox Join(Array(i, j, k), vbNewLine), vbQuestion, "Did You Get It Right?"
End Sub

Public Sub MySub(ByRef foo As Long)
    foo = 5
End Sub

文字列をバイト配列に直接割り当てることも、その逆も可能です。

Public Sub Example()
    Dim myString As String
    Dim myBytArr() As Byte
    myBytArr = "I am a string."
    myString = myBytArr
    MsgBox myString
End Sub

「Mid」も演算子です。これを使用すると、VBA の悪名高いほど遅い文字列連結を使用せずに、文字列の特定の部分を上書きできます。

Public Sub Example1()
    ''// This takes about 47% of time Example2 does:
    Dim myString As String
    myString = "I liek pie."
    Mid(myString, 5, 2) = "ke"
    Mid(myString, 11, 1) = "!"
    MsgBox myString
End Sub

Public Sub Example2()
    Dim myString As String
    myString = "I liek pie."
    myString = "I li" & "ke" & " pie" & "!"
    MsgBox myString
End Sub

おすすめ記事