Excel VBA質問箱 IV

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

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


36644 / 76732 ←次へ | 前へ→

【45267】Re:セルへの書き込み方法
発言  ichinose  - 06/12/17(日) 0:16 -

引用なし
パスワード
   こんばんは。

>代替案があるかと思います。
>質問をシンプルにすると
>セル(例えば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に数値を入れて結果を確認してみてください。

この方法だと不連続なセルでも計算は可能です。

本来の処理内容と上記の方法とを検討してみて下さい。

0 hits

【45244】セルへの書き込み方法 06/12/16(土) 16:43 質問
【45245】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 16:58 発言
【45247】Re:セルへの書き込み方法 06/12/16(土) 17:13 質問
【45248】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 17:23 発言
【45249】Re:セルへの書き込み方法 06/12/16(土) 18:35 質問
【45251】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 18:42 発言
【45253】Re:セルへの書き込み方法 06/12/16(土) 19:04 質問
【45254】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 19:14 発言
【45257】Re:セルへの書き込み方法 06/12/16(土) 19:27 質問
【45260】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 20:02 発言
【45259】Re:セルへの書き込み方法 06/12/16(土) 19:50 発言
【45261】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 20:07 発言
【45265】Re:セルへの書き込み方法 Kein 06/12/16(土) 22:00 回答
【45266】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 22:08 発言
【45246】Re:セルへの書き込み方法 ichinose 06/12/16(土) 17:12 発言
【45250】Re:セルへの書き込み方法 06/12/16(土) 18:40 お礼
【45252】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 18:44 発言
【45255】Re:セルへの書き込み方法 06/12/16(土) 19:19 質問
【45256】Re:セルへの書き込み方法 ichinose 06/12/16(土) 19:25 発言
【45258】Re:セルへの書き込み方法 06/12/16(土) 19:43 質問
【45263】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 20:11 発言
【45267】Re:セルへの書き込み方法 ichinose 06/12/17(日) 0:16 発言
【45262】Re:セルへの書き込み方法 かみちゃん 06/12/16(土) 20:09 発言

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