Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1871 / 13645 ツリー ←次へ | 前へ→

【71366】Functionで2つ以上の変数 AoYasu 12/2/25(土) 10:17 質問[未読]
【71368】Re:Functionで2つ以上の変数 ichinose 12/2/25(土) 11:56 発言[未読]
【71371】Re:Functionで2つ以上の変数 AoYasu 12/2/25(土) 14:50 お礼[未読]
【71369】Re:Functionで2つ以上の変数 UO3 12/2/25(土) 13:24 発言[未読]

【71366】Functionで2つ以上の変数
質問  AoYasu  - 12/2/25(土) 10:17 -

引用なし
パスワード
   以下のようなFunctionを書いたのですがこの中でRetu;Gyouの変数の値も
Subプロシージャーに引き渡したいのですが 可能なのでしょうか
よろしくお願いいたします
    Function GetRange(ByVal N_Range As String) As String
     Dim F_Cnt As Integer
     Dim F_Instr As Integer
     Dim Gyou As String
     Dim Retu As String
     Dim NRetu As Integer
     Dim NGyou As Integer
     Dim Msu As Integer
 Do
  If InStr(1, N_Range, "$") = 0 Then
    Exit Do
  Else
    N_Range = Trim(Mid(N_Range, (InStr(N_Range, "$") + 1)))
    NRetu = InStr(1, N_Range, "$")
    Retu = Left(N_Range, NRetu - 1)  'B      
    Gyou = Trim(Mid(N_Range, (InStr(N_Range, "$")+1))) 'N_Range=B$2 
    Msu = Len(N_Range)
    NGyou = InStr(1, N_Range, "$")
    Gyou = Right(N_Range, Msu - NGyou) '2      
    N_Range = Retu & Gyou      ' B2
  End If
Loop
GetRange = N_Range
End Function

【71368】Re:Functionで2つ以上の変数
発言  ichinose  - 12/2/25(土) 11:56 -

引用なし
パスワード
   こんにちは。
>以下のようなFunctionを書いたのですがこの中でRetu;Gyouの変数の値も
>Subプロシージャーに引き渡したいのですが 可能なのでしょうか
四則計算をするFunctionプロシジャーを考えます。

Function名   四則計算

機能      与えれた二つの整数で 足し算、引き算、掛け算、割り算の
        答えを返します


一つは、Functionの戻り値を配列で返す方法


Function 四則計算(ByVal x As Long, ByVal y As Long) As Variant
  Dim ans(1 To 4) As Double
  ans(1) = x + y
  ans(2) = x - y
  ans(3) = x * y
  ans(4) = x / y
  四則計算 = ans()
  Erase ans()
End Function


'呼び出し元では、

Sub test1()
  Dim 答え As Variant
  Dim a As Long
  Dim b As Long
  a = 10
  b = 5
  答え = 四則計算(a, b)
  MsgBox "足し算 " & a & "+" & b & "=" & 答え(1)
  MsgBox "引き算 " & a & " - " & b & " = " & 答え(2)
  MsgBox "掛け算 " & a & "×" & b & "=" & 答え(3)
  MsgBox "割り算 " & a & "÷" & b & "=" & 答え(4)
End Sub


もう一つは、一番頻度の高そうな結果をFucntion xxのxxで返し(ここでは足し算)、
付録的に他の計算は、パラメータで返す方法。


Function 和(ByVal x As Long, ByVal y As Long, 差 As Double, 積 As Double, 商 As Double) As Double
  和 = x + y
  差 = x - y
  積 = x * y
  商 = x / y
End Function


'呼び出し元では、
Sub test2()
  Dim 引き算 As Double
  Dim 掛け算 As Double
  Dim 割り算 As Double
  Dim a As Long
  Dim b As Long
  a = 10
  b = 5
  MsgBox "足し算 " & a & "+" & b & "=" & 和(10, 5, 引き算, 掛け算, 割り算)
  MsgBox "引き算 " & a & " - " & b & " = " & 引き算
  MsgBox "掛け算 " & a & "×" & b & "=" & 掛け算
  MsgBox "割り算 " & a & "÷" & b & "=" & 割り算
End Sub

どっちが良いかは、Functionの内容にもよります。
検討してみてください。

【71369】Re:Functionで2つ以上の変数
発言  UO3  - 12/2/25(土) 13:24 -

引用なし
パスワード
   ▼AoYasu さん:

こんにちは

ichinoseさんから、代表的な方法である配列利用がご紹介されました。
私自信も、これをよく使います。もう1つも代表的な(?)方法であるユーザー定義構造体を使う方法と
もう1つ、これは、できるよ ということで、わかりにくくなるので、私自身は、なるべく使わないように
していますが、ByRef(省略すれば ByRefです)機能を使う方法です。

Test1 と GetProc1 の組み合わせが前者、Test2 と GetProc2 の組み合わせが後者です。

Option Explicit

Type RtnData   '名前は任意に
  ans1 As String
  ans2 As Long
  ans3 As Long
End Type

Sub Test1()
  Dim myAns As RtnData
  
  myAns = getProc1(Range("B5"))
  MsgBox myAns.ans1
  MsgBox myAns.ans2
  MsgBox myAns.ans3
  
End Sub


Function getProc1(target As Range) As RtnData
  getProc1.ans1 = target.Address
  getProc1.ans2 = target.Row
  getProc1.ans3 = target.Column
End Function

'======================================

Sub Test2()
  Dim ans1 As String
  Dim ans2 As Long
  Dim ans3 As Long
  
  Call GetProc2(Range("B5"), ans1, ans2, ans3)
  MsgBox ans1
  MsgBox ans2
  MsgBox ans3

End Sub

Sub GetProc2(target As Range, ans1 As String, ans2 As Long, ans3 As Long) 'Function仕立てでもよろしいのですが
  ans1 = target.Address
  ans2 = target.Row
  ans3 = target.Column
End Sub

【71371】Re:Functionで2つ以上の変数
お礼  AoYasu  - 12/2/25(土) 14:50 -

引用なし
パスワード
   ▼ichinose さん:UO3さん
ご丁寧な解答をいただきありがとうございました
早速配列を使用して実行しました
いい勉強になりました

1871 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free