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で呼び出すときはまた別なので注意。