Excel VBA質問箱 IV

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

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


50903 / 76734 ←次へ | 前へ→

【30711】Re:イベントプロシージャーを自作関数
発言  ichinose  - 05/11/3(木) 21:16 -

引用なし
パスワード
   川崎 さん、Keinさん、こんばんは。

>すいません、説明不足でしたね。
そうですねえ・・、↓こういう説明は最初に記述しないとね!!

>私がしたいことを具体的にあげると
>たとえばA1セルにある数式を入れます。その数式が100の値を返した
>とします。次にそのA1が150を返したとするとその差分の
>150-100=50を計算してB1セルならB1セルに代入したいのです。
>ここで問題なのが、こういったことを何百ものセルで行いたいのです。
>たとえばF3〜F115など
>ですので関数にしたほうが記述上、運用上扱いやすくなるのではないかと
>思ったのです。
それと関連トピックはリンクしてください。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=29696;id=excel


>それとWorkbook_SheetCalculateはできるだけ必須にしてもらいたいのですが。
ユーザー定義関数を作成するのですから、↑の意味がわかりませんが・・・。

以下のような仕様の関数を考えます。

ユーザー定義関数名

calc_dsub_fvalue

機能

指定されたセルに連続して変化したデータの差を求める。

呼び出し形式

calc_dsub_fvalue(rng)
    
入力: rng-----rangeオブジェクト(単一セルに限る)
出力: calc_dsub_fvalue-----指定されたセル(rng)に連続して変化した2数の差


使用例


あるシートの

セルC1に「=calc_dsub_fvalue(B1)」と指定します。
セルB1に「=A1*20」と指定します。

セルA1には、最初に「20」と指定してEnterキーで確定してください。
セルB1、及び、C1は、共に「400」と表示されます。

次いで、セルA1に「25」と指定してEnterキーで確定してください。
セルB1は、「500」と表示され、
セルC1は、500−400の解である「100」が表示されます。


では、コードです。

標準モジュールに
'==================================================================
  Dim add_array() As String
  Dim val_array() As Double
'==================================================================
Function calc_dsub_fvalue(rng As Range)
  Dim array_idx As Variant
  Dim fvalue As Double
  Dim retcode As Long
  Dim wk As Variant
  With rng
    fvalue = 0
    array_idx = CVErr(1004)
    On Error Resume Next
    wk = UBound(add_array())
    retcode = Err.Number
    On Error GoTo 0
    If retcode = 0 Then
      array_idx = Application.Match(.Address(, , , True), add_array(), 0)
      If Not IsError(array_idx) Then
       fvalue = val_array(array_idx)
       End If
      End If
    calc_dsub_fvalue = Val(.Value) - fvalue
    If IsError(array_idx) Then
      If retcode <> 0 Then
       ReDim add_array(1 To 1)
       ReDim val_array(1 To 1)
      Else
       ReDim Preserve add_array(1 To UBound(add_array()) + 1)
       ReDim Preserve val_array(1 To UBound(val_array()) + 1)
       End If
      add_array(UBound(add_array())) = .Address(, , , True)
      val_array(UBound(val_array())) = Val(.Value)
    Else
      val_array(array_idx) = Val(.Value)
      End If
    End With
End Function


留意点                

この関数calc_dsub_fvalueは、複数のセルに同時に使用できますが、

Excel2000で最高でも約5000件、Excel2002以上でも65536までです。

尚、りんさんもおっしゃってましたが、

>グローバル変数は今一つ信用できないので(どのタイミングかで値が失われることがある)

この危険性はありますし、ユーザー定義関数にしてしまうと他のセルに保存と言うことも
出来ませんから、その場合は別の事を考えなくてはなりません。


以上です。
4 hits

【30694】イベントプロシージャーを自作関数 川崎 05/11/3(木) 3:44 質問
【30699】Re:イベントプロシージャーを自作関数 Kein 05/11/3(木) 11:41 回答
【30702】Re:イベントプロシージャーを自作関数 川崎 05/11/3(木) 13:42 質問
【30707】Re:イベントプロシージャーを自作関数 Kein 05/11/3(木) 15:45 発言
【30710】Re:イベントプロシージャーを自作関数 川崎 05/11/3(木) 18:57 質問
【30711】Re:イベントプロシージャーを自作関数 ichinose 05/11/3(木) 21:16 発言
【30725】Re:イベントプロシージャーを自作関数 川崎 05/11/4(金) 0:25 質問
【30727】Re:イベントプロシージャーを自作関数 ichinose 05/11/4(金) 7:02 発言
【30758】Re:イベントプロシージャーを自作関数 フレッツ 05/11/4(金) 14:33 お礼
【30790】Re:イベントプロシージャーを自作関数 ichinose 05/11/4(金) 19:40 発言
【30805】Re:イベントプロシージャーを自作関数 川崎 05/11/4(金) 23:01 質問
【30811】Re:イベントプロシージャーを自作関数 川崎 05/11/4(金) 23:30 質問
【30815】Re:イベントプロシージャーを自作関数 こたつねこ 05/11/4(金) 23:48 回答
【30812】Re:イベントプロシージャーを自作関数 こたつねこ 05/11/4(金) 23:33 発言
【30817】Re:イベントプロシージャーを自作関数 川崎 05/11/5(土) 0:05 回答
【30819】Re:イベントプロシージャーを自作関数 こたつねこ 05/11/5(土) 0:51 発言

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