|    | 
     こんばんは。 
 
>代替案があるかと思います。 
>質問をシンプルにすると 
>セル(例えばA1)から呼び出された関数(=test(C1,D1))で 
>呼び出したセル以外に値を書き込むことができるか 
>知りたかったのです。 
これは、最初に投稿したとおり、出来ないと思います。 
 
>今回は、勤務表を例に説明したので 
>ユーザー定義関数の必要性が伝わらないと思います。 
 
ということは実際は勤務表の関数ではないということですか? 
 
ひとつの関数で複数の結果を得ることが出来る関数Testがあります 
この関数だけで複数の結果が得られるのでこれを有効利用したい 
 
ということでしょうかねえ?? 
 
一般的には何度か申し上げましたが、イベントプロシジャー 
(KeinさんがWorksheet_Changeでのコード例を示されています) 
を使うということがすぐに思い浮かびます。 
このイベントプロシジャーの中で作成した関数Testを呼び出すと 
いう方法です。 
 
ただし、提示されたような関数Testでは汎用的に運用はしにくいと思いますよ。 
例えば、指定された二つのセルの和と差を求める関数Testを考えます。 
 
以下のコードは、アクティブシートの 
セルA1、A2に入力された数値の和をB2、差をB3に出力します。 
新規ブックのアクティブシートのモジュールに 
'================================================ 
Private Sub Worksheet_Change(ByVal Target As Range) 
  Dim ans As Variant 
  Application.EnableEvents = False 
  If Not Application.Intersect(Target, Range("a1:a2")) Is Nothing Then 
    ans = test(Range("a1"), Range("a2")) 
    Range("b2").Value = ans(1) 
    Range("b3").Value = ans(2) 
    End If 
  Application.EnableEvents = True 
End Sub 
 
標準モジュールに 
'====================================================== 
Function test(rng1 As Range, rng2 As Range) As Variant 
  Dim ans(1 To 2) As Variant 
  ans(1) = Val(rng1.Value) + Val(rng2.Value) 
  ans(2) = Val(rng1.Value) - Val(rng2.Value) 
  test = ans() 
  Erase ans() 
End Function 
 
 
これで当該シートのA1又はA2にデータが入力されると上記の 
コードが実行されます。 
このようにして、既存関数Testを利用する方法が考えられます。 
 
 
他には、・・・と考えられることを記述すると・・・、 
 
 
1.配列数式を使うと言う方法があります。 
 
但し、これは、上記の和と差を表示するセル範囲が 
連続したセル範囲である場合です。 
 
標準モジュールに 
 
'================================================ 
Function test1(rng1 As Range, rng2 As Range) As Variant 
  With Application.Caller 
    Dim ans(1 To 2) As Variant 
    ans(1) = Val(rng1.Value) + Val(rng2.Value) 
    ans(2) = Val(rng1.Value) - Val(rng2.Value) 
    If .Columns.Count > 1 Then 
     test1 = ans() 
    ElseIf .Rows.Count > 1 Then 
     test1 = Application.Transpose(ans()) 
     End If 
    Erase ans() 
    End With 
End Function 
 
 
上記のtest1という関数を配列数式で運用します。 
 
例 セルA1、A2の和と差をB2、C2に設定する 
 
セルB2:C2の二つセルを選択した状態で 
数式バーに 「=test1(a1,a2)」と入力します。 
ただし、セルの確定は、Enterキーではなく、 
Ctrl+Shift+Enterキーで確定してください。 
 
A1、A2に数値を入れて結果を確認してみてください。 
 
この方法は、あくまでもセル範囲が連続している場合に限ります。 
 
 
2.関数に処理パラメータを付ける 
 
標準モジュールに 
'======================================================= 
Function test2(rng1 As Range, rng2 As Range, Optional enzan As Long = 0) As Variant 
  'enzan 0 加算 1 減算 
  Select Case enzan 
   Case 0 
     test2 = Val(rng1.Value) + Val(rng2.Value) 
   Case 1 
     test2 = Val(rng1.Value) - Val(rng2.Value) 
   End Select 
End Function 
 
 
とします。 
 
例 セルA1、A2の和と差をB2、C2に設定する 
 
セルB2に 「=test2(a1,a2)」と入力し、これはEnterキーで確定します。 
セルC2には、「=test2(a1,a2,1)」と入力し、これはEnterキーで確定します。 
 
A1、A2に数値を入れて結果を確認してみてください。 
 
この方法だと不連続なセルでも計算は可能です。 
 
本来の処理内容と上記の方法とを検討してみて下さい。 
 | 
     
    
   |