「StiLL」 デザイン情報216 StiLLコマンド-- レコードデータを横方向に加工する(1)
                             
  【テーマ】
今回はレコードデータを横方向に表組する方法についてご紹介いたします。
ここでは前回加工後のデータを用いて加工前の元データ(表組)を復元します。
    【方法】
「Excelデータ抽出(BtRecordQuery)」ボタンを2つ使います。セット項目(部門名、計画、実績)を部門別に振り分ける式の設定がポイントです。
    【参考】
表示する部門の列を4つ以上に広げる場合は項目式を追加します。
部門を振り分ける判定式に文字列は使用しません。
 
                 
                             
■ 今回の内容                          
今回はレコードデータから表組を生成する考え方をご紹介します。
前回(215)とは逆に 「(縦)方向のデータを(横)方向に表組加工」 する方法です。
 ・バックナンバー215は下記をご覧ください。
【バックナンバー 215】 列(横)方向に繰返される項目群を行単位(縦)に加工する(2)
今回の加工の変化
画面の領域
画面の領域
↑レコードデータのイメージ(前回加工後)
     表組に加工(復元)されたイメージ↓
本例ではシステムテンプレートの「DLDATA」シートを使用しています。
・ポイント
 ・最初の「Excelデータ抽出(BtRecordQuery)」ボタンでレコードデータ(明細)を部門別に振り分けます。
  出力された明細が同一年度、同一支店内の何番目かを知る式を設定して振り分けます
 ・2つ目の「Excelデータ抽出(BtRecordQuery)」ボタンで年度・支店でのグループ化(集約)を行います。
