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