■No47434 (tonton さん) に返信
> 下のサンプルの子関数内にて呼び出し元の値を変えたいのですが、
できればイメージコードでは無く、実際のコードに近い物を転記していただけると助かります。
Text1 でも TextBox1 でもなく、TEXTBOX というコントロール名。
Str関数と被るような STR という変数名。
引数の型を明示していない Function。
戻り値の型を明示していない Function。
戻り値が常に固定値 0 を返すだけの Function。
いずれも文法的には正しいですが…実コードもそうなっているのでしょうか?
> 下のサンプルのコーディングを変える事なく実現可能でしょうか?
「呼び出す側」と「呼び出される側」、そのどちらも変更したくないという事でしょうか?
それは流石に不可能だと思いますよ。
どちらか片方に手を加えても良いのだとすれば、こういうのは如何でしょうか。
Option Explicit
' MODE = 0 : 元の実装
' MODE = 1 : 修正案1
' MODE = 2 : 修正案2
#Const MODE = 1
Private Sub Command1_Click()
Dim Ret As Integer
Text1.Text = "Old Value"
Ret = MOJISET(Text1)
MsgBox CStr(Ret) & vbCrLf & Text1.Text
End Sub
Private Sub Command2_Click()
Dim Ret As Integer
Dim s As String
s = "Old Value"
Ret = MOJISET(s)
MsgBox CStr(Ret) & vbCrLf & s
End Sub
Private Sub Command3_Click()
Dim Ret As Integer
Dim v As Variant
v = "Old Value"
Ret = MOJISET(v)
MsgBox CStr(Ret) & vbCrLf & CStr(v)
End Sub
#If MODE = 1 Then
Function MOJISET(ByRef moji As Variant) As Variant
If TypeOf moji Is TextBox Then
moji.Text = "A"
Else
moji = "A"
End If
MOJISET = 0
End Function
#ElseIf MODE = 2 Then
Function MOJISET(ByRef moji As Variant) As Integer
If TypeOf moji Is VB.Control Then
Dim c As Control
Set c = moji
Let c = "A"
ElseIf IsObject(moji) Then
Dim o As Object
Set o = moji
Let o = "A"
ElseIf VarType(moji) = vbString Then
moji = "A"
Else
Err.Raise 5
End If
MOJISET = 0
End Function
#Else
Function MOJISET(moji)
moji = "A"
MOJISET = 0
End Function
#End If
|