• 検索結果がありません。

3 ブックの作成

3.6 マクロの使用

3.6.17 コールバックの使用

Analysis には、特定のイベントに伴って実行されるさまざまなコールバックがあります。コールバック

'Workbook_SAP_Initialize' は必ず実行されます。次に示すその他のコールバックは、はじめて使用する前に API メソッド

'SAPExecuteCommand' を使用して登録されている必要があります。コールバックを登録解除するのにも、

'SAPExecuteCommand' を使用できます。

すべてのコールバックは 1 つのブックに 1 度だけ登録できます。 これらのコールバックのいずれかを 2 度目に登録すると、最 初に登録されたものが上書きされます。

注記

'Workbook_SAP_Initialize' コールバックは、VBA エディタの 'ThisWorkbook' セクションに定義される必要があります。

その他のコールバックは、モジュールに定義しておく必要があります。 'ThisWorkbook' またはシートセクションに定義した 場合、登録中に完全に参照できる必要があります。 'ThisWorkbook' セクションでは、たとえば参照として

ThisWorkbook.<MacroName> を使用する必要があります。

Workbook_SAP_Initialize

このコールバックを使用してブックの初期化ロジックを定義します。このコールバックは、Microsoft Excel に用意されている 'Workbook_Open' イベントに似ていますが、Microsoft Excel イベントと Analysis 標準の初期化処理の後に実行されます。

Microsoft Excel のブックを開いて Analysis アドインを有効にする場合、ブックを開くときに Excel イベントが実行され、

Analysis を有効化した後で、Analysis 標準の初期化処理とこのコールバックが実行されます。

このコールバックは、入力パラメータを持たないサブルーチンとして定義する必要があります。

' defined in ThisWorkbook

Public Sub Workbook_SAP_Initialize() ' register callbacks

Call Application.Run("SAPExecuteCommand", "RegisterCallback", "AfterRedisplay",

"Callback_AfterRedisplay")

Call Application.Run("SAPExecuteCommand", "RegisterCallback",

"BeforePlanDataSave", "Callback_BeforePlanDataSave")

Call Application.Run("SAPExecuteCommand", "RegisterCallback",

"BeforePlanDataReset", "Callback_BeforePlanDataReset") End Sub

'AfterRedisplay'、'BeforPlanDataSave'、および 'BeforePlanDataReset' コールバックは、ブックの初期化処理中に登 録されるため、VBA プロジェクトで使用することができます。

AfterRedisplay

このコールバックを使用して、ブックが再表示されるたびに実行される必要のあるロジックを定義します。たとえば、再表示後 はかならず、自動でブックの書式設定を変更することができます。

このコールバックは、入力パラメータを持たないサブルーチンとして定義する必要があります。このコールバックは、ブックレベ ルの [最新表示を一時停止] が false であるとき、またはユーザが [すべて最新表示] を明示的に要求したときにのみ呼び出 されます。有効なブックが変更されたときにのみ呼び出されるようにも定義できます。

' defined in a module

Public Sub Callback_AfterRedisplay()

ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).Value = "Last redisplay: "

ThisWorkbook.Worksheets("Sheet1").Cells(1, 2).Value = Now() End Sub

このコールバックを使用すると、シート 1 のセル A1 に "最終再表示: " というテキストが表示され、セル A2 に最後の再表 示日時が表示されます。再表示するごとに、この情報は更新されます。

以下のコードで、最後のユーザアクションの後で変更され、シートで更新されたクロスタブとデータソースを取得できます。

注記

これらのコールは 'Callback_AfterRedisplay' 内でのみ機能します。それ以外の場合には、これらのコールはエラーを 返します。削除されたオブジェクトは、返される配列に含まれません。

lResult= Application.Run("SAPGetProperty", "CHANGED_CROSSTABS")

'SAPListOf' のように、技術名、名前、およびデータソースを含む配列が返されます。

lResult= Application.Run("SAPGetProperty", "CHANGED_DATASOURCES") 'SAPListOf' のように、技術名および名前を含む配列が返されます。

BeforePlanDataSave

このコールバックを使用して、ユーザが計画データを保存するたびに実行される必要のあるロジックを定義します。 たとえば、

計画機能 (SAPExecutePlanningFunction) を実行できます。

このコールバックは、入力パラメータを持たずに論理値を返す関数として定義される必要があります。この関数が false を返 すと、保存は実行されません。

' defined in a module

Public Function Callback_BeforePlanDataSave() As Boolean Dim lResult As Integer

lResult = Application.Run("SAPExecutePlanningFunction", "PF_1") If lResult <> 1 Then

' planning function execution failed, cancel save

Call MsgBox("Planning Function (PF_1) execution failed. Data will not be saved.", vbCritical, "Error")

Callback_BeforePlanDataSave = False ElseCallback_BeforePlanDataSave = True End If

End Function

ユーザが計画データを保存するために [保存] ボタンを選択するたびに、PF_1 計画機能が実行されます。 計画機能が実 行可能である場合には、計画データが保存されます。実行に失敗すると、「計画機能 (PF_1) の実行に失敗しました。デー タは保存されません。」というテキストのメッセージボックスが表示されます。

BeforePlanDataReset

このコールバックを使用して、ユーザが計画データを前回の保存状態にリセットするたびに実行される必要のあるロジックを定 義します。たとえば、データを本当にリセットする必要があるのかユーザに確認するように定義できます。

このコールバックは、入力パラメータを持たずに論理値を返す関数として定義する必要があります。この関数が 'false' を返す と、リセットは実行されません。

' defined in a module

Public Function Callback_BeforePlanDataReset() As Boolean Dim lAnswer As VbMsgBoxResult

lAnswer = MsgBox("Do you really want to reset planning data?", vbYesNo, "Reset") If lAnswer = vbYes Then

Callback_BeforePlanDataReset = True ElseCallback_BeforePlanDataReset = False End If

End Function

ユーザが計画データを入力してから、 戻る 前回の保存状態 を選択するたびに、「計画データをリセットしてよろしい ですか?」というテキストのメッセージボックスが表示されます。ユーザが [はい] を選択すると、入力されたデータが前回保 存された状態にリセットされます。ユーザが [いいえ] を選択すると、リセットは実行されません。

関連情報

SAPExecuteCommand [64 ページ]

SAPExecutePlanningFunction [68 ページ]