Xファンクションのレポートツリーサンプル

内容

  1. 1 サマリー
  2. 2 学習する項目
  3. 3 ステップ
  4. 4 Xファンクションを実行する

サマリー

このサンプルでは、ワークシート内の選択されたデータの統計を実行し、新しい階層シートにレポートを生成する方法を紹介しています。選択データは1列、複数列はもちろん、ワークシート内のサブレンジを選択することもできます。

出力データ型はReportTreeのとき、ダイアログには、再計算コンボボックスが表示され、レポートシートの再計算モードを「手動」、「自動」、「なし」にセットできます。

学習する項目

  1. 選択されたデータ範囲からデータを取得
  2. event1のエラーの取り扱い、before_executeとメイン関数
  3. 再計算の鍵付きの新しい階層シートにレポート表を生成

ステップ

  1. F10キーを押して、Xファンクションビルダを開き、Xファンクションの名前と変数を下図のように入力して、保存Ocguide xfdialog savebutton.pngをクリックします。
    OCguide xf example StatsReport.png
  2. このXファンクションをコードビルダで開き、ソースコードを編集します。まず、以下のように必要なヘッダファイルを含めます。
    #include <ReportTree.h> // ReportTableクラスに必要
            
    
  3. 入力データ範囲をチェックするために、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;
    }
    
  4. 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;
    }
    
  5. //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;
    }
    
  6. static関数の下に、必要なマクロを追加します。このマクロは、Xファンクションのメイン関数で使用されます。
    // ID はどの値でも良いが、固有である必要がある
    #define TABLE_ID_BEGIN          0x1000
    #define ROW_ID_BEGIN            0x0001
    
  7. 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ファンクションダイアログを開きます。

Ocguide xfdialog StatsReport display.png

OKをクリックすると、新しいレポートシートが生成されます。

Ocguide xfdialog StatsReport result.png