VB6までのStringのByVal渡しは、深いコピーになる。 自信がなくてExcel 2003 VBA6で試してみたが確かにそうだ。 Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Sub f(ByVal s As String) s = "bar" ' Call MoveMemory(StrPtr(s), StrPtr("bar"), 6) End Sub
Sub Test() Dim s As String s = "foo" f s MsgBox s End Sub 262が指摘しているとおり、Declareで呼び出すときはまた別なので注意。