|
こんばんは。
>代替案があるかと思います。
>質問をシンプルにすると
>セル(例えば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に数値を入れて結果を確認してみてください。
この方法だと不連続なセルでも計算は可能です。
本来の処理内容と上記の方法とを検討してみて下さい。
|
|