[[20081230004711]] 『ユーザー定義関数の再計算?』(human) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

 『ユーザー定義関数の再計算?』(human)
常にアクティブシートの一つ前のシートのセル内容を参照する関数を作成したのですが
関数を入力した後に手前のシートのセルの値を変更しても、関数の戻り値が更新されません
Application.Calculateを実行しても更新されず、関数を入れ直すと変更した値が表示されます。
数十枚のシートがあり、都度関数を入れ直さなければ機能しない状態です。そもそも関数自体に問題が
あるのでしょうか? 解決策は有りますでしょうか。宜しくお願いします。

 WindowsXP
 Excel2003

 Function myref(cel As Range)
    If ActiveSheet.Index > 1 Then
        myref = Sheets(ActiveSheet.Index - 1).Range(cel.Address).Text
    Else
        myref = "参照できません"
    End If
 End Function


 再計算させるタイミングを考えないとダメですよね。
シートがアクティブになった時とか。
(bbq)

 >そもそも関数自体に問題があるのでしょうか? 

 まあ、問題があるのか となれば、「ある」のでしょうねえ!!
 再計算を行うトリガーとなる引数がない と言うことですよね?

 Function myref(cel As Range)

 この宣言で  セルに =myref(a1)

 等と関数を記述してしまっては、当該シートのセルA1を引数に渡している事になりますからねえ・・・。

 上記の記述では、当該シートのセルA1を更新しないと関数は 再計算されませんね!!

 「再計算を行うトリガーとなる引数がない関数」というのは、出来の良い関数ではありません。

 他の考え方で対処する方法がないか 熟考してください。

 が、場合によってはこの手の関数が必要なこともあるかもしれません。

再計算を行うトリガーとなる引数がない関数の作成方法

 まず、

 「ツール」----「オプション」とクリックし、オプションダイアログを表示させ、
 「計算方法」タブの計算方法を「自動」に設定してください。

 次に問題の関数ですが、

 Function myref(cell_add As Variant) As Variant
    Dim sht As Object
    Application.Volatile
    On Error Resume Next
    Set sht = Application.Caller.Parent.Previous
    If Err.Number = 0 Then
       myref = sht.Range(cell_add).Text
    Else
       myref = "参照できません"
    End If
    On Error GoTo 0
 End Function

 としてください。

 運用方法は、 セルに

 =myref("A1")     等と指定して下さい。

 但し、上記の関数を多用すると、ブックの動作が遅くなりますよ!!

 一例ですが、試してみて下さい

 ichinose

 


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.