■ ボタンの作成と設定                        
今回使用するStiLLボタンを示します。(下図赤枠)
画面の領域
今回のボタン配置およびセルの式の設定例を示します。(全体図)
画面の領域
上図の青枠(セルE2からS4まで)が最初の「Excelデータ抽出1」ボタンで参照する項目式の範囲です。<部門の振り分け>
同様に茶枠(セルE8からS11まで)が2つ目の「Excelデータ抽出2」ボタンで参照する項目式の範囲です。<グループ化(集約)>
・集約時に、最初のボタンで表示された明細のP列以降(部門〜部門振り分け)をクリアするためS列までの範囲を指定しています
本例では以前の説明と矛盾なく参照していただけるよう「Sheet1」を残し「DLDATA」シートに「WORKT」のデータを加工して出力しています。
@セル内容の説明 「Excelデータ抽出1」ボタンの項目式
はじめに今回のポイントとなるセルS4の式(部門振り分け用)について説明します。
セルS4には同じ年度、かつ同じ支店内で何番目の明細かを知る式['==COUNTIFS($E$15:E15,E15,$F$15:F15,F15)]を
  設定しています。
$E$15:E15,E15部分で固定セル位置「$E$15」から出力明細行「E15」(可変セル位置)までの範囲内で同じ年度を対象とし、
かつ、$F$15:F15,F15部分で同様に「$F$15」から出力明細行「F15」までの範囲内に同じ支店がいくつあるかをカウントします。
このカウント(数値)を使って表内の部門列の位置を判定します。  (本例での表示する部門の数は3つまで)
また部門の振り分けは、次のように式を設定します。
(部門1の設定式の例)
セルG4にはセルS4の結果がかを判定する式['=IF(S15=1,P15,"")]を入力しています。 の場合は部門の部門名を設定。
セルH4には同じ行のG列に部門名が存在するかを判定する式['=IF(G15>"",Q15,"")]を入力しています。部門の計画値を設定。
セルI4にも同じ行のG列に部門名が存在するかを判定する式['=IF(G15>"",R15,"")]を入力しています。部門の実績値を設定。
以下同様に、式を設定します。
(部門2の設定式の例)
セルJ4にはセルS4の結果がかを判定する式['=IF(S15=2,P15,"")]を入力しています。 の場合は部門の部門名を設定。
セルK4には同じ行のJ列に部門名が存在するかを判定する式['=IF(J15>"",Q15,"")]を入力しています。部門の計画値を設定。
セルL4にも同じ行のJ列に部門名が存在するかを判定する式['=IF(J15>"",R15,"")]を入力しています。部門の実績値を設定。
(部門3の設定式の例)
セルM4にはセルS4の結果がかを判定する式['=IF(S15=3,P15,"")]を入力しています。 の場合は部門の部門名を設定。
セルN4には同じ行のM列に部門名が存在するかを判定する式['=IF(M15>"",Q15,"")]を入力しています。部門の計画値を設定。
セルO4にも同じ行のM列に部門名が存在するかを判定する式['=IF(M15>"",R15,"")]を入力しています。部門の実績値を設定。
(補足)
  項目式は左端から右方向の順に処理されるため、各部門の設定式では式を明細行に設定しておき右端S列の処理結果を参照します。
 (イコール 「=」 がひとつの場合は式が設定されます)
  なお、2つ目のボタン「Excelデータ抽出2」の処理で式の結果が値化されます。
A1つ目の「Excelデータ抽出(BtRecordQuery)」ボタンの設定
以下に設定状態を示します。・・・各項目の詳細は全体図および上記@を参照
画面の領域
項目式の設定手順は次の通りです。
「部門1、計画1、実績1、・・・実績2、・・・実績3、部門振り分け」(赤枠)は該当無をチェックして手入力で追加設定します。
図では式が入力された状態ですが、手順としては項目式をシートに展開してから式を入力します。
OKボタンで設定を完了します。
このボタンを実行すると下図のように部門が振り分けられた明細が出力されます。(13行目は説明です)
画面の領域
B2つ目の「Excelデータ抽出(BtRecordQuery)」ボタンの設定
以下に設定状態を示します。・・・各項目の詳細は全体図および下図を参照
1つ目のボタンで振り分けられて出力された明細をグループ化(集約)して年度と支店が同じものを1行の明細とします。
出力セル位置を1つ目のボタンと同じセルE14とします。
  ・1つ目のボタンで設定された式の結果が値化されます。
画面の領域
  上図の項目式範囲(茶枠)の設定は以下の項目式設定を行った後、セル指定ボタンをクリックしてS列までを範囲指定します。
項目式の設定手順は次の通りです。
集計式にチェックを入れ「年度、支店名」(緑枠)にはグループ化を選択します。
「部門1、部門2、部門3」(オレンジ枠)はそれぞれ最大を選択します。 (部門2の表示は省略しています)
  「実績3」まで追加入力したらOKボタンで上の画面を閉じます。
なお各部門の集計式で 「最大(部門1)」「最大(部門2)」「最大(部門3)」としているのは見出し表示を変更しないためです。
本例のように当該項目名を半角の括弧で囲むことで元データの項目名が維持されます。
括弧で囲む設定は、1つ目のボタンと同様に、項目式をシートに展開してから設定します。
数値項目「計画・実績」は空欄(指定なし)の状態で加算され表示されます。
この2つ目のボタンを実行することで冒頭の(表組に加工されたイメージ)となります。
■ ボタンの実行                        
1.1つ目のボタン、2つ目のボタンを「ボタン連続実行(BtPush)」ボタンのリストに(画面描画OFF)ボタンと組み合わせて実行
   することで、加工する処理速度を向上できます。
   「ボタン連続実行(BtPush)」ボタンへの設定例
画面の領域
■ ご参考までに                        
1.表示する部門の列を4つ以上に広げる場合は項目式を追加します。
   部門振り分け用の式を設定する列(本例ではS列)が変わりますので、各部門の設定式も参照する列の変更が必要となります。
2.部門を振り分ける判定式に文字列は使用しません。
   本例の場合レコードデータの並びから「第一事業部」等の文字列を使用した判定式を考えることもできますが、
   たまたま支店A,Bとも「第一事業部」から「第三事業部」で統一されているように見えるだけで一般的にはその保証はありません。
   表見出しが「部門1」「部門2」「部門3」と付けられていることからも、例えば支店Cのデータは全く別の部門名かもしれません。
   本例では部門の列位置を求める式を設定して「部門1」「部門2」「部門3」を振り分ける方法で処理の汎用性を確保しています。
   ×(悪い例)セルG4:'=IF(P15="第一事業部",P15,"")
■ 関連するキーワード                        
レコード BtRecordQuery データ加工
(各ボタンの設定内容の詳細はStiLLヘルプをご確認ください)  
Copyright(C) アイエルアイ総合研究所 無断転載を禁じます