|
川崎 さん、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までです。
尚、りんさんもおっしゃってましたが、
>グローバル変数は今一つ信用できないので(どのタイミングかで値が失われることがある)
この危険性はありますし、ユーザー定義関数にしてしまうと他のセルに保存と言うことも
出来ませんから、その場合は別の事を考えなくてはなりません。
以上です。
|
|