Excel VBA質問箱 IV

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

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


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

【80263】ユーザー定義関数の質問です 吉庄 18/12/9(日) 20:37 質問[未読]
【80264】Re:ユーザー定義関数の質問です γ 18/12/9(日) 21:01 回答[未読]
【80265】Re:ユーザー定義関数の質問です γ 18/12/10(月) 7:35 発言[未読]
【80266】Re:ユーザー定義関数の質問です 吉庄 18/12/11(火) 13:48 お礼[未読]

【80263】ユーザー定義関数の質問です
質問  吉庄 E-MAIL  - 18/12/9(日) 20:37 -

引用なし
パスワード
   下のWorksheet 関数Deliv33をworksheet上で 「=Deliv33(A1)」と記入しEnterすると#value!となります。
ところが、黄色のSQST.Cells(JJ,K).Value = ARG1をコメントアウトすると呼び出しもとのworksheetで、「=Deliv33(A1)」と記入しEnterを押すと正しく動作します。
IFの一行下をSET SQST.Cells(JJ,K).Value = ARG1はダメでした。一行目のARG1はDATE形式を指しているのでAS  RANGEをAS DATEにしてみましたがダメでした。
どうしたらこの不具合を訂正できますでしょうか?ご教示いただければありがたいのですが、よろしくお願いいたします。

Public Function DELIV33(ByVal ARG1 As Range) As Date
    FNAME = Workbooks(1).Name
    Set CST = Workbooks(FNAME).Sheets(3)
    Set SQST = Workbooks(FNAME).Sheets(13)
    
    If Not IsEmpty(ARG1) Then
      SQST.Cells(JJ,K).Value = ARG1
      DELIV33 = SQST.Cells(65, 11).Value
      Exit Function
    End If
End Function

【80264】Re:ユーザー定義関数の質問です
回答  γ  - 18/12/9(日) 21:01 -

引用なし
パスワード
   ▼吉庄 さん:
>どうしたらこの不具合を訂正できますでしょうか?
不具合ではありません。

仕様です。
ユーザー定義関数は、
セットされているセル以外のセルの状態を変更することが禁止されています。

Excel のユーザー定義関数の制限について
ht tps://support.microsoft.com/ja-jp/help/170787/description-of-limitations-of-custom-functions-in-excel

【80265】Re:ユーザー定義関数の質問です
発言  γ  - 18/12/10(月) 7:35 -

引用なし
パスワード
   補足:

ユーザー定義関数ではないプロシージャであれば何でも可能ですが、
ユーザー定義関数にはワークシート関数としての制約があります。

こうしたことを認めてしまうと、そのセルに書かれた内容だけでなく、
セルに影響を及ぼす範囲がすべてのセルに拡がってしまって、
トレーサビリティが失われてしまいます。
検証ができなくなってしまいます。そういうことではないでしょうか。

注目しているセル以外の変更やセルの書式の変更
(これを"副作用"と呼ぶことが多い)に禁欲的であることは、
関数型の言語に見られる特徴のひとつです。

【80266】Re:ユーザー定義関数の質問です
お礼  吉庄 E-MAIL  - 18/12/11(火) 13:48 -

引用なし
パスワード
   ▼γ さん:
早速のご返事ありがとうございます。
Specなんですね。別の方法を考えてみます。
大変有難うございました。

以上

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