1

私の問題はこれです:

カスタム リボン コマンド ボタンまたはスプレッドシート内の単純なコマンド ボタンを使用して、OLEDB データベース接続を初期化し、そのような接続を必要とする、または私が指定した関連するすべてのユーザー定義関数を更新/再計算したいと考えています。特定のボタンがクリックされたときを除いて、これらの関数を再計算したくありません。これを行う方法を理解するのに苦労しています。ご支援やご提案をお願いいたします。

私が行ったことの詳細については、以下を参照してください。

私は現在、Excel で vba を使用して特定のクエリを作成するアクセス データベース内にデータを保存しています。[fnc] という名前のモジュールの下にある関数のグループ内に、各 datarequest ルーチンを埋め込みました。次に、Excel スプレッドシート内からユーザー定義関数としてそれらにアクセスします。次に例を示します。

 Function ValueV(mm As String, yy As String, qtable As String, qcode As String, compare_period As Integer, average_period As Integer, weight As Boolean) As Variant
 'Month Value Formula for Horizontal Data
 'mm - month value 2-digit
 'yy - year value 4-digit
 'qtable - query table name eg. "cpia"
 'qcode - query code for variable eg. "all0100"
 'avgperiod - lag periods to average in calculation eg. 3-avgperiods for quarterly measure, 1-avgperiod for point measure.
 'weight - boolean (true or false) value for weighting values given reference weight. Currently unsupported. Code should be extended to include this feature. (space holder for now)
  Dim lag_value As Variant
  Dim cur_value As Variant
  lag_value = 0
  cur_value = 0


     'STEP-A: Gets the initial Value average or not.
     '===============================================================
     If compare_period > 0 Then
     'Use this step to pickup initial value when compare_period <> 0 which requires a % change as opposed to a point value.
     'Average_period must be greater than or equal to one (1). One (1) represents the current month which is the same as a point value.
         lmm = fnc.lagdate(mm, yy, compare_period, "mm")                          'lag month (a single month for mValueH)
         lyy = fnc.lagdate(mm, yy, compare_period, "yy")                          'lag year (a single month for mValueH)
         smm = fnc.lagdate(mm, yy, compare_period + average_period - 1, "mm")     'dating backwards to account for average period
         syy = fnc.lagdate(mm, yy, compare_period + average_period - 1, "yy")     'dating backwards to account for average period
         'note, for smm & syy, the average period includes the lmm so we add back one (1)
         'eg. 3-mth average is not 3-lags but current and 2-lags.
         sdate1 = syy & fnc.numtext(smm)
         'start date for query (begining of lag value including average period)

         Set MyRecordset = New ADODB.Recordset
         MySql = sql.sqlVSers(lmm, lyy, qtable, qcode, sdate1)
         'MsgBox (MySql)
         MyRecordset.Open MySql, MyConnect, adOpenStatic, adLockReadOnly

         Do Until MyRecordset.EOF     'Loop to end and enter required values
         lag_value = lag_value + MyRecordset(qcode)
         MyRecordset.MoveNext
         Loop
         'Stop
         lag_value = lag_value / average_period
         MyRecordset.Close
     End If


     'STEP-B: Gets the current Value average or not.
     '===============================================================
         smm = fnc.lagdate(mm, yy, average_period - 1, "mm")           'dating backwards to account for average period
         syy = fnc.lagdate(mm, yy, average_period - 1, "yy")           'dating backwards to account for average period
         sdate1 = syy & fnc.numtext(smm)
         'start date for query (begining of lag value including average period)

         Set MyRecordset = New ADODB.Recordset
         MySql = sql.sqlVSers(mm, yy, qtable, qcode, sdate1)
         MyRecordset.Open MySql, MyConnect, adOpenStatic, adLockReadOnly

         Do Until MyRecordset.EOF     'Loop to end and enter required values
         cur_value = cur_value + MyRecordset(qcode)
         MyRecordset.MoveNext
         Loop

         cur_value = cur_value / average_period
         MyRecordset.Close


     'STEP-C: Calculates the Requested % Change or Point Value.
     '===============================================================
     If compare_period = 0 Then
         ValueV = cur_value
     Else
         ValueV = cur_value / lag_value * 100 - 100
     End If

 End Function

サブルーチンの使用を完全にバイパスするため、データベースへの接続は現在、以下に示すようにワークブック ヘルパー ルーチンとして行われています。

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Dim filePath
filePath = ThisWorkbook.Path
If Right$(filePath, 1) <> "\" Then filePath = filePath & "\"
MyConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & filePath & "rsdata.accdb;"
End Sub

問題は、この更新プロセスが望ましくないことです。理想的には、(クリックすると) データベースに接続し、特定のワークシートまたはワークブックで使用されるすべてのユーザー定義関数を再計算するカスタム ボタンをメニュー バー内に配置したいと考えています。

あなたの提案を提供するか、このようなことが以前に行われた可能性のある場所を指摘してください.

前もって感謝します。JR。

4

1 に答える 1

1

UDFを使用するように設計されていないことに使用しようとしています。それら行うように設計されているのは、他のセル数式と同じように動作し、Excel が必要であると判断したときに計算されることです。

2 つのオプションがあります

  • を使用しないようにアプリケーションを再設計しますUDF(IMOが最善の方法です)
  • UDFボタンのクリックなど、指定したトリガーにのみ応答するように を変更します(IMOはクラッジであり、一般的に悪い考えです)

UDFOPで開示されていない要因に依存しないように再設計する方法

于 2013-03-25T04:53:04.447 に答える