Xファンクションのレポートツリーサンプル
サマリー
このサンプルでは、ワークシート内の選択されたデータの統計を実行し、新しい階層シートにレポートを生成する方法を紹介しています。選択データは1列、複数列はもちろん、ワークシート内のサブレンジを選択することもできます。
出力データ型はReportTreeのとき、ダイアログには、再計算コンボボックスが表示され、レポートシートの再計算モードを「手動」、「自動」、「なし」にセットできます。
学習する項目
- 選択されたデータ範囲からデータを取得
- event1のエラーの取り扱い、before_executeとメイン関数
- 再計算の鍵付きの新しい階層シートにレポート表を生成
ステップ
- F10キーを押して、Xファンクションビルダを開き、Xファンクションの名前と変数を下図のように入力して、保存をクリックします。
- このXファンクションをコードビルダで開き、ソースコードを編集します。まず、以下のように必要なヘッダファイルを含めます。
#include <ReportTree.h> // ReportTableクラスに必要
- 入力データ範囲をチェックするために、StatsReport_event1にエラーチェックコードを下図のように追加します。
DataRange drInput;
drInput.Create(trGetN.iy.strVal);
// 入力が無効な場合、エラーメッセージを表示する
// 場所はダイアログの下部
// OKボタンは無効
if ( !drInput.IsValid() || drInput.GetNumRanges() < 1 )
{
strErrMsg = "Please select valid data for input";
bOKEnable = false;
}
- report_stats_before_execute にエラーチェックコードを追加します。
DataRange drInput;
drInput.Create(trGetN.iy.strVal);
// 入力が無効な場合、エラーメッセージを印字
// Xファンクションの実行をとめる
if ( !drInput.IsValid() || drInput.GetNumRanges() < 1 )
{
out_str("Invalid Input Data");
nRet = XFEVT_ABORT;
}
- //put your own support static functions here と入力された行の下に、入力範囲をチェックするstatic関数を追加します。
static bool _check_input(const Range& iy)
{
int nRanges;
if ( !iy.IsValid() )
return false;
nRanges = iy.GetNumData(DRR_COLUMN_INDEX |
DRR_NO_FACTORS);
if ( nRanges <= 0 )
return false;
return true;
}
- static関数の下に、必要なマクロを追加します。このマクロは、Xファンクションのメイン関数で使用されます。
// ID はどの値でも良いが、固有である必要がある
#define TABLE_ID_BEGIN 0x1000
#define ROW_ID_BEGIN 0x0001
- Xファンクションのメイン関数StatsReport に以下のコードを追加し、指定したデータ範囲からデータを取得し、統計を実行してレポートシートを作成します。
if ( !_check_input(iy) )
{
// 入力が無効な場合、
// エラーメッセージが表示され
// Xファンクションの実行は中止される
XF_THROW("Invalid input data");
return;
}
// 統計サマリーを表示する表を作成する
ReportTable rt = report.CreateTable("Summary",_L("Summary"),
TABLE_ID_BEGIN);
// レポート表の列ヘッダ
const vector<string> vsColLabels = {
"N",
"Number of Missing",
"Mean",
"SD",
"SEM",
"Sum",
"Variance"
};
int nRowID = ROW_ID_BEGIN;
int nRanges = iy.GetNumData(DRR_COLUMN_INDEX |
DRR_NO_FACTORS);
for ( int nRange = 0; nRange < nRanges; nRange++ )
{
// サブレンジを取得 - 1列
DataRange drOne;
iy.GetSubRange(drOne, DRR_COLUMN_INDEX |
DRR_NO_FACTORS, nRange);
// [Book1]Sheet1!Aのような範囲文字列を取得
string strDataLabel;
drOne.GetRangeString(strDataLabel);
vector vInput;
drOne.GetData(&vInput, 0);
if ( vInput.GetSize() == 0 )
{
// 列が空の場合警告メッセージを印字し、
// 次の列に行く
warning_msg_box(
strDataLabel + ", empty column found.",
false, 'W');
continue;
}
int N, Missing;
double dMean, dSum, dVariance, dSD, dSE;
int nRet = ocmath_basic_summary_stats(vInput.GetSize(),
vInput,
&N, &dMean, &dSD, &dSE, &dVariance, &dSum,
NULL, NULL, NULL, NULL, NULL, NULL, &Missing);
if ( STATS_NO_ERROR != nRet )
{
// statistics関数が失敗したら
// 警告メッセージを表示
warning_msg_box(
strDataLabel + ", statistics fails.",
false, 'W');
continue;
}
vector vResults(vsColLabels.GetSize());
vResults[0] = N;
vResults[1] = Missing;
vResults[2] = dMean;
vResults[3] = dSD;
vResults[4] = dSE;
vResults[5] = dSum;
vResults[6] = dVariance;
//レポート表に新しい行を追加
string strName = "Data" + nRange;
rt.AddRow(strName, vResults, strDataLabel,
vsColLabels, NULL, nRowID++);
}
Xファンクションを実行する
いくつかのデータが入力されたワークシートをアクティブにして、スクリプトウィンドウでStatsReport -d を実行し、Xファンクションダイアログを開きます。
OKをクリックすると、新しいレポートシートが生成されます。
|