2012-02-29 14 views
1

VBA関数(UDF)でグローバルスコープのオブジェクトを作成できますか?私は機能の実行時間を超えて持続しますか?私は他の関数に渡すことができるユニークなキーを持つハッシュでそれを張りたいです。私はc#/ C++ dllでこれを行うことができることを知っています。VBA:Excelでセッション永続オブジェクト(ハッシュ)を作成する

モチベーションは、何百もの関数呼び出しを繰り返したくないという重大な処理です。結果をキャッシュして1回だけするだけです。例えばのは、私は結果がセルA1にオブジェクトを構築するUDFを持っている想像してみましょう:

=CreateResultsObject(arg1, arg2, arg3...) 

機能が重い作業を行い、ユニークなID文字列(永続的なハッシュに格納されているオブジェクトのためのキー)を返します。セルA1にはこの文字列値が含まれており、他の関数に渡すことができます。キーを使用してハッシュ内のキャッシュされたオブジェクトにアクセスできます。

これは可能ですか?もしそうなら、どのように?

答えて

7

モジュール内で宣言する変数は永続的です。

Option Explicit 

Dim col As New Collection 


Public Function GetValue(ByVal strName As String) As String 

    GetValue = col.Item(strName) 

End Function 

Public Sub SetValue(ByVal strName As String, ByVal strValue As String) 

    col.Add strValue, strName 

End Sub 

注:コードは失敗し、重複や不足している名について

モジュールで

このコードは、あなたが望む方向に行くかもしれません。 文字列値の代わりに、関数シグネチャをそれに応じて変更することによって、あらゆる種類のオブジェクトを渡すことができました。

補遺:もう少し知性と

同じコード - コレクション内の既存のキーの値ではなく、エラーで失敗で置き換えられます。

Option Explicit 

Dim col As New Collection 


Public Function GetValue(ByVal strName As String) As String 

    GetValue = col.Item(strName) 

End Function 

Public Sub SetValue(ByVal strName As String, ByVal strValue As String) 

    If HasValue(strName) Then 
     col.Remove (strName) 
    End If 

    col.Add strValue, strName 

End Sub 

Private Function HasValue(ByVal strName As String) As Boolean 

    Dim val As Variant 
    Dim bRes As Boolean 

    bRes = True 

On Error Resume Next 

    val = col.Item(strName) 

    If Err.Number <> 0 Then 
     bRes = False 
     Err.Clear 
    End If 
On Error GoTo 0 

    HasValue = bRes 

End Function 
+0

同じ考え素晴らしいおかげではなく、コレクション(または辞書)を使用して:)よりエレガントである(1) – JMax

+0

ああ!あなたがモジュールスコープの変数を宣言できるかどうかは分かりませんでした。ありがとうvm –

+1

記録のために、[Ozgridの変数の範囲についてのこのリンク](http://www.ozgrid.com/VBA/variable-scope-lifetime.htm)は役に立ちます – JMax

2

モジュール内でグローバル変数を使用するとどうなりますか?ワークシートでCreateResultsObject()を呼び出す場合にのみ、あなたのハッシュが再計算されます

Option Explicit 
Dim sHash As String 

Function CreateResultsObject() 
    'very long code 
    sHash = "MyTest" 
    CreateResultsObject = "ok" 
End Function 

Function displayresultsobject() 
    displayresultsobject = sHash 
End Function 

注意し、再計算を頼むたび:

このような何か。

+0

鉱山としてVM –

関連する問題