« 2026年7月 | トップページ | 2026年9月 »

2026年8月

ExpressLRS BLE Joystick RealFlight

1. 前置き

日本でのBETAFPV Nano TX V2 Module ELRS 2.4GのTX Max Powerを調べていたら、BLE(Bluetooth Low Energy)の認証が取れていることが分かりました。BLEを何に使うのかを調べたら、EdgeTX送信機をPCのJoystickとして使用できることが分かりました。

2. 必要なもの

BLEに対応したPCやBluetooth USBアダプタが必要です。規格としては、Bluetooth 4.0以降が、BLEに対応しているそうです。

3. 初期設定

送信機の設定

  1. 4.参考の記事でEdgeTXのUSB Joystick用に設定したモデルをコピーし、名前にBLEを付けて識別できるようにします。
  2. [Model Settings]でExpressLRSのRF(Internal RF / External RF)を選択します。
  • Mode : OFF -> CRFS *
  • Baudrate : 400k // 初期値 : 400k
  1. [SYS]-[Apps]-[ExpressLRS]-[BLE Joystick]

PCの設定

  1. タスクトレイのBluetoohアイコンをクリックし、[Bluetoothデバイスの追加|Bluetoothデバイスの表示]-[デバイスの追加]-[Bluetooth]-[ELRS Joystick]-[完了]。
  2. [スタート]-[Windowsツール]-[コントロールパネル]-[デバイスとプリンター]を右クリックして[開く]-[ELRS Joystick]-[8軸8ボタンデバイス]-[プロパティ]-[設定]-[規定値にリセット]-[OK]。

Windowsで認識されるボタンと軸の関係を調べていません。適当に調整をすると、軸の調整をするつもりで次に移るボタンを押してしまい、軸の調整が異常値になります。そうすると、シミュレータ側で軸を認識できなくなります。なので、Windowsの調整はせずに規定値にリセットし、シミュレータ側でキャリブレーションします。

RealFlightの設定

  1. [Simulation]-[Select Controller...]-[Calibrate]で、指示に従いキャリブレーションします。最初にStickだけでなく全てのSwitchやSlider類も中点にします。
  2. [Simulation]-[Select Controller...]-[Edit]でStick、Switch、Sliderの割付を行い、[Save As]で名前を付けて保存します。

新メニューの場合

  1. RealFlightを起動し、[Esc]-[Settings]-[Controller]-[Configure Controller]-[Calibrate]で指示に従い15ch分のスティックとスイッチなどをキャリブレーションする。
  2. [Esc]-[Settings]-[Controller]-[Configure Controller]-[Edit]で各スイッチの割り当てを行う。

TX16Sのスイッチ割り当て例(SPMRFTX1E に似せたもの)

 

Left Right
LS
ch7
↑         RS
ch15
↑    
↓     ↓    
       
SF
ch14
Gear
Smoke
Nor
↑奥 SmGe-L   S1 L     S2
ch13
Nor
L     SH
ch12
Reset
Nor
↑奥 Norm  
↓近 SmGe-H   R     R     ↓近 Rst  
       

SE
ch8
Mode
Rev

↑奥 Mod-H   6P 1     6P 4     SG
ch9
Hold
Rev
↑奥 Hld-L  
ー中 Mod-M   2     5     ー中 Hld-L  
↓近 Mod-L   3     6     ↓近 Hld-H  
       
SA
ch5
Rate
Rev
↑上 EleR-H   SB
ch6
Flap
Nor
↑上 Flp-L   SC
ch11
Rate
Rev
↑上 RudR-H   SD
ch10
Rate
Rev
↑上 AilR-H  
ー中 EleR-M   ー中 Flp-M   ー中 RudR-M   ー中 AilR-M  
↓下 EleR-L   ↓下 Flp-H   ↓下 RudR-L   ↓下 AilR-L  

全ての機能を確認していないので、動作しないところがあるかも知れません。

4. 2回目以降の起動手順

  1. 送信機の電源を入れ、BLE用のModelを選択する。
  2. [SYS]-[Apps]-[ExpressLRS]-[BLE Joystick]。
  3. RealFlightを起動する。

5. 不具合など

  1. AeroFly RC10 で認識しません。
  2. RealFlifgt 8 で舵の舵角が小さくなります。

6. 残念なところ

送信機の起動直後の動作をBLEにできません。起動時はExpressLRSになるので、起動のたびに[SYS]-[Apps]-[ExpressLRS]-[BLE Joystick]を選択する必要があります。[BLE Joystick]にする専用.luaがあれば、送信機のSwitchに割当てることができるのですが、そのようなものは公開されていないようです。誰か作ってくれると嬉しいですね。電力面から言えば、起動時から[BLE Joystick]になるモードが欲しいです。

7. 参考

| | コメント (0)

テプラ クリエーターがVer.4.2からVer5.0に更新されない

テプラ クリエータVer.4.2を起動したら、新バージョンのメッセージが表示されました。
そこでテプラクリエータが起動した状態で、ダウンロードして更新しました。
ところが、テプラ クリエータを起動すると、再び新しいバージョンのメッセージが表示され、Ver.4.2が起動します。

一般的なインストーラーは、更新時にアプリが起動していればインストーラーが終了処理をするはずなのですが、終了しませんでした。

そこで、テプラ クリエーターを終了して、更新を実行したのですが、やはりVer.4.2が起動してしまいます。

[スタート]-[設定]-[アプリ]-[インストールされているアプリ]を見ると「テプラ クリエーター 5.0.0.0」「テプラ クリエーター プリンタドライバ 5.5.3.2」と表示されています。Ver.4.2の表示はありません。

そこで、「テプラ クリエーター 5.0.0.0」と「テプラ クリエーター プリンタドライバ 5.5.3.2」をアンインストールし、Ver.5.0を再インストールしたところ、無事Ver.5.0が起動しました。なお、インストール完了表示が遅く、その前にテプラクリエータを起動したところ、その後にインストーラーの「最初の起動時はテプラを接続しておくこと」の旨の表示が出たので、慌ててテプラ クリエータのウィンドウの右上の×をクリックして閉じ、インストーラーのメッセージを[OK]で終了しました。

インストールを開始しても、インストール中のメッセージが出ないので、インストール完了したと勘違いします。インストール中のメッセージを表示して欲しいものです。

以上で、Ver.5.0が起動しました。

環境 : Windows 11 Home 25H2、USB接続

| | コメント (0)

Excel 3MIS (3 Months In Service) 計算

1. 前置き

某Tier1がサプライヤーの品質評価に3MISという指標を使っているらしいです? 一般的なワイブルチャートの高さと傾きを簡易的に評価する指標かも知れません?(間違っているのかも知れません?)
ネット検索によるとSP-3MISは、Supplier Performance 3 Months In Servecの略で、エンドユーザーに渡ってから3ヵ月以内に発生した同一納入月の部品の不良率らしいです?

これをExcelで算出する方法を考えてみました。但し、品質の作り込みは納入時では無く生産時ですので、部品の生産日ベースの不良率にしました。某Tier1の基準は納入月だと思うので、Tier1のSP-3MISとは異なります。

納車後3ヵ月経過していない場合は値が小さくなるので、納車後3ヵ月前未満は計算しないようにしました。でも、部品の生産日ベースだと、仮に納車開始から3ヵ月経過したとしても、そのロットが全て納車済みということはありません。なので納車日ベースにしない限り、必ず初期の3MISは小さく出ることに注意してください。

実際の不良は少ないので、月毎の変動が大きくなります。そこで、3ヵ月移動平均も算出しました。単純に移動平均を計算すると生産終了後の月も計算してしまいます。ピボットテーブルにする場合、小計や総計に3ヵ月移動平均を表示する意味が無いです。これらを表示しない式にしたので、計算要否判定の式が長くなりました。

もっと良い方法があるかも知れません。検証を殆どしていないので、使用される場合は式に間違いがないかを確認し、検証をお願いいたします。

2. 入力

1) 部品生産データ

年月ごとの生産数の表です。
ファイル名 : 生管*.xlsx(*は任意の文字)

◢ A B C D E F 省略 AY AZ
1 生管数量     24/03 24/04 24/05   28/02 28/03
2 顧客 機種 項目 24/03 24/04 24/05   28/02 28/03
3 A a 生産数     100   100  
4 B b 生産数            
5 A a 納入数     100   100  
6 B b 納入数            
  • 1行目のyy/mmは、Excelの日付のシリアル値です。これは、集計に使いません。
  • 2行目のyy/mmは、=TEXT(D1, "yy/mm") のテキストです。これを集計に使用します。
  • 項目の納入数は、本例では使用しません。納入年月ベースで3MISを集計する場合の予備行です。
  • 同じ形のシートであれば、複数のファイルに分かれていてもOKです。但し、1ファイル1シートにしてください。重複が無いようにしてください。普通は1年分が1ファイルになっているかと思います。
  • 本例では顧客を使用していません。使用する場合は、顧客ディメンジョンテーブルを作成して、リレーションしてください。

2) 市場サービスデータ

本例では.csvのテキストファイル(UTF-8)とします。Excelで開いた場合のレイアウトを次に示します。
ファイル名 : Service*.csv(*は任意の文字)

◢ A B C D E F G
1 市場不良            
2 発生日 顧客 機種 納車日 納入日 生産日 数量
3 2024/4/21 A a 2024/4/21 2024/4/11 2024/4/1 1
4 2024/5/21 A a 2024/5/21 2024/5/11 2024/5/1 1
5 2024/6/21 A a 2024/6/21 2024/6/11 2024/6/1 1
  途中省略            
117 2028/1/21 A a 2025/1/21 2025/1/11 2025/1/1 1
118 2028/2/21 A a 2025/2/21 2025/2/11 2025/2/1 1
119 2028/3/21 A a 2025/3/21 2025/3/11 2025/3/1 1

本例では、顧客と機種と生産日を'生管'テーブルと合わせていますが、実際に入手できるデータは異なるので、整形処理をしてください。この時、元データを直接修正するのではなく、Power Queryで整形してください。

  • 不要な行を削除してください。
  • 部品生産データと同じ顧客列を追加してください。
  • 部品生産データと同じ機種列を追加してください。または、列を追加せずに、変換テーブルをディメンジョンテーブルにしてPower Pivotでリレーションで参照しても良いです。
  • 製番から生産日の列を追加してください。
  • 同じ形の.csvあれば、複数のファイルに分かれていてもOKです。重複が無いようにしてください。普通は1月分が1ファイルになっていると思います。

3) xMISデータ

集計ブックにテーブルで作成します。
'xMIS'テーブル

xMIS xMISid
03MIS 3
06MIS 6
12MIS 12
24MIS 24
36MIS 36
合計 999
  • xMISが集計する月数をxMISidで指定します。
  • xMISid=999は、全期間の合計の判断に使用します。メジャーの中で使用します。
  • この表を変更する場合は、後述の計算列のDAX式も変更が必要です。

4) 機種データ

集計ブックにテーブルで作成します。部品生産データと市場サービスデータの対応を取るためのディメンジョンテーブルにします。
'機種'テーブル

顧客 機種 上市月数
A a 0
A b 1
  • 機種の重複が無いようにしてください。(機種をリレーションのキーとします。)
  • 顧客と機種は、Power Queryで整形後の部品生産データと市場サービスデータと同じにします。
  • 上市月数は、部品の生産日から納車日までの月数を入れてください。これは、評価可能な経過月数に達していない場合に、不良数や不良率を計算しないことにより、ピボットグラフの線を表示しないようにするためのものです。実際のこの月数はバラツキますが、何時から不良率を表示するのかという観点で決めます。不良率の精度を重視するなら大きな値を入れ、表示時期の早さを重視するなら小さな値を入れます。

5) 締日

集計ブックにテーブルで作成します。
'締日'テーブル

日付
2028/3/31
  • 最新の市場実績日を入力します。
    不良が無い場合に、0件という不良データが無くても、この日付まで市場不良が0件の実績があったとして、xMISの計算要否を決めます。
  • これより新しい日付の市場不良データがあれば、その日をxMISの計算要否の判断に使用します。

3. 出力

ピボットテーブル

機種 xMIS 値 24/1Q 24/1Q 集計
24/04 24/05 24/06
a 03MIS M不良率 1.00% 1.00% 1.00% 1.00%
M不良率3 1.00% 1.00% 1.00%  
06MIS M不良率 2.00% 2.00% 2.00% 2.00%
M不良率3 2.00% 2.00% 2.00%  
12MIS M不良率 2.00% 2.00% 2.00% 2.00%
M不良率3 3.00% 3.00% 3.00%  
24MIS M不良率 4.00% 4.00% 4.00% 4.00%
M不良率3 4.00% 4.00% 4.00%  
36MIS M不良率 5.00% 5.00% 5.00% 5.00%
M不良率3 5.00% 5.00% 5.00%  
合計 M不良率 6.00% 6.00% 6.00% 6.00%
M不良率3 6.00% 6.00% 6.00%  
  • 不良率の小計は、その期間の平均不良率です。
  • 不良率3は、3ヵ月移動平均です。3ヵ月移動平均不良率 = 3ヵ月の不良数 ÷ 3ヵ月の生産数

ピボットグラフ

260823mis1 260823mis2

4. 手順

1-1) ファクトテーブルの元データがあるフォルダの取得

  1. xMIS集計ブックを開き、[データ]-[データの取得v]-[ファイルから>]-[フォルダーから]で取得するファイルがあるフォルダを選択し、[開く]-[データの変換]でPower Queryエディタに取込み、右の名前を'フォルダ'に変更する。 ⇒ フォルダの下のサブフォルダも含むファイルリストができる。
  2. [Name]列の▼-[テキストフィルター>]-[次の値で始まらない]-[詳細設定]-[句の追加]で次のように入力し[OK]。 ⇒ ~$から始まる作業ファイルや集計を含む集計ファイルが消える。
および/または 列 演算子 値 解説
  Name 次の値で始まらない ~$ 作業ファイルを除く
および Name 指定の値を含まない mis 集計ファイルを除く
および Name 指定の値を含まない 集計 集計ファイルを除く

1-2) 生管(クロス表)部品生産データの取得と整形と結合

  1. 左の'フォルダ'クエリを右クリックし[参照]、右の名前を'生管'に変更。 ⇒ '生管'クエリが生成される。
  2. [Name]列の▼-[テキストフィルター>]-[指定の値を含む]-[詳細設定]で次のように入力し[OK]。 ⇒ 部品生産ファイルに絞り込む。
および/または 列 演算子 値 解説
  Name 指定の値を含む 生管 部品生産ファイルに絞り込む
および Extension 指定の値に等しい .xlsx Excelブックに絞り込む
  1. [Content]列を右クリックし[他の列の削除]。 ⇒ ファイルの内容以外の列が削除される。

  2. [Content]列の↓↓をクリックし、フォルダアイコンを選択し[OK]。 ⇒ 1つのファイルを処理するためのヘルパークエリが別に生成され、複数のファイルが縦に並ぶ。ファイルの内容は未展開。

  3. 右に生成された'サンプルファイル'、'ファイルの変換'、サンプル ファイルの変換'クエリの名前の後ろに"生管"を追加する。 ⇒ この作業は必須では無いが、名前で何を処理するヘルパークエリかが判別できるようになる。次に1ファイルを整形をするヘルパークエリを編集する。

  4. 'サンプル ファイルの変換生管'クエリを選択し、[KIND]列の▼-[テキストフィルター>]-[指定の値に等しい]で次のように入力し[OK]。 ⇒ Sheetに絞り込む。(印刷範囲などの情報を除く)

列 演算子 値 解説
Kind 指定の値に等しい Sheet Sheet以外を除く
  1. [Data]列を右クリックし[他の列の削除]。 ⇒ ファイルの内容以外の列が削除される。
  2. [Data]列の矢印アイコン(展開)をクリックし、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。 ⇒ ファイルの内容が展開される。(複数のシートがある場合は、単純に縦結合される。)
  3. [Column3]の▼-[空の削除]。 ⇒ 項目列の項目が無い不要な行が消え、1行目が列項目名になる。
  4. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。 ⇒ 1行目がヘッダになる。
  5. 自動生成された"変更された型"のステップを削除。
  6. yy/mm形式の年月以外の列をCtrlキーを押しながら全て選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。 ⇒ yy/mm列が縦1列に並び、リスト形式の表になる。
  7. [項目]列を選択し、[変換]-[列のピボット]で次のように入力し[OK]。 ⇒ 異なる値の種類を持つ項目が横に分離される。
    値列 : [値]
    詳細設定オプション-値の集計関数 : [集計しない]

※ もし列のピボットでエラーが出る場合は、列のピボット解除の前のクロス表の状態でnullを0に置換してください。

  1. [列の追加]-[カスタム列]で次のように入力し[OK]。 ⇒ [日付]列が追加される。
新しい列名 : 日付
カスタム列の式 : =
#date(
2000 + Number.FromText(Text.BeforeDelimiter([属性], "/")),
Number.FromText(Text.AfterDelimiter([属性], "/")),
1
)

解説 : yy/mm形式のテキストからPower Queryの日付形式の列を作ります。

  1. [属性]列を右クリックし[削除]。 ⇒ 不要なyy/mm列が削除される。1ファイルを整形する関数クエリが完成する。次にファイルを結合するクエリを編集する。

  2. 左の"生管"クエリを選択し、エラーになっている右の最後の"変更された型"のステップを削除する。

  3. 中央の任意のセルを選択しCtrl+aで全列を選択し、[変換]-[データ型の検出]。型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい方が設定される。【注意】原則としてany型(ABC123)を残さないこと。残すと例えば数字の1と文字列の1が異なるものとして処理される。

1-3) 市場(リスト)市場サービスデータの取得と整形と結合

  1. 左の'フォルダ'クエリを右クリックし[参照]、右の名前を'市場'に変更。 ⇒ '市場'クエリが生成される。
  2. [Name]列の▼-[テキストフィルター>]-[指定の値を含む]-[詳細設定]で次のように入力し[OK]。 ⇒ 市場ファイルに絞り込む。
および/または 列 演算子 値 解説
  Name 指定の値を含む Service 市場ファイルの名前に絞り込む
および Extension 指定の値に等しい .csv .csvファイルに絞り込む
  1. [Content]列を右クリックし[他の列の削除]。 ⇒ 内容以外の列が削除される。

  2. [Content]列の↓↓(ファイルの結合)をクリックし、[OK]。 ⇒ 1つのファイルを処理するためのヘルパークエリが別に生成され、複数のファイルが結合される。

  3. 右に生成された'サンプルファイル'、'ファイルの変換'、サンプル ファイルの変換'クエリの名前の後ろに"市場"を追加する。

  4. 'サンプル ファイルの変換市場'クエリを選択する。(もし、右に"ソース"と"ナビゲーション"以外のステップがあれば、そのステップを削除する。 ⇒ 自動生成された不要なステップが削除される。)

  5. [ホーム]-[行の削除v]-[上位の行の削除]で行数に1を入れ[OK]。 ⇒ 不要な1行目が消える。

  6. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。 ⇒ ヘッダが設定される。1ファイルを整形する関数クエリが生成される。次にファイルを結合するクエリを編集する。(もし、"変更された型"が自動生成されたら、適切な型を設定し直すか、"変更された型"のステップを削除する。)

  7. 左の"市場"クエリを選択し、右の最後の"変更された型"のステップを削除する。

  8. 中央の任意のセルを選択しCtrl+aで全列を選択し、[変換]-[データ型の検出]。型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい型が設定される。

  9. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"を選び[OK]でExcelに戻ります。

  10. "クエリと接続"ペインの'生管'と'市場'クエリをそれぞれ右クリックし、[読み込み先...]で"このデータをデータモデルに追加する"を選択し、[OK]。 ⇒ データモデルに追加される。

1-4) 各種設定テーブルの取得

  1. xMISのテーブルの1つのセルを選択し、[データ]-[テーブルまたは範囲から]でPower Queryエディタに取込む。
  2. 型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい型が設定される。(日付の型は、時刻が無いものにすする)
  3. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"と"このデータをデータモデルに追加する"を選択し[OK]でExcelに戻る。 ⇒ データモデルに追加される。

同様の手順で、'締日'と'機種'テーブルをデータモデルに追加する。

1-5) 日付テーブルの生成

Excelの場合は、Power Query Mで日付テーブルを生成します。(ワークシートで作成し、データモデルに追加しても良いです。)

  1. [データ]-[データの取得v]-[その他のデータソースから>]-[空のクエリ]でPower Queryエディタに空のクエリを生成し、右の名前を'日付'に変更します。
  2. [ホーム]-[詳細エディタ]で次のコードを上書きし、[OK]。
let
Source1 = 市場, // [日付]列を持つクエリ名を設定
Source2 = 生管, // [日付]列を持つクエリ名を設定
    // ── 集計対象期間の決定 ──────────────
MinDate = Date.StartOfMonth(List.Min({List.Min(Source1[生産日]), List.Min(Source2[日付])})),
MaxDate = Date.EndOfMonth(List.Max({List.Max(Source1[発生日]), List.Max(Source2[日付]), List.Max(締日[日付])})), // 年度末日まで生成しない場合の式
// MaxDateRaw = List.Max({List.Max(Source1[日付]), List.Max(Source2[日付])}), // 年度末日まで生成する場合の式
// FiscalYearEndYear = if Date.Month(MaxDateRaw) >= 4 then Date.Year(MaxDateRaw) + 1 else Date.Year(MaxDateRaw),
// MaxDate = #date(FiscalYearEndYear, 3, 31),
    // ── 日単位カレンダーの生成 ──────────────────────
DateList = List.Dates(MinDate, Duration.Days(MaxDate - MinDate) + 1, #duration(1, 0, 0, 0)),
CalendarTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日付"}),
型設定済 = Table.TransformColumnTypes(CalendarTable, {{"日付", type date}}),
    // ── 会計年度(4月始まり)の基準日・年・月を1回だけ算出 ──
// EDATE([@日付], -3) 相当:3ヶ月前にずらすことで
// 会計年度の「年」と「月番号(4月=1~翌3月=12)」を取得
会計基準日追加 = Table.AddColumn(型設定済, "会計基準日", each Date.AddMonths([日付], -3), type date),
会計年追加 = Table.AddColumn(会計基準日追加, "会計年", each Date.Year([会計基準日]), Int64.Type),
会計月追加 = Table.AddColumn(会計年追加, "会計月", each Date.Month([会計基準日]), Int64.Type),
    // ── 表示用列の追加 ──────────────────────────────
    // 年:YEAR([@日付])
列_年 = Table.AddColumn(会計月追加, "年", each Date.Year([日付]), Int64.Type),
    // 月:TEXT([@日付],"m月") ※ゼロ埋めなし
列_月 = Table.AddColumn(列_年, "月", each Text.From(Date.Month([日付])) & "月", type text),
    // 年月:TEXT([@日付],"yy/mm") ※ゼロ埋めあり
列_年月 = Table.AddColumn(列_月, "年月", each
let
yy = Text.PadStart(Text.From(Date.Year([日付]) - 2000), 2, "0"),
mm = Text.PadStart(Text.From(Date.Month([日付])), 2, "0")
in
yy & "/" & mm,
type text),
    // 四半期.:INT((MONTH(x)-1)/3)+1 & "Q" ※年度なし
列_四半期ドット = Table.AddColumn(列_年月, "四半期.", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From(四半期番号) & "Q",
type text),
    // 四半期:(YEAR(x)-2000) & "/" & 四半期番号 & "Q" ※ゼロ埋めなし
列_四半期 = Table.AddColumn(列_四半期ドット, "四半期", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(四半期番号) & "Q",
type text),
    // 半期:(YEAR(x)-2000) & "/" & 半期番号 & "H" ※ゼロ埋めなし
列_半期 = Table.AddColumn(列_四半期, "半期", each
let
半期番号 = Number.IntegerDivide([会計月] - 1, 6) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(半期番号) & "H",
type text),
    // 期:IF(MONTH(x)<7,"上期","下期") ※年度なし
列_期 = Table.AddColumn(列_半期, "期", each
if [会計月] < 7 then "上期" else "下期",
type text),
    // 年度:(YEAR(x)-2000) & "年度" ※ゼロ埋めなし
列_年度 = Table.AddColumn(列_期, "年度", each
Text.From([会計年] - 2000) & "年度",
type text),
    // 年度.:YEAR(x) ※西暦そのまま、年度なし表示との組み合わせ用
列_年度ドット = Table.AddColumn(列_年度, "年度.", each [会計年], Int64.Type),
    // 内部計算用の一時列を削除し、ご指定の列順に並べ替え
不要列削除済 = Table.RemoveColumns(列_年度ドット, {"会計基準日", "会計年", "会計月"}),
最終結果 = Table.ReorderColumns(不要列削除済,
{"日付", "年月", "四半期", "半期", "年度", "年度.", "四半期.", "期", "月", "年"})
in
最終結果

補足 : このクエリは'生管'と'市場'と'締日'クエリの日付の範囲の日付テーブルを生成します。年度始まりを4月としています。最初のSource1とSource2とMaxDateの行にクエリ名を設定します。

参考 : CalendarTableまでのコードを詳細エディタで作成し、型設定済からをPower Queryエディタの主にカスタム列の追加を使用して作成することもできます。

  1. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

2) '市場'データモデルに[xMISid]列を追加(計算列)

  1. 次のいずれかの方法でデータモデルを表示します。
    a. [Power Pivot]-[管理]-[ホーム]-[表示]-[データビュー]。
    b. [データ]-[データモデルv(緑アイコン)]-[データモデルの管理]-[ホーム]-[表示]-[データビュー]。
  2. 下の'市場'タブを選択します。
  3. 列項目の[列の追加]をWクリックし名前を"xMISid"に変更します。
  4. 上の数式バーに次のコードを入力し、✓をクリックします。(数式バーの右端のアイコと下端のドラッグで表示行数を広げることができます。)
=VAR m=DATEDIFF('市場'[納車日], '市場'[発生日], DAY) / 30
RETURN
SWITCH(
TRUE,
m<=3, 3,
m<=6, 6,
m<=12, 12,
m<=24, 24,
m<=36, 36,
999
)

解説 : 1ヶ月を30日として月数を計算します。DATEDIFFで納車日から発生日までの日数を求め、/30で月数に換算しています。月の長さをSWITCH関数で各MISの月数に区分分けしています。このSWITCHの第1引数をTRUEにする使い方はDAX固有の使い方で、ワークシート関数のIFS()に似ています。999は月数では無く合計の識別子として使用します。

参考

DAXのDATEDIFF(,,MONTH)は、月またぎの回数を月数とするので、3MISの計算には使用できません。
Excelのワークシート関数DATEDIF(,,"M")は、開始日と同日に達した回数を月数とするので、3MISの計算には使用できません。

参考

  • 追加した列のことを計算列と呼びます。計算列の式は、DAX式です。メジャーのDAX式と異なり、ピボットテーブルのコンテキストの影響を受けません。直接参照する列名には行コンテキストが掛かり、同一行の値を示します。なのでメジャーと異なり集計関数が不要です。関数内の列名は、行コンテキストが無く表全体を指します。

  • 計算列は、Power Queryのカスタム列の追加に似ています。

  • Power Query MにはDATEDIFF/DATEDIFに相当する関数が無いので、本記事では計算列を使用しています。Power Query Mで実装したい場合は、DATEDIFに相当する関数クエリを使います。ネットで検索すると、関数クエリが見つかります。

3) リレーションの作成

次のいずれかの方法でリレーションを設定します。
a. [Power Pivot]-[管理]-[ホーム]-[表示]-[ダイアグラムビュー]。
b. [データ]-[データモデルv(緑アイコン)]-[データモデルの管理]-[ホーム]-[表示]-[ダイアグラムビュー]。
c. [データ]-[データモデルv(緑アイコン)]-[リレーションシップ]-[編集]。

ファクトテーブル *--<--1 ディメンジョンテーブル(関連)
'生管'[日付] *--<--1 '日付'[日付]
'市場'[生産日] *--<--1 '日付'[日付]
'生管'[機種] *--<--1 '科目'[機種]
'市場'[機種] *--<--1 '科目'[機種]
'市場'[xMISid] *--<--1 'xMIS'[xMISid]
'締日'[日付] : リレーションを取らない

ダイアグラムビューでは、(多)から1へ項目をドラッグする。
リレーションシップでは、上段が(多)で下段の関連が1になるようにテーブルと項目を設定する。

参考 : このデータ構造は2つのスタースキーマが合体した構造で、コンステレーションスキーマ(Constellation Schema)と呼ばれるらしいです。 By Gemini

3-1) ピボットテーブルの生成

[挿入]-[ピボットテーブルv]-[データモデルから]で、ピボットテーブルを生成します。

3-2) メジャーの作成

  1. 次のいずれかの方法でメジャーを作成します。
    a. ① ピボットテーブルを選択し、右に"ピボットテーブルのフィールド"を表示。② メジャーを作成するテーブル('予算'または'実績)を右クリックし[メジャーの追加]。
    b. [Power Pivot]-[管理]でメジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。
    c. [データ]-[データモデル(緑アイコン)v]-[データモデルの管理]で、メジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。

解説 : メジャーの計算範囲と計算条件

  1. xMIS制限
    納車から3ヵ月以下では、6MISと3MISは同じ値になります。しかし、これは6MISの値が良い訳ではなく、6MISの評価期間を満了していないためです。なので、誤解を避けるため6MISの値をBLANKにする式を入れています。
  2. 最終生産月制限
    最終生産月の翌月の3ヵ月移動平均不良率は、翌月のデータが無いので2ヶ月分で計算されます。しかし、生産が無い月の不良率は意味が無いので、これをBLANKにする式を入れています。
  3. 小計・総計
    3ヵ月移動平均不良率の小計・総計はその区間の直近月の値と同じになり、小計・総計区間の不良率ではありません。誤解を避けるため、これをBLANKにする式を入れています。なお、小計・総計区間の不良率は、単月の不良率のメジャーで計算されます。
メジャー 期間 xMIS制限 最終生産月制限 小計・総計
M不良数 現在のコンテキスト あり 生産数で判定 表示
M不良率 現在のコンテキスト ― ― 表示
M不良数3 直近3か月 あり あり 非表示
M生産数3 直近3か月 ― あり 非表示
M不良率3 直近3か月 ― あり 非表示

'生管'に作るメジャー

M生産数3:=VAR CurrentDate = MAX('日付'[日付])	// 年月コンテキストの日付の最大値(実質月末日になる)
VAR LastProductionDate = EOMONTH(
CALCULATE(MAX('生管'[日付]), ALL('日付')),
0
) // コンテキストの機種における生産実績の最終月末日
RETURN
IF(
HASONEVALUE('日付'[年月]) // 単月コンテキストのみ計算
&&
CurrentDate <= LastProductionDate, // 最終生産月以前を計算
    CALCULATE(	// 直近3か月の生産数を集計
SUM('生管'[生産数]),
DATESINPERIOD('日付'[日付], CurrentDate, -3, MONTH)
)
)

解説 : 3ヵ月移動平均不良率の分母となる3ヵ月間の生産数を計算します。CULCULATE関数によりコンテキストをDATESINPERIOD関数の範囲に変更し、そのコンテキストの合計をSUM関数で求めています。第3引数(偽の式)が無いIF()は、偽の時に何も返しません。BLANK()と同じ処理になります。
長い式ですが、生産数の計算をしているのは、最後のCALUCULATE関数だけで、その他は、計算の要否を判定する式です。

 

'市場'に作るメジャー

M不良数:=VAR CurrentMIS = MAX('xMIS'[xMISid])	// コンテキストのxMIS
VAR LastServiceDate = MAX(
CALCULATE(MAX('市場'[発生日]), ALL('市場')),
MAX('締日'[日付])
) // 最新市場不良有効日
RETURN
IF(
CurrentMIS = 999 // 合計は計算
||
IF(
MIN('日付'[日付]) <= LastServiceDate, // 計算開始日が最新市場不良有効日以前の場合のみ処理
// (最新市場不良有効日 ~ 計算開始日)の月越え数 - 上市月数 >= xMISの期間 なら計算。小計も計算するので計算開始日で判定
DATEDIFF(MIN('日付'[日付]), LastServiceDate, MONTH) - MAX('機種'[上市月数]) >= CurrentMIS
),
    CALCULATE(	// コンテキストのxMIS以下の不良数を合計
SUM('市場'[数量]),
FILTER(ALL('xMIS'), 'xMIS'[xMISid] <= CurrentMIS)
) + 0 // 不良が無い場合は0
)

解説 : これはコンテキストの期間の不良数の合計です。xMISは下位のxMISを含むので、FILTER関数でxMISidが小さい下位の範囲を含むコンテキストに変更してSUM関数で合計します。
xMISの有効性は、(最新市場不良有効日 - 計算開始日)の月数 - 上市月数 >= コンテキストのxMISの月数 が成立する条件で判断しています。(最新市場不良有効日 - 計算開始日)の月数は、DATEDIFF(,,MONTH)で計算される月またぎの回数です。不良率は小計も計算しますが、小計区間に1つでもxMISが有効な月が含まれていれば、小計を出すためにコンテキストの開始日で有効性を判断します。
例 : 「最新市場不良有効日3月 - 計算開始日1月 - 上市月数0」は、「3-1-0=2 < 3MISの月数3」なので計算しない。即ち、1月は3月時点では2ヶ月経過で、3MISの3ヵ月を満たしていないので、3MISを計算しません。
長い式ですが、不良数の計算をしているのは、最後のCALUCULATE関数だけで、その他は、計算の要否を判定する式です。

 

M不良率:=DIVIDE([M不良数], SUM('生管'[生産数]))

解説 : コンテキストの期間の不良率。DIVIDEは割り算をする関数で、分母が0の時エラーを表示しません。実務では分子を1,000,000倍して、ppmにした方が良いです。

 

M不良数3:=VAR CurrentDate = MAX('日付'[日付])	// 年月コンテキストの日付の最大値(実質月末日になる)
VAR CurrentMIS = MAX('xMIS'[xMISid]) // コンテキストのxMISid
VAR LastProductionDate = EOMONTH(
CALCULATE(MAX('生管'[日付]), ALL('日付')),
0
) // コンテキストの機種における生産実績の最終月末日
VAR LastServiceDate = MAX(
CALCULATE(MAX('市場'[発生日]), ALL('市場')),
MAX('締日'[日付])
) // 最新市場不良有効日
RETURN
IF(
HASONEVALUE('日付'[年月]) // 単月コンテキストのみ計算
&&
CurrentDate <= LastProductionDate // 最終生産月以前を計算
&&
( // xMISの有効性の判定
CurrentMIS = 999 // 合計は計算
||
IF(
CurrentDate <= LastServiceDate, // 計算終了日が最新市場不良有効日以前の場合のみ処理
// (最新市場不良有効日 ~ 計算終了日)の月越え数 - 上市月数 >= xMISの期間 なら計算。移動平均は単月コンテキストのみ計算するので計算終了日で判定
DATEDIFF(CurrentDate, LastServiceDate, MONTH) - MAX('機種'[上市月数]) >= CurrentMIS
)
),
    CALCULATE(
SUM('市場'[数量]), // 3ヶ月間の不良数を合計
FILTER(ALL('xMIS'), 'xMIS'[xMISid] <= CurrentMIS), // 下位xMISを含む
DATESINPERIOD('日付'[日付], CurrentDate, -3, MONTH) // 当月を含む3ヶ月間
) + 0 // 不良が無い場合は0
)

解説 : 3ヵ月の移動平均不良率の分子となる3ヵ月の不良数の合計。式の仕組みは、[M生産数3]の3ヵ月の処理と部分と[M不良数]の下位xMISの処理を組み合わせたものです。これに、最終生産月制限を加えています。
xMISの有効性判定は計算終了日を用いています。これは、移動平均が単月コンテキストしか計算しないので、小計のコンテキストの開始日が当月より前になることに配慮する必要が無いからです。
その他は、式中のコメントを参照してください。
長い式ですが、不良数の計算をしているのは、最後のCALUCULATE関数だけで、その他は、計算の要否を判定する式です。

 

M不良率3:=DIVIDE([M不良数3], [M生産数3])

解説 : 3ヵ月の移動平均不良率。割り算の分母である[M生産数3]がBLANKなら、BLANKを返すので、計算するかどうかの判断は[M生産数3]の中のみで良い。

12) ピボットテーブルの設定

デバッグ用の集計一覧

デバッグ用に不良率以外の値も表示するピボットテーブルを作成します。報告書などには、不良率のみ表示したピボットテーブル、ピボットグラフを作成してください。

  1. 次のように項目を設定します。
  • 列 : '日付'[四半期]、'日付'[年月]。
  • 行 : '機種'[機種]、'xMIS'[xMIS]、Σ値。
  • Σ値 : '生管'[生産数]、[M不良数]、[M不良率]、[M生産数3]、[M不良数3]、[M不良率3]。
  1. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]で、"更新時に列幅を調整する"のチェックを外す。
  2. [ピボットテーブル分析]-[オプション]-[表示]で、"データのないアイテムを行/列に表示する"のチェックを外す。
  3. [デザイン]-[レポートのレイアウト]-[アウトライン形式で表示]または[表形式]。(表形式だと小計が下に表示される)
  4. [デザイン]-[総計v]-[行と列の集計を行う]。
  5. 表の"四半期"を右クリックし、["四半期"の小計]をクリックして✓マークを付ける。
  6. [デザイン]-[ピボットテーブルスタイル]で、ベースとするスタイルを右クリックし[複製]。ユーザー設定のスタイルを右クリックし、[変更]でスタイルを変更。[デザイン]-[ピボットテーブルスタイル]で、ユーザー設定したスタイルをクリック。
  • 最初の列 : 右罫線
  • 見出し行 : 下罫線; 網掛け
  • 小計列 1 : 右計算、網掛け
  • 小計行 1 : 上下罫線
  • 列小見出し 1 : 上罫線(細)
  • 列小見出し 2 : 上罫線(細)
  • 行小見出し 1 : 上罫線(細)
  • 行小見出し 2 : 上罫線(細)
  • 総計列 : 右罫線(太); 網掛け
  • 総計行 : 上下罫線(細,太); 網掛け

参考 : ピボットテーブルのスタイルの自由度は低いです。手動でセルの書式設定しても、更新で書式がクリアされる場合があります。自由に書式設定したい場合は、GETPIVOTDATAを使用して別のワークシート表で書式設定したほうが良いです。

ピボットグラフ用のピボットテーブルとピボットグラフの作成

  1. 集計一覧のピボットテーブルがあるシートをコピーします。
  2. 次のように項目を設定します。
  • フィルター : '機種'[機種]
  • 列 : 'xMIS'[xMIS]、Σ値。
  • 行 : '日付'[年月]。
  • Σ値 : [M不良率] または [M不良率3]。
  1. [ピボットテーブル分析]-[オプション]-[表示]で、"データのないアイテムを行/列に表示する"のチェックを外す。

  2. [デザイン]-[レポートのレイアウト]-[表形式]。

  3. [デザイン]-[総計v]-[行と列の集計を行わない]。

  4. 表の"四半期"を右クリックし、["四半期"の小計]をクリックして✓マークを外す。

  5. [ピボットテーブル分析]-[ピボットグラフ]-[折れ線]-[マーカー付折れ線]-[OK]

  6. 機種フィルターで1機種を選択

別条件のピボットテーブルとピボットグラフの作成

  1. 前記ピボットテーブルとピボットグラフがあるシートをコピー。または、ピボットテーブルとピボットグラフ全体を含むセル範囲を切り取り、別の場所に貼り付ける。
  2. 機種フィルターやΣ値の項目を変更。

5. 注意

不良品の製番の製造日がリワークなどの入庫ずれなどで、生産数のデータの製造日と合わず、不良品の製番から求めた製造日の生産数が0の場合、不良率は表示されません。後述のサンプルファイルの2025年5月の機種aがその例です。
これにより、サンプルの単月の推移グラフの時間軸から2025年5月が抜け落ちていますが、グラフでは気づきません。
3ヵ月移動平均は、3ヶ月間生産0が続いていないのでグラフに表示されまが、3ヶ月間生産0が続けば単月と同じことが起きます。

この間違いに気づく為に、サンプルではデバッグ用の'一覧シート'を設けています。これを見ると25/05の不良数が1なのに、生産数が空白であることから、間違いに気づきます。

ピボットテーブルの[オプション]-[表示]で"データのないアイテムを行/列に表示する"のチェックを入れると、データが無いことに気づきやすくなりますが、余計な項目も表示されます。この場合は、メジャーで余計な項目の非表示処理をするより、ピボットテーブルのフィルターやスライサーやワークシートの非表示機能で不要な部分を非表示にした方が、短いメジャーになります。

この例以外の事も含め間違いに気づく為には、メジャーのDAX式の動作を理解していることが必要です。メジャーは、コンテキストを理解していないと想定外の値を出すことがあるので、コンテキストを認識してください。

本メジャーの作成にChatGPTを利用しましたが、AI/LLMの式は抜けや冗長な部分が多くあり、かなりの手修正を入れています。コンテキストが分からない時に、AI/LLMを活用することは有効です。その際は、入力と出力の項目とリレーションとメジャーをインプットします。

6. サンプル

ダウンロード - 260823_3mis.zip

C:\Users\Public\Documents\260823_3mis に展開した各ファイルを置いてください。

  • 集計1.xlsx : 3MISの集計ブックです。
  • 生管.xlsx : 部品の生産データです。
  • Service.csv : 市場サービスデータです。UTF-8です。
  • Service.xlsx : テストデータService.csvを作成するための元データです。集計.xlsxでは使いません。
  • 月数テスト.xlsx : 月数の計算式のテストをしたファイルです。

7. 参考

| | コメント (0)

技適付ExpressLRS受信機 RadioMaster ER8、NEXUS-XR

1. 前置き

ExpressLRS(ELRS)のTelemetry送信に対応した技適付受信機にER8が加わったので、何ができるのかを想像してみました。想像なので間違っているかも知れません。NEXUS-XRは受信機付フライトコントローラーですが、ER8は純粋な受信機です。

(購入したので設定などを別記事にしました。5. 参考情報のリンクを見てください。説明書はExpressLRSを理解していないと意味不明なところがあるので、ExpressLRSが初めての人は、分かりにくいと思います。Armの設定やBind条件に注意が必要です。)

2. 機能比較表

間違いや不正確なところがあるかも知れません。

Item ER8 NEXUS-XR
PWM 8ch(SBUS含) 8ch + SBUS ?
Telemetry Power ~100mW[*1] 2 x 10mW
ExpressLRS Gemini No[*1] Yes
Flight Controller No RotorFlight, INAV
Voltage Sensor Built-in Built-in
Barometer External/ERS-BA01 Built-in
USB No Yes
Wi-Fi Yes Yes
Communication port CRFS x 1[*4] UART x 3
Protocol 専用(Crossfire) 汎用
GPS Sensor [*3] 専用/ERS-GPS(他のERSセンサも使う場合) 汎用(UBX/NMEA等)
Current Sensor 専用/ERS-CU1 [*2]
ESC Telemetry CRFS端子をUARTとして接続可能
CRFS端子を占有する為、
他のGPS等のERSセンサーは使用できない
UART3ポートとPWM端子が使用可能
他の空きポートでGPSなどを同時利用可能

[*1] Telemetry Power & Gemini : 100mWは海外で使用する場合の値だと思われます。設定を変えることができます。日本では、大きくてもBETAFPV Nano TX V2 Module ELRS 2.4G と同じ25mW以下だと思われます。2xと書かれていないので、Geminiには対応していないと思われます。操縦系より先にTelemetryが切れたほうが安全なので、NEXUS-XRと同じ10mWが良いと思われます。

[*2] Current Sensor : ADCの入力がBAT+しかないので、BAT+を電圧に使うと、アナログ電圧出力の電流センサが使えません。可能性なのはESC Telemetryだと思われます。
Current Sensorが使えると、EdgeTXのCalculated Sensorを用いて、バッテリ残量表示ができる可能性があります。
ERS-CU1はシャント抵抗式なので、電圧ロスが発生します。

Hall Sensor式が使えると嬉しいのですが。I/FがUART対応になると更に嬉しいのですが、FCやELRS側でも対応が必要ですね。

[*3] GPS : 両者とも yaapu/HorusMappingWidget により衛星画像上に機体位置を表示することができると思います。ubloxのUART/UBX I/Fの汎用GPSの2~3倍の価格ですが、Futabaの1/3倍位の価格です(FutabaのGPSは気圧センサーも入っています。)。専用と汎用では、販売数が異なるので。専用は高くなります。

[*4] 専用CRFS : デージーチェーン接続ができるので、1ポートでも数珠繋ぎで複数のセンサーを接続することができます。Protocolは、CRFS以外にも、SBUS、GPS他に変更できます。GPSに設定するとNMEA、115200bpsのGPSを接続できます。なので、電波と電圧とGPSのTelemetryだけなら、ERS-GPSより一般のGPSの方が安くて小型なので良いです。

3. 受信機情報

ER8

NEXUS-XR

Shop

  • GOOHOBBY
    https://goohobby.com/
    NEXUS-XR、ER8。現時点では技適マークが後付けなので、技適付と書かれていない店の物には技適マークが無いと思われます。

  • Energy Power
    https://energy-powerrc.com/
    NEXUS-XR

4. ExpressLRSとLoRa

RCの無線方式に、ELRS(Express Long Range System)があります。Open Sourceです。

Long Rangeの為に、微弱な電波でも復調できるLoRa変調を使用できます。(他の変調も選べます。)

LoRaは、河川の水位計にも使われているようです。

LoRaの仕組みが次の動画の6:35から解説されています。

ExpressLRSはTelemetryを標準装備しているのですが、2025年までは、技適を取得したELRS受信機がありませんでした。しかし、最近RadioMasterのNEXUX-XRとER8の技適が取得されたので、日本でもExpressLRSのTelemetryを利用することができるようになりました。

5. 参考情報

6. 余談

ExpressLRSはFCC/LBTを選択により、LBTだけでなく北米と欧州のMax Powerも切り替えているようです。MAX Powerの制限程度であれば、elrs.luaに地域択機能を付けてMAX Powerの制限を掛けたらどうかと思います。Japanを選べば、MAX Powerの選択肢を25mWに制限するとかです。FCC/LBT共用は、メモリーサイズが厳しいのかも知れません。

| | コメント (0)

イオン銀行のFIDO(スマホ)認証化で、通話SIMのスマホが無いとネット振込ができない

1. PCだけではイオン銀行のネットバンキングを利用できなくなる

2026年9月7日から、イオン銀行で振込などのネットバンキングを利用する際にFIDO(スマホ)認証が必須になるそうです。

  • 【2026年9月7日(予定)】インターネット取引時の認証強化について
    https://www.aeonbank.co.jp/news/fido/
    スマートフォンをお持ちでないお客さまは以下『インターネットバンキングでFIDO認証が必要なお取引・操作』はできなくなります

↑ 説明が不十分です。通話SIMのスマートフォンが必要らしいです。他社のFIDO認証は、データSIMのスマホでもできるし、パソコンのパスキー認証などスマホ以外でもできますが、イオン銀行はできません。

2026年8月20日にイオンのサポートに電話で再確認したところ、電話番号の登録が必要らしいのですが、スマートフォン以外の電話番号は使えないとのことです。(何でスマホ以外の電話をNGにしたのか理解できません。)
私のスマートフォンはデータSIMなので、通話&SMS電話番号がありません。よって、ネット振込ができなくなるとのことです。
現在ネット振込を利用しているので、これができなくなると困ります。
なので、解約してデータSIMのスマホのFIDOやPCのパスキー認証でもネットバンキングが使える他の銀行にするしかないです。

解約をしようと思います。

解約してもWAONの残高は使えるがセキュリティの関係があるので早めに使えと言われました。ネットの記載だと、カードの有効期間中は使えるらしいです。

データSIMで使えないことは、イオンのAIにもFAQにも記述がありませんでした。AIも元データが無ければ答えようが無いので、イオンの元データが貧弱なんでしょうね。

ところで、スマホが壊れたらどうするんでしょうかね? 他のネット証券やネット銀行は、データSIMのスマートフォンでもFIDO認証できるし、PCも含む複数端末のパスキー認証なども対応しているし、一時的なパスワード認証の有効化手段も用意されており、故障時のバックアップ手段が用意されています。イオンのシステムエンジニアの考えることは、理解不能です。

銀行カード付属のクレジットカードの引き落とし口座の変更はできないので、引き落としが完了するまでは解約できません。FIDOが始まると振込ができないので残高を減らせず、残高制限でオンラインの解約ができなくなります。なので、9/7前に今後の引き落とし金額を除く金額をオンラインで他行に振込移動しました。それでもオンライン解約できなければ、郵送か店舗での解約になりそうです。ETCカードも使えなくなるので、別カードでのETCカード申請とETCマイレージサービスのカード登録の変更をしました。PayPayに銀行登録を他行に変更しました。 ⇒ これで解約準備完了です。クレジットカードの引き落とし後、残金が0円になったら、解約します。

スマホは電池が持たないので、通話SIMは1週間電池が持つガラホに入れているのですが、そのような人は少ないから、切り捨てられたのでしょう。

2. パスキーで不正アクセスがあったらしい?

  • パスキー認証で不正アクセス・不正取引発生!楽天証券での対策方法は? : 楽天市民 : 2026/09/26
    https://www.youtube.com/watch?v=WWtGGuq9X_0

  • FIDO/パスキーの種類、パスキーとパスコードの関係 : 当ブログ : 2026/08/20
    https://bigarrow.tea-nifty.com/blog/2026/09/post-e682e1.html

    スマートフォンは、クラウドを使用して複数の端末を連動させるので、クラウドが攻撃を受ければ、不正アクセスされるということですね。
    だとすると、PCのWindows Helloだけにするのが最も安心なのかも知れません? でもイオン銀行ではできません。

3. クレジットカード会社の電話

イオン銀行の某クレジットカードの引き落としが終わり、引き落とし残高と銀行残高が0円になりました。そこで、某クレジットカードの口座の変更をしようとしたのですが、オンラインでできません。電話で書類を取り寄せるのですが、携帯電話ではフリーダイヤルが使えません。中継電話(プレフィックス)も使えません。受付開始時に電話したら、電話の空き待ちになって話ができません。無駄な電話料金を消費しました。ネットd調べたら火~木の15~17時くらいが空いているらしいので、その時間帯に電話したらつながりました。オンラインで手続きできないカードは不便ですね。

| | コメント (0)

Google Looker Studio と Microsoft Power BI

セルフサービス型のBIツールであるLooker StudioとPower BIの比較表をGeminiに作成してもらいました。

機能/要素 Microsoft Power BI Google Looker Studio
主な用途 複雑なデータモデリング、深掘り分析 Web/マーケティングダッシュボード、迅速な共有
ETL / 前処理 Power Query(超強力) 限定的(データ結合、簡易変換のみ)
計算エンジン DAX(非常に高度な記述が可能) 計算フィールド(SQL/Excelライクな関数)
ツリーマップ ✅ 標準搭載 ✅ 標準搭載
分解ツリー ✅ 標準搭載(AIビジュアル) ❌ 非対応(ドリルダウンで代替)
導入・共有の容易さ Desktopアプリ + Proライセンス必要 ブラウザのみで完結、URL共有が容易

Looker Studioにメジャーやイテレート関数は無いようですが、計算フィールドやテーブル計算を用いて、似たようなことはできるらしいです。メジャーを知らない人には、こちらの方が良いかも知れません。でも、メジャーを知っている人は、逆にその知識が邪魔になるかも知れません?

Excelユーザーにとっては、Power Query、DAXの知識が活かせるPower BIの方が敷居が低そうです。
でもPower BI Proは別料金なので、Microsoft365に組み込まれない限り、普及は進まない気がします。
結果を貼れるのはWeb版のPower Pointのみで、OfficeのOLEを利用できないもの難点です。これはクラウドサービスであるLooker Studioも同じです。
Power BIのビジュアルの設定のUIが、Officeとは大きく異なる点も、Officeユーザーへの普及の妨げになるでしょう。

Excel Power Pivotでもダッシュボードやドリルダウンはできますが、ユーザーが多いExcelにPower BIのビジュアルと解析ツールが搭載されたほうが、Power BIより喜ぶ人が多そうな気がします。Excel Power Pivotの方が、Power BIより使う機会が多いです。

個人的には、今更Spread SheetやLooker Studioを学習する気は全く無いのですが、気になりますね。

久しぶりにPower BI Desktopを開いたら、Power Apps for Power BIとPower Automate for Power BIのビジュアルが追加されていました。これらは、ビジュアルを作るものではなく、データの操作やアクションをするもののようです。ビジュアルの作成は、Deneb (Vega / Vega-Lite ビジュアル)、Power BI Developer Tools を使うらしいです。

Power BIの悪いところ

  1. UIがMicrosoft Officeと異なるので、直感で設定箇所が分からないです。
  2. Power BI Desktopのレポートビューで編集のためにオブジェクトを右クリックしても、編集コンテキストメニューが出ず、ビジュアルの書式設定のメニュー階層を下る必要があり、分かりにくいです。また、ビジュアルの書式設定の表示領域が狭く、図も無く文字だけで機能を判断できないことにも問題があります。このUIがOfficeと比べて分かりにくい点です。
    ⇒ 編集モードと閲覧モードを分け、右クリックのコンテキストメニューや書式設定画面をOfficeと同じにすれば、分かりやすくなると思います。

Office開発チームがPower BI開発チームを吸収した方が、開発効率が上がり、統一感が出てユーザーが余計なものを覚えなくても良いようになると思います。ExcelにPower BIをアドオンし、Graph専用のシートのようにPower BIのページを持たせればよいと思います。ExcelのシートにPower BIのレポートページを追加するのは、なかなか良いアイデアだと思うのですが...誰かが特許を出しているのでしょうかね?

| | コメント (0)

EACHINE LCD5802D 修理

5.8GHz LCD Screen Receiver Monitor Recorder を修理しました。

1. 充電できない

問題

赤と緑のLEDが交互に高速に点滅して充電できません。

バランスが狂っているのかと思い分解しましたが、回路が特殊で理解できず、バランシングするための端子が出ていないようです。バッテリー側の回路仕様が分からず、一般的な制御回路なしのバッテリに交換することができません。

暫定処置

ACアダプタのDCプラグを挿して赤LEDが点灯後、緑LEDが高速点滅開始する前にDCプラグを抜き、直ぐにDCプラグを挿すということを何回も繰り返すと、充電を示す赤LEDの連続点灯になり充電が開始されました。
これは、極短時間の赤LED点灯中に少しずつ電圧のセルが充電されて低電圧のセルの電圧が上がったためだと思われます。
しかし、高い電圧のセルも充電されるので、バランスが直ったわけではなく、低電圧のセルが満充電にはならないようです。なので、動作可能時間は短く、根本的には直っていません。

信号ピンの意味と回路図が分かる方がいれば教えてください。

2. 樹脂部分のべたつき

問題

黒のマット加工がされた樹脂で、加水分解でべたつきが発生しました。設計者の材料選定ミスです。マット処理で吸湿しやすくなったのが原因かも知れません。

対策

分解して樹脂部分だけを重曹を溶かした温水に漬け置きおきし、歯ブラシでこすって、べたつきを取りました。

3. フードの支持軸などの折れ

問題

加水分解で樹脂がもろくなり、力が掛かる部分が殆ど折れました。

修理

横のフードの軸の付け根部分を長さ12mm、幅1.5mm削り取り、直径1.5mm、長さ14mmのカーボン棒を折れた軸の部分にシアノアクリレート系の接着剤で付け、テープで補強しました。

上のフードは軸の根元に直径1.5mmの穴を開け、直径1.5mmのカーボン棒を挿し込み、シアノアクリレート系の接着剤で固定しました。
接着剤が固まったら、やすりで整形し、テープで補強しました。

樹脂がもろくなっているので、強度は低いです。

軸の飛出し長さ

  • 上のフード : 1mm
  • 横のフード : 2mm
    特に上のフードは挿入時にきついので、短めが良いです。横の上側の軸も短めが良いでしょう。

フードの取付

  • 上のフード : 片軸を差し込み、閉じた状態から少し空けた角度で画面下側からもう片方の軸を押し込みます。この時、本体側の壁を押し広げるようにします。
  • 横のフード : 画面下側を先に差し込み、立てた状態から少し内側に傾け、上の軸を細い6角棒のドライバーなどで背面側に押し込みます。バネを付ける場合は、先にバネを入れてください。私はバネの応力で再び壊れることを避けるため、バネを入れませんでしたが、バネ無しでも上の蓋に横フードの引っ掛かりがあるので、問題ありませんでした。

260817lcd1 260817lcd2 260817lcd3 260817lcd4

| | コメント (0)

Excel/Power BI 損益計算書(PL)の作成

1. 前置き

A. Excelのワークシート式で損益を計算

Excelで損益計算をするには、
① Power Queryで売上や会計等の各データの取得・整形・結合を行い、
② Power Pivotのピボットテーブルで科目別の合計を計算し、
③ GETPIVOTDATA関数でワークシートに取込み、ワークシート式で損益を計算するのが分かりやすくて良いと思います。
次の動画でその例が紹介されています。

ピボットテーブルは、合計が可能な同種の数値を、行と列項目のグループ別に集計する表です。行と列項目のグループとは別の、損益などの小計同士の計算や数量・率・人数等の異種の数値を表に入れることができません。なので、金額のグループ集計をピボットテーブルで行い、その結果を参照してワークシートで損益計算をすることをお勧めします。

本記事の「2.入力」に示すデータを使用した場合のリレーションとメジャーとピボットテーブルとワークシート式は、次の画像と「6.サンプル」を見てください。データの取得手順は、「4.手順」を見てください。GETPIVOTDATAは=の後にピボットテーブルをクリックすると自動生成されるので、変数のみ手修正します。そして、類似のセルにコピーしてスピルの範囲を修正すれば、入力の手間を少なくできます。

260815qpws1 260815qpws2


一方、ピボットテーブルとワークシートで似たような表が2つあるのは、無駄に感じるかも知れません。そこで、強引にメジャーやPower Queryで損益を計算して、ピボットテーブルに損益を表示する2つの方法が次の動画で紹介されています。

B. メジャーで損益を計算

  • 損益計算書(P&L)、貸借対照表(バランスシート)の作成方法 -071 : Power BIちゃんねる : 2024/08/23
    https://www.youtube.com/watch?v=MAAvOSNdGl4
    1期間の実算と予算を含む総勘定元帳をマトリックス(ピボットテーブル)で集計します。

この動画では元データは1期間の「General Ledger」1つです。

【本記事で紹介する内容】
実務では勘定科目や部門や商品等にデータが分かれていることがあります。また、複数期間の推移を見ます。そこで、本記事では、この方法を用いて複数期間を含む元データが科目分類ごとに分かれている手順を紹介します。

この方法の利点は、Excelのピボットテーブルのフィルター/スライサー/項目追加や、Power BIの分解ツリー/ドリルダウン/ドリルスルーにより、動的に集計範囲を変えることにより、損益偏差の要因調査の補助ツールになることです。なので、提出用ではなく、損益の調査分析用に用いると良いです。Power BI Desktopは、無料で分解ツリーなどを利用できます。しかし、他人との共有は有料契約が必要なので、他人に見せるならExcelが良いです。本記事では、Excelの操作方法を紹介します。

  • Power BI Desktop(無料版) : Microsoft
    https://www.microsoft.com/ja-jp/power-platform/products/power-bi/desktop
    Power BIでもExcelのPower QueryとDAXのコードを使用できます。Power Queryエディタの画面は、Excelとほぼ同じです。Power Pvot for Excelでは、メジャーの名前と式の間が":="ですが、Power BIでは"="になります。

C. Power Queryで損益を計算

  • 【Excel】ピボットテーブルで総勘定元帳から損益計算書(PL)を作るなんて簡単。そんなふうに考えていた時期が俺にもありました。【YT0156】 : ExcelドカタCH : 2024/02/17
    https://www.youtube.com/watch?v=pjhkmd3qdL0
    複数期間別の総勘定元帳を集計します。

Power Queryのピボットテーブルで損益計算書を作りたい人向けです。メジャーと異なり、損益の中に勘定科目の内訳が並びません。

いずれの方法もPower Queryでデータの取得・整形・結合を行う部分までは、ほぼ同じです。


2. 入力

リスト形式とクロス形式の表を例にします。また、勘定科目、部門、予算/実績でファイルが分かれているものを例にします。

1) ファイルの仕様一覧

ファイル名 内容 形式 ファイル名に含む文字 拡張子 シート名 有効データ以外がnullの列
売上予算*.xlsx 売上予算 クロス表 売上予算 .xlsx 売上予算 項目/D/Column4
売上実績*.xlsx 売上実績 リスト 売上実績 .xlsx 売上実績 売上/G/Column7
原価予算*.xlsx 売上原価予算 クロス表 原価予算 .xlsx 原価予算 勘定科目名称/B/Column2
原価実績*.xlsx 売上原価実績 クロス表 原価実績 .xlsx 原価実績 勘定科目名称/B/Column2
経費予算*.xlsx 販売費及び一般管理費予算 クロス表 経費予算 .xlsx 経費予算 勘定科目名称/B/Column2
経費実績*.xlsx 販売費及び一般管理費実績 クロス表 経費実績 .xlsx 経費実績 勘定科目名称/B/Column2
その他予算*.xlsx その他予算 クロス表 その他予算 .xlsx その他予算 勘定科目名称/B/Column2
その他実績*.xlsx その他実績 クロス表 その他実績 .xlsx その他実績 勘定科目名称/B/Column2
  • クロス表は、横軸が"yy/mm"形式の月毎に集計された表です。
  • ファイル名の*は、任意の部門名や商品名や年月等が入ります。
  • 各ファイル名は、同じフォルダ名の下に格納します。サブフォルダの下でも良いです。
  • ファイル名に含まれる文字と拡張子が一致するファイルを取得します。本例は.xlsxですが、.csvに変更することもできます。
  • シート名は、データがあるシート名です。
  • 有効なデータ以外がnullの列を、不要な行をフィルターで削除する列に使用します。

2) 売上予算

◢ A B C D E F G
1 売上予算            
2 勘定科目コード 勘定科目名称 品目 項目 26/04 26/05 26/06
3 4000 国内売上A 商品1 数量 20 15 20
4 4001 国内売上B 商品2 数量 20 15 15
5 4100 海外売上A 商品3 数量 20 20 25
6 4101 海外売上B 商品4 数量 20 20 25
7 4000 国内売上A 商品1 単価 50 50 50
8 4001 国内売上B 商品2 単価 60 60 70
9 4100 海外売上A 商品3 単価 70 70 70
10 4101 海外売上B 商品4 単価 80 80 70
11 4000 国内売上A 商品1 売上 1,000 750 1,000
12 4001 国内売上B 商品2 売上 1,200 900 1,050
13 4100 海外売上A 商品3 売上 1,400 1,400 1,750
14 4101 海外売上B 商品4 売上 1,600 1,600 1,750
  • クロス表。日付は"yy/mm"形式のテキスト。

3) 売上実績

◢ A B C D E F G
1 売上実績            
2 日付 勘定科目コード 勘定科目名称 品目 数量 単価 売上
3 26/04/01 4000 国内売上A 商品1 12 50 600
4 26/04/01 4001 国内売上B 商品2 20 60 1,200
5 26/04/30 4000 国内売上A 商品1 8 50 400
6 26/04/01 4100 海外売上A 商品3 20 70 1,400
7 26/04/01 4101 海外売上B 商品4 20 80 1,600
8 26/05/01 4000 国内売上A 商品1 15 50 750
9 26/05/01 4001 国内売上B 商品2 15 60 900
10 26/05/01 4100 海外売上A 商品3 20 70 1,400
11 26/05/01 4101 海外売上B 商品4 15 80 1,200
12 26/06/01 4000 国内売上A 商品1 20 50 1,000
13 26/06/01 4001 国内売上B 商品2 15 70 1,050
14 26/06/01 4100 海外売上A 商品3 25 70 1,750
15 26/06/01 4101 海外売上B 商品4 25 70 1,750
  • リスト形式。

4) 売上原価予算/実績

◢ A B C D E F G
1 原価予算            
2 勘定科目コード 勘定科目名称 品目 項目 26/04 26/05 26/06
3 4500 国内売上原価A 商品1 数量 20 15 20
4 4501 国内売上原価B 商品2 数量 20 15 15
5 4600 海外売上原価A 商品3 数量 20 20 25
6 4601 海外売上原価B 商品4 数量 20 20 25
7 4500 国内売上原価A 商品1 単価 25 25 25
8 4501 国内売上原価B 商品2 単価 30 30 35
9 4600 海外売上原価A 商品3 単価 35 35 35
10 4601 海外売上原価B 商品4 単価 40 40 35
11 4500 国内売上原価A 商品1 原価 500 375 500
12 4501 国内売上原価B 商品2 原価 600 450 525
13 4600 海外売上原価A 商品3 原価 700 700 875
14 4601 海外売上原価B 商品4 原価 800 800 875
  • クロス表。日付は"yy/mm"形式のテキスト。

5) 販売費及び一般管理費予算/実績

◢ A B C D E F
1 経費実績          
2 勘定科目コード 勘定科目名称 部門 26/04 26/05 26/06
3 5001 給与手当 営業 450 400 400
4 5100 広告宣伝費 営業 300 300 300
5 5200 旅費交通費 営業 300 300 300
6 5300 通信費 営業 100 100 100
7 5400 消耗品費 営業 50 50 50
8 5500 水道光熱費 営業 50 50 50
9 5600 地代家賃 営業 250 250 250
  • クロス表。日付は"yy/mm"形式のテキスト。

6) その他予算/実績

◢ A B C D E
1 その他予算        
2 勘定科目コード 勘定科目名称 26/04 26/05 26/06
3 6100 利息受取 50 50 50
4 6200 雑収入 50 50 50
5 7100 為替差損 50 50 50
  • クロス表。日付は"yy/mm"形式のテキスト。

参考 : 以上の例に品目、部門、適用などの内訳列を追加すると、より細かい偏差要因調査ができます。

7) 勘定大項目マスター

テーブル名 : 勘定大項目

勘定大項目 順番
売上 1
売上原価 2
売上総利益 3
販売費及び一般管理費 4
営業利益 5
営業外収益 6
営業外費用 7
経常利益 8
  • 損益計算書の大項目。表示用。リレーションを取らない。
  • 本例では損益計算書のブックにあるものとします。

8) 科目マスター

テーブル名 : 科目

勘定科目コード 勘定科目名称 勘定大項目
4000 国内売上A 売上
4001 国内売上B 売上
4100 海外売上A 売上
4101 海外売上B 売上
4500 国内売上原価A 売上原価
4501 国内売上原価B 売上原価
4600 海外売上原価A 売上原価
4601 海外売上原価B 売上原価
5001 給与手当 販売費及び一般管理費
5100 広告宣伝費 販売費及び一般管理費
5200 旅費交通費 販売費及び一般管理費
5300 通信費 販売費及び一般管理費
5400 消耗品費 販売費及び一般管理費
5500 水道光熱費 販売費及び一般管理費
5600 地代家賃 販売費及び一般管理費
6100 利息受取 営業外収益
6200 雑収入 営業外収益
7100 為替差損 営業外費用
  • 勘定科目と勘定大項目の関係を定義するテーブル。予算と実績および勘定大項目との関連付けをする。

参考 : 本例では7)と8)は、損益計算書のブックにあるものとします。実務ではマスターデータの一元化のため、別の共有ファイルにした方が良いです。

この他に日付テーブルが必要ですが、ExcelではPower Query、Power BIではDAXで生成します。

3. 出力(損益表)

Excelのピボットテーブル、Power BIのマトリックスで出力します。

勘定大項目 勘定科目名称 1Q 1Q M実績 1Q M予算 1Q M予実差
26/04 26/05 26/06
M実績 M予算 M予実差 M実績 M予算 M予実差 M実績 M予算 M予実差
- 売上 5,200 5,200 ±0 4,250 4,650 -400 5,550 5,550 ±0 15,000 15,400 -400
  海外売上A 1,400 1,400 ±0 1,400 1,400 ±0 1,750 1,750 ±0 4,550 4,550 ±0
  海外売上B 1,600 1,600 ±0 1,200 1,600 -400 1,750 1,750 ±0 4,550 4,950 -400
  国内売上A 1,000 1,000 ±0 750 750 ±0 1,000 1,000 ±0 2,750 2,750 ±0
  国内売上B 1,200 1,200 ±0 900 900 ±0 1,050 1,050 ±0 3,150 3,150 ±0
-売上原価 2,700 2,600 +100 2,125 2,325 -200 2,775 2,775 ±0 7,600 7,700 -100
  海外売上原価A 700 700 ±0 700 700 ±0 875 875 ±0 2,275 2,275 ±0
  海外売上原価B 800 800 ±0 600 800 -200 875 875 ±0 2,275 2,475 -200
  国内売上原価A 600 500 +100 375 375 ±0 500 500 ±0 1,475 1,375 +100
  国内売上原価B 600 600 ±0 450 450 ±0 525 525 ±0 1,575 1,575 ±0
+ 売上総利益 2,500 2,600 -100 2,125 2,325 -200 2,775 2,775 ±0 7,400 7,700 -300
- 販売費及び一般管理費 2,450 2,400 +50 2,360 2,400 -40 2,400 2,400 ±0 7,210 7,200 +10
  給与手当 850 800 +50 800 800 ±0 800 800 ±0 2,450 2,400 +50
  広告宣伝費 300 300 ±0 300 300 ±0 300 300 ±0 900 900 ±0
  消耗品費 100 100 ±0 100 100 ±0 100 100 ±0 300 300 ±0
  水道光熱費 100 100 ±0 100 100 ±0 100 100 ±0 300 300 ±0
  地代家賃 500 500 ±0 500 500 ±0 500 500 ±0 1,500 1,500 ±0
  通信費 200 200 ±0 200 200 ±0 200 200 ±0 600 600 ±0
  旅費交通費 400 400 ±0 360 400 -40 400 400 ±0 1,160 1,200 -40
+ 営業利益 50 200 -150 -235 -75 -160 375 375 ±0 190 500 -310
- 営業外収益 100 100 ±0 100 100 ±0 160 100 +60 360 300 +60
  雑収入 50 50 ±0 50 50 ±0 110 50 +60 210 150 +60
  利息受取 50 50 ±0 50 50 ±0 50 50 ±0 150 150 ±0
- 営業外費用 50 50 ±0 40 50 -10 50 50 ±0 140 150 -10
  為替差損 50 50 ±0 40 50 -10 50 50 ±0 140 150 -10
+ 経常利益 100 250 -150 -175 -25 -150 485 425 +60 410 650 -240
  • 勘定大項目の利益は折りたたみ、科目内訳を展開表示しないでおきます。

Power BIでは、予実差の調査のための分解ツリーを表示できます。

4. 手順

ファクトテーブルの元データは、少なくとも[日付]、[勘定科目コード]、[金額]列を持つリストに整形し、予算と実績に分けて縦結合します。

1) ファクトテーブルの元データがあるフォルダの取得

  1. [データ]-[データの取得v]-[ファイルから>]-[フォルダから]で取得するファイルがあるフォルダを選択し、[開く]-[データの変換]でPower Queryエディタに取込み、右の名前を'フォルダ'に変更する。 ⇒ フォルダの下のサブフォルダも含むファイルリストができる。
  2. [Name]列の▼-[テキストフィルター>]-[次の値で始まらない]-[詳細表示]で次のように入力し[OK]。 ⇒ ~$から始まる作業ファイルやPLを含む集計ファイルが消える。
および/または 列 演算子 値 解説
  Name 次の値で始まらない ~$ 作業ファイルを除く
および Name 指定の値を含まない PL 損益計算書ファイルを除く

2) 各勘定科目のデータファイルを取得し整形

■ 売上予算(クロス表)

  1. 左の'フォルダ'クエリを右クリックし[参照]、右の名前を'売上予算'に変更。 ⇒ '売上予算'クエリが生成される。
  2. [Name]列の▼-[テキストフィルター>]-[指定の値を含む]-[詳細表示]で次のように入力し[OK]。 ⇒ 売上予算ファイルに絞り込む。
および/または 列 演算子 値 解説
  Name 指定の値を含む 売上予算 売上予算ファイルに絞り込む
および Extension 指定の値に等しい .xlsx Excelブックに絞り込む
  1. [Content]列を右クリックし[他の列の削除]。 ⇒ ファイルの内容以外の列が削除される。

  2. [Content]列の↓↓をクリックし、データがあるシートを選択し[OK]。 ⇒ 1つのファイルを処理するためのヘルパークエリが別に生成され、複数のファイルが縦結合される。

  3. 右に生成された'サンプルファイル'、'ファイルの変換'、サンプル ファイルの変換'クエリの名前の後ろに"売上予算"を追加する。 ⇒ この作業は必須では無いが、名前で何を処理するヘルパークエリかが判別できるようになる。次に1ファイルを整形をするヘルパークエリを編集する。

  4. 'サンプル ファイルの変換売上予算'クエリを選択し、右の"ソース"と"ナビゲーション"以外のステップを削除し、"ナビゲーション"を選択する。 ⇒ 自動生成された不要なステップが削除される。

  5. [Column2]の▼-[空の削除]。 ⇒ 不要な行が消え、1行目が列項目名になる。

  6. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。 ⇒ 1行目がヘッダになる。

  7. yy/mm形式の年月以外の列をCtrlキーを押しながら全て選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。 ⇒ yy/mm列が縦1列に並び、リスト形式の表になる。

  8. [列の追加]-[カスタム列]で次のように入力し[OK]。 ⇒ [日付]列が追加される。

新しい列名 : 日付
カスタム列の式 : =
#date(
2000 + Number.FromText(Text.BeforeDelimiter([属性], "/")),
Number.FromText(Text.AfterDelimiter([属性], "/")),
1
)

解説 : yy/mm形式のテキストからPower Queryの日付形式の列を作ります。

  1. [属性]列を右クリックし[削除]。 ⇒ 不要なyy/mm列が削除される。

  2. [項目]列を選択し、[変換]-[列のピボット]で次のように入力し[OK]。 ⇒ 異なる値の種類を持つ項目が横に分離される。
    値列 : [値]
    詳細設定オプション-値の集計関数 : [集計しない]

  3. 集計する金額の列名([売上])をWクリックし、名前を"金額"に変更。 ⇒ 集計する値の列名が他のクエリと同じになる。1ファイルを整形する関数クエリが完成する。次にファイルを結合するクエリを編集する。

  4. 左の"売上予算"クエリを選択し、エラーになっている右の最後の"変更された型"のステップを削除する。

  5. 中央の任意のセルを選択しCtrl+aで全列を選択し、[変換]-[データ型の検出]。型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい方が設定される。【注意】原則としてany型(ABC123)を残さないこと。残すと例えば数字の1と文字列の1が異なるものとして処理される。

同様の手順で、他のクロス表の'売上原価予算'、'売上原価実績'、'経費予算'、'経費実績'、'その他予算'、'その他実績'を取込み・整形・結合します。

※ もし列のピボットでエラーが出る場合は、ピボット解除の前に(=クロス表の状態)nullを0に置換してください。

■ 売上実績(リスト)

  1. 左の'フォルダ'クエリを右クリックし[参照]、右の名前を'売上実績'に変更。 ⇒ '売上実績'クエリが生成される。

  2. [Name]列の▼-[テキストフィルター>]-[指定の値を含む]-[詳細表示]で次のように入力し[OK]。 ⇒ 売上実績ファイルに絞り込む。

    および/または 列 演算子 値 解説
      Name 指定の値を含む 売上実績 売上実績ファイルに絞り込む
    および Extension 指定の値に等しい .xlsx Excelブックに絞り込む
  3. [Content]列を右クリックし[他の列の削除]。 ⇒ 内容以外の列が削除される。

  4. [Content]列の↓↓をクリックし、データがあるシートを選択し[OK]。 ⇒ 1つのファイルを処理するためのヘルパークエリが別に生成され、複数のファイルが結合される。

  5. 右に生成された'サンプルファイル'、'ファイルの変換'、サンプル ファイルの変換'クエリの名前の後ろに"売上実績"を追加する。 ⇒ この作業は必須では無いが、名前で何を処理するヘルパークエリかが判別できるようになる。次に1ファイルを整形をするヘルパークエリを編集する。

  6. 'サンプル ファイルの変換売上実績'クエリを選択し、右の"ソース"と"ナビゲーション"以外のステップを削除し、"ナビゲーション"を選択する。 ⇒ 自動生成された不要なステップが削除される。

  7. [Column7]の▼-[空の削除]。 ⇒ 不要な行が消える。

  8. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。 ⇒ ヘッダが設定される。

  9. yy/mm形式の年月以外の列をCtrlキーを押しながら全て選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。 ⇒ yy/mm列が縦1列に並ぶ。

  10. 集計する金額の列名([売上])をWクリックし、名前を"金額"に変更。 ⇒ 集計する値の列名が他のクエリと同じになる。1ファイルを整形する関数クエリが生成される。次にファイルを結合するクエリを編集する。

  11. 左の"売上実績"クエリを選択し、右の最後の"変更された型"のステップを削除する。

  12. 中央の任意のセルを選択しCtrl+aで全列を選択し、[変換]-[データ型の検出]。型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい方が設定される。

3) 予算の結合

  1. 左の'売上予算'クエリを選択し、[ホーム]-[クエリの追加v]-[クエリを新規クエリとして追加]でクエリを生成し、右の名前を"予算"に変更する。
  2. [3つ以上のテーブル]を選択し、'原価予算'、'経費予算'、'その他予算'をそれぞれ選択して[追加]し、[OK]。 ⇒ 予算の勘定元帳が完成する。(ピボットテーブルの元データ(ファクトテーブル))

同様の手順で'実績'クエリを作成する。

余談 : 本記事ではヘルパークエリを8個作成していますが、シートの表の形や項目が同じであれば、シートを整形するヘルパークエリを手動で作成することで、ヘルパークエリを削減することができます。7.参考の「Power Queryで複数の表を結合する方法(まとめ)」を見てください。

4) 品目の生成

  1. 左の'予算'クエリを右クリックし[参照]で右の名前を"品目"に変更する。
  2. [ホーム]-[クエリの追加v]-[クエリの追加]で[実績]を選択し[OK]。 ⇒ 実績が追加される。
  3. [品目]列を右クリックし[他の列の削除]。 ⇒ 品目以外の列が消える。
  4. [品目]列を右クリックし[重複の削除]。 ⇒ 重複が消える。
  5. [品目]列の▼-[空白の削除]。 ⇒ 空白が消える。(ディメンジョンテーブル)

5) 部門の生成

  1. 左の'予算'クエリを右クリックし[参照]で右の名前を"部門"に変更する。
  2. [ホーム]-[クエリの追加v]-[クエリの追加]で[実績]を選択し[OK]。 ⇒ 実績が追加される。
  3. [部門]列を右クリックし[他の列の削除]。 ⇒ 品目以外の列が消える。
  4. [部門]列を右クリックし[重複の削除]。 ⇒ 重複が消える。
  5. [部門]列の▼-[空白の削除]。 ⇒ 空白が消える。(ディメンジョンテーブル)

余談 : 本例では予算と実績のファクトテーブルを分けているので、両者を関連付けるために'部門'、'品目'ディメンジョンテーブルを使用しているが、予算と実績を1つに結合すれば、これらのディメンジョンテーブルは不要になる。また、部門や品目別の絞り込みをしないのであれば、これらのディメンジョンテーブルは不要である。

6) クエリの保存とデータモデルの追加

  1. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"を選択し[OK]でExcelに戻る。
  2. "クエリと接続"ペインの'予算'クエリを右クリックし、[読み込み先...]で"このデータをデータモデルに追加する"を選択し、[OK]。 ⇒ データモデルに追加される。

同様の手順で'実績'、'品目'、'部門'をデータモデルに追加する。

7) 勘定大項目の取得

  1. 勘定大項目のテーブルの1つのセルを選択し、[データ]-[テーブルまたは範囲から]でPower Queryエディタに取込む。
  2. 型が正しくない列名の左の型アイコンをクリックし、適切な型を選び、[現在のものを置換]。 ⇒ 正しい型が設定される。
  3. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"と"このデータをデータモデルに追加する"を選択し[OK]でExcelに戻る。 ⇒ データモデルに追加される。

同様の手順で、'科目'テーブルをデータモデルに追加する。

8) 日付テーブルの生成

Excelの場合は、Power Query Mで日付テーブルを生成します。(ワークシートで作成し、データモデルに追加しても良いです。)

  1. [データ]-[データの取得v]-[その他のデータソースから]-[空のクエリ]でPower Queryエディタに空のクエリを生成し、右の名前を'日付'に変更します。
  2. [ホーム]-[詳細エディタ]で次のコードを上書きします。
let
Source1 = 予算, // [日付]列を持つクエリ名を設定
Source2 = 実績, // [日付]列を持つクエリ名を設定
    // ── 集計対象期間の決定 ── 年度末日まで ───────────
MinDate = Date.StartOfMonth(List.Min({List.Min(Source1[日付]), List.Min(Source2[日付])})),
MaxDateRaw = List.Max({List.Max(Source1[日付]), List.Max(Source2[日付])}),
FiscalYearEndYear = if Date.Month(MaxDateRaw) >= 4 then Date.Year(MaxDateRaw) + 1 else Date.Year(MaxDateRaw),
MaxDate = #date(FiscalYearEndYear, 3, 31),
    // ── 日単位カレンダーの生成 ──────────────────────
DateList = List.Dates(MinDate, Duration.Days(MaxDate - MinDate) + 1, #duration(1, 0, 0, 0)),
CalendarTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日付"}),
型設定済 = Table.TransformColumnTypes(CalendarTable, {{"日付", type date}}),
    // ── 会計年度(4月始まり)の基準日・年・月を1回だけ算出 ──
// EDATE([@日付], -3) 相当:3ヶ月前にずらすことで
// 会計年度の「年」と「月番号(4月=1~翌3月=12)」を取得
会計基準日追加 = Table.AddColumn(型設定済, "会計基準日", each Date.AddMonths([日付], -3), type date),
会計年追加 = Table.AddColumn(会計基準日追加, "会計年", each Date.Year([会計基準日]), Int64.Type),
会計月追加 = Table.AddColumn(会計年追加, "会計月", each Date.Month([会計基準日]), Int64.Type),
    // ── 表示用列の追加 ──────────────────────────────
    // 年:YEAR([@日付])
列_年 = Table.AddColumn(会計月追加, "年", each Date.Year([日付]), Int64.Type),
    // 月:TEXT([@日付],"m月") ※ゼロ埋めなし
列_月 = Table.AddColumn(列_年, "月", each Text.From(Date.Month([日付])) & "月", type text),
    // 年月:TEXT([@日付],"yy/mm") ※ゼロ埋めあり
列_年月 = Table.AddColumn(列_月, "年月", each
let
yy = Text.PadStart(Text.From(Date.Year([日付]) - 2000), 2, "0"),
mm = Text.PadStart(Text.From(Date.Month([日付])), 2, "0")
in
yy & "/" & mm,
type text),
    // 四半期.:INT((MONTH(x)-1)/3)+1 & "Q" ※年度なし
列_四半期ドット = Table.AddColumn(列_年月, "四半期.", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From(四半期番号) & "Q",
type text),
    // 四半期:(YEAR(x)-2000) & "/" & 四半期番号 & "Q" ※ゼロ埋めなし
列_四半期 = Table.AddColumn(列_四半期ドット, "四半期", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(四半期番号) & "Q",
type text),
    // 半期:(YEAR(x)-2000) & "/" & 半期番号 & "H" ※ゼロ埋めなし
列_半期 = Table.AddColumn(列_四半期, "半期", each
let
半期番号 = Number.IntegerDivide([会計月] - 1, 6) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(半期番号) & "H",
type text),
    // 期:IF(MONTH(x)<7,"上期","下期") ※年度なし
列_期 = Table.AddColumn(列_半期, "期", each
if [会計月] < 7 then "上期" else "下期",
type text),
    // 年度:(YEAR(x)-2000) & "年度" ※ゼロ埋めなし
列_年度 = Table.AddColumn(列_期, "年度", each
Text.From([会計年] - 2000) & "年度",
type text),
    // 年度.:YEAR(x) ※西暦そのまま、年度なし表示との組み合わせ用
列_年度ドット = Table.AddColumn(列_年度, "年度.", each [会計年], Int64.Type),
    // 内部計算用の一時列を削除し、ご指定の列順に並べ替え
不要列削除済 = Table.RemoveColumns(列_年度ドット, {"会計基準日", "会計年", "会計月"}),
最終結果 = Table.ReorderColumns(不要列削除済,
{"日付", "年月", "四半期", "半期", "年度", "年度.", "四半期.", "期", "月", "年"})
in
最終結果
 

補足 : このクエリは'予算'クエリと'実績'クエリの日付の範囲の日付テーブルを生成します。年度始まりを4月としています。最初のSource1とSource2にクエリ名を設定します。

  1. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

Power BIの日付テーブル

Power Query Mでも生成できますが、DAXでテーブルを作成することもできます。

日付 =
VAR FiscalMonthEnd = 3 -- 3月決算(4月始まり)の場合は3を指定
VAR MinDate = MIN( MIN('予算'[日付]), MIN('実績'[日付]) )
VAR MaxDate = MAX( MAX('予算'[日付]), MAX('実績'[日付]) )
VAR StartDate = DATE(YEAR(MinDate), MONTH(MinDate), 1)
VAR EndDate = EOMONTH(MaxDate, 0)
VAR BaseCalendar = CALENDAR(StartDate, EndDate)
RETURN
ADDCOLUMNS(
BaseCalendar,
"年", YEAR([Date]),
"月", MONTH([Date]),
"月名", FORMAT([Date], "MM月"),
"四半期", "Q" & FORMAT(EDATE([Date], -FiscalMonthEnd), "Q"),
"曜日", FORMAT([Date], "aaaa"),
"年度", IF(MONTH([Date]) > FiscalMonthEnd, YEAR([Date]), YEAR([Date]) - 1),
"会計月番号", IF(MONTH([Date]) > FiscalMonthEnd, MONTH([Date]) - FiscalMonthEnd, MONTH([Date]) + 12 - FiscalMonthEnd)
)

9) リレーションの作成

次のいずれかの方法でリレーションを設定します。
a) [Power Pivot]-[管理]-[表示]-[ダイアグラムビュー]。
b) [データ]-[データモデルv(緑アイコン)]-[データモデルの管理]-[ホーム]-[表示]-[ダイアグラムビュー]。
c) [データ]-[データモデルv(緑アイコン)]-[リレーションシップ]-[編集]。

ファクトテーブル *--<--1 ディメンジョンテーブル(関連)
'予算'[日付] *--<--1 '日付'[日付]
'実績'[日付] *--<--1 '日付'[日付]
'予算'[勘定科目コード] *--<--1 '科目'[勘定科目コード]
'実績'[勘定科目コード] *--<--1 '科目'[勘定科目コード]
'予算'[品目] *--<--1 '品目'[品目]
'実績'[品目] *--<--1 '品目'[品目]
'予算'[部門] *--<--1 '部門'[部門]
'実績'[部門] *--<--1 '部門'[部門]

ダイアグラムビューでは、(多)から1へ項目をドラッグする。
リレーションシップでは、上段が
(多)で下段の関連が1になるようにテーブルと項目を設定する。

参考 : このデータ構造はスタースキーマの一種で、コンステレーションスキーマ(Constellation Schema)と呼ばれるらしいです。 By Gemini

10) ピボットテーブルの生成

[挿入]-[ピボットテーブルv]-[データモデルから]で、ピボットテーブルを生成します。

11) メジャーの作成

  1. 次のいずれかの方法でメジャーを作成します。
    a) ① ピボットテーブルを選択し、右に"ピボットテーブルのフィールド"を表示。② メジャーを作成するテーブル('予算'または'実績)を右クリックし[メジャーの追加]。
    b) [Power Pivot]-[管理]でメジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。
    c) [データ]-[データモデル(緑アイコン)v]-[データモデルの管理]で、メジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。

'予算'に作るメジャー

M売上予算:=CALCULATE(
SUM('予算'[金額]),
'科目'[勘定大項目] = "売上"
)

解説 : ピボットテーブルに展開する'勘定大項目'と'科目'や'予算'にリレーションがありません。よって、SUM('予算'[金額])だけでは'勘定大項目'のフィルタコンテキストが掛かりません。そこで、勘定大項目別のメジャーを作り、CALCULATE関数で勘定大項目に該当する'予算'[金額]を合計を計算します。
'科目'1-▶-*'予算'のリレーションはあるので、'科目'で'予算'をフィルターすることができます。
このメジャーはピボットテーブルには表示せず、M予算メジャーの中から参照します。
以下のメジャーも同じです。
M売上原価予算:=CALCULATE(
SUM('予算'[金額]),
'科目'[勘定大項目] = "売上原価"
)

M販管予算:=CALCULATE(
SUM('予算'[金額]),
'科目'[勘定大項目] = "販売費及び一般管理費"
)

M営業外収益予算:=CALCULATE(
SUM('予算'[金額]),
'科目'[勘定大項目] = "営業外収益"
)

M営業外費用予算:=CALCULATE(
SUM('予算'[金額]),
'科目'[勘定大項目] = "営業外費用"
)

M予算:=SWITCH(
MAX('勘定大項目'[勘定大項目]),
"売上", [M売上予算],
"売上原価", [M売上原価予算],
"売上総利益", [M売上予算] - [M売上原価予算],
"販売費及び一般管理費", [M販管予算],
"営業利益", [M売上予算] - [M売上原価予算] - [M販管予算],
"営業外収益", [M営業外収益予算],
"営業外費用", [M営業外費用予算],
"経常利益", [M売上予算] - [M売上原価予算] - [M販管予算] + [M営業外収益予算] - [M営業外費用予算],
BLANK()
)

解説 : ピボットテーブルのΣ値にこのメジャーを表示します。ピボットテーブルの行に配置した'勘定大項目'[勘定大項目]により、返すメジャーを切替えます。各損益は、この式の中で計算して返します。

参考 : 利益率等も計算して表示できますが、金額と書式を自動で分けることができません。数量や人数も同様です。なので、損益計算書にそのような値を表示をしたい場合は、GETPIVOTDATAでワークシートに損益計算書を作成した方が良いと思います。

'実績'に作るメジャー

M売上:=CALCULATE(
SUM('実績'[金額]),
'科目'[勘定大項目] = "売上"
)

M売上原価:=CALCULATE(
SUM('実績'[金額]),
'科目'[勘定大項目] = "売上原価"
)

M販管:=CALCULATE(
SUM('実績'[金額]),
'科目'[勘定大項目] = "販売費及び一般管理費"
)

M営業外収益:=CALCULATE(
SUM('実績'[金額]),
'科目'[勘定大項目] = "営業外収益"
)

M営業外費用:=CALCULATE(
SUM('実績'[金額]),
'科目'[勘定大項目] = "営業外費用"
)

M実績:=SWITCH(
MAX('勘定大項目'[勘定大項目]),
"売上", [M売上],
"売上原価", [M売上原価],
"売上総利益", [M売上] - [M売上原価],
"販売費及び一般管理費", [M販管],
"営業利益", [M売上] - [M売上原価] - [M販管],
"営業外収益", [M営業外収益],
"営業外費用", [M営業外費用],
"経常利益", [M売上] - [M売上原価] - [M販管] + [M営業外収益] - [M営業外費用],
BLANK()
)

M予実差:=[M実績] - [M予算]

12) ピボットテーブルの設定

  1. 次のように項目を設定します。
  • 列 : '日付'[四半期.]、'日付'[月]、Σ値。
  • 行 : '勘定大項目'[勘定大項目]、'科目'[勘定科目名称]。
  • Σ値 : [M実績]、[M予算]、[M予実差]。
  1. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]で、"更新時に列幅を調整する"のチェックを外す。
  2. [ピボットテーブル分析]-[オプション]-[表示]で、"データのないアイテムを行/列に表示する"のチェックを外す。
  3. [デザイン]-[レポートのレイアウト]-[アウトライン形式で表示]。(表形式だと小計が下に表示される)
  4. [デザイン]-[総計v]-[行と列の集計を行わない]。
  5. 表の"勘定大項目"と"四半期."を右クリックし、["xxx"の小計]をクリックして✓マークを付ける。
  6. 売上総利益、営業利益、経常利益などの利益の行を折りたたむ。
  7. [デザイン]-[ピボットテーブルスタイル]で、ベースとするスタイルを右クリックし[複製]。ユーザー設定のスタイルを右クリックし、[変更]でスタイルを変更。
  • 最初の列 : 右罫線
  • 見出し行 : 下罫線; 網掛け
  • 小計列 1 : 網掛け
  • 小計行 1 : 上下罫線
  • 列小見出し 1 : 上罫線(太)
  • 列小見出し 2 : 上罫線(細)
  • 列小見出し 3 : 上罫線(細)
  • 行小見出し 1 : 下罫線; 網掛け

参考 : ピボットテーブルのスタイルの自由度は低いです。手動でセルの書式設定しても、更新で書式がクリアされる場合があります。自由に書式設定したい場合は、GETPIVOTDATAを使用して別のワークシート表で書式設定したほうが良いです。

5. 分析

Excel

ピボットテーブルの行に[品目]や[部門]を配置すると、品目別や部門別の予実差を確認することができます。フィルターやスライサーを活用して絞り込むこともできます。

Power BI

  1. 分解ツリーを配置し、次のように項目を設定します。
  • 分析 : [M予実差]
  • 説明 : '科目'[勘定科目名称]、'品目'[品目]または'部門'[部門]
  1. マトリックスで分析をしたいM予実差の値をクリックをし、M予実差の右の+をクリックすると"勘定科目名称"と値の内訳が展開されます。

6. サンプル

ダウンロード - 260815pl.zip

C:\Users\Public\Documents\260815pl に展開した各ファイルを置いてください。

  • PL集計.xlsx : B. 本記事の損益集計ファイル(ファイルが大きいのはPower BIの画像を貼っているためです。)
  • PL集計.pbix : B. 本記事の損益集計のPower BI Desktop版
  • PLqpws.xlsx : A. 本記事のデータをPower Pivotで集計し、ワークシート式で損益を計算したもの(おすすめ)
  • #PL集計.xlsx : C. 本記事のデータをQueryで損益計算したもの
  • 売上予算.xlsx、売上実績.xlsx、原価予算.xlsx、原価実績.xlsx、経費予算営業.xlsx、経費実績営業.xlsx、経費予算調達.xlsx、経費実績調達.xlsx、その他予算.xlsx、その他実績.xlsx : 上記損益集計に使用する勘定元データ
  • PLbi.xlsx : B. Power BIのYouTubeの損益動画のExcel版。損益計算のメジャーだけを知りたい場合は、これを見てください。

7. 参考

8. その他

  1. 速度
    正確に測定したわけではありませんが、①Power BI、②Excelメジャーで損益計算、③Excel Power Queryで損益計算、の順で速度が速いようです。Power BIは、更新時のCPU利用率が高く、マルチコアのCPUの利用効率が高いようです。DAXはExcelよりPower BIの方が新しいので、性能が良いのだと思われます。

| | コメント (0)

Excel Power Pivot 生産実績表と不良実績表から不良率の推移表を作成

1. 前置き

生産実績表と不良実績表をExcel Power Queryで取得し、Power Pivotで不良率の推移表を作成する方法を紹介します。

不良率と改善効果を見るための不良率の前月差の式は、次の通りです。

不良率 = 不良数 ÷ 生産数
不良率の前月差 = 当月の不良率 - 先月の不良率

ピボットテーブルで、任意または最新の不良率の高い順に不良項目を並び替える方法も紹介します。

注釈 : 式の一部に、AI(Claude、Copilot、Gemini、ChatGPT)を利用しました。

2. 入力

ここでは、生産実績表と不良実績表が各Excelブックの1つのシートにリスト形式のテーブル化されていない表を例に説明します。
これ以外の形式でも対応できます。その場合は、10. 参考のリンクを見てください。複数のリストでもクロス表でも、Power Queryで結合/整形処理することができます。

1) 生産実績表

◢ A B C
1 生産実績    
2 日付 製品 投入数
3 2026/04/02 製品A 100
4 2026/04/17 製品B 50
5 2026/05/02 製品A 80
6 2026/05/17 製品B 40
7 2026/06/02 製品A 100
8 2026/06/17 製品B 50

2) 不良実績表

◢ A B C D
1 不良実績      
2 日付 製品 不良項目 不良数
3 2026/04/02 製品A 作業不良 4
4 2026/04/02 製品A 部品不良 2
5 2026/04/02 製品A 加工不良 2
6 2026/04/17 製品B その他 1
7 2026/04/17 製品B 作業不良 4
8 2026/04/17 製品B 部品不良 3
9 2026/05/02 製品A 加工不良 1
10 2026/05/02 製品A その他 0
11 2026/05/02 製品A 作業不良 0
12 2026/05/17 製品B 部品不良 1
13 2026/05/17 製品B 加工不良 2
14 2026/05/17 製品B その他 1
15 2026/06/02 製品A 作業不良 1
16 2026/06/02 製品A 部品不良 2
17 2026/06/02 製品A 加工不良 1
18 2026/06/17 製品B その他 0
19 2026/06/17 製品B 作業不良 1
20 2026/06/17 製品B 部品不良 1

3. 出力

ピボットテーブルに出力します。ワークシート式を使用しないことにより、式にセルアドレスを使用せず、式の数が減り、セルアドレス間違いが減ります。

不良項目別不良率推移(不良項目を任意の列の不良率で並び替え)

不良項目 値 26年度 26年度 集計
1Q 1Q 集計
4月 5月 6月
部品不良 合計 / 投入数 150 120 150 420 420
合計 / 不良数 5 1 3 9 9
M不良率 3.3% 0.8% 2.0% 2.1% 2.1%
M不良率前月差 -- -2.5% +1.2% -- --
作業不良 合計 / 投入数 150 120 150 420 420
合計 / 不良数 8 0 2 10 10
M不良率 5.3% 0.0% 1.3% 2.4% 2.4%
M不良率前月差 -- -5.3% +1.3% -- --
加工不良 合計 / 投入数 150 120 150 420 420
合計 / 不良数 2 3 1 6 6
M不良率 1.3% 2.5% 0.7% 1.4% 1.4%
M不良率前月差 -- +1.2% -1.8% -- --
その他 合計 / 投入数 150 120 150 420 420
合計 / 不良数 1 1 0 2 2
M不良率 0.7% 0.8% 0.0% 0.5% 0.5%
M不良率前月差 -- +0.2% -0.8% -- --
全体の 合計 / 投入数 150 120 150 420 420
全体の 合計 / 不良数 16 5 6 27 27
全体の M不良率 10.7% 4.2% 4.0% 6.4% 6.4%
全体の M不良率前月差 -- -6.5% -0.2% -- --

製品別不良率推移

製品 値 26年度 26年度 集計
1Q 1Q 集計
4月 5月 6月
製品A 合計 / 投入数 100 80 100 280 280
合計 / 不良数 8 1 4 13 13
M不良率 8.0% 1.3% 4.0% 4.6% 4.6%
M不良率前月差 -- -6.8% +2.8% -- --
製品B 合計 / 投入数 50 40 50 140 140
合計 / 不良数 8 4 2 14 14
M不良率 16.0% 10.0% 4.0% 10.0% 10.0%
M不良率前月差 -- -6.0% -6.0% -- --
全体の 合計 / 投入数 150 120 150 420 420
全体の 合計 / 不良数 16 5 6 27 27
全体の M不良率 10.7% 4.2% 4.0% 6.4% 6.4%
全体の M不良率前月差 -- -6.5% -0.2% -- --

不良項目別不良率推移(最新月の不良率順位で自動並び替え)

C最新不良順位 不良項目 値 26年度 26年度 集計
1Q 1Q 集計
4月 5月 6月
1 部品不良 合計 / 不良数 5 1 3 9 9
M不良率 3.3% 0.8% 2.0% 2.1% 2.1%
M不良率前月差 -- -2.5% +1.2% -- --
2 作業不良 合計 / 不良数 8 0 2 10 10
M不良率 5.3% 0.0% 1.3% 2.4% 2.4%
M不良率前月差 -- -5.3% +1.3% -- --
3 加工不良 合計 / 不良数 2 3 1 6 6
M不良率 1.3% 2.5% 0.7% 1.4% 1.4%
M不良率前月差 -- +1.2% -1.8% -- --
4 その他 合計 / 不良数 1 1 0 2 2
M不良率 0.7% 0.8% 0.0% 0.5% 0.5%
M不良率前月差 -- +0.2% -0.8% -- --
全体の 合計 / 不良数 16 5 6 27 27
全体の M不良率 10.7% 4.2% 4.0% 6.4% 6.4%
全体の M不良率前月差 -- -6.5% -0.2% -- --

4. 手順

1) 生産実績表と不良実績表の取得

  1. 不良率を算出するための集計Excelブックを作成し、開きます。

  2. [データ]-[データの取得v]-[ファイルから>]-[Excelブックから]で不良実績表のブックを選択し、[インポート]で不良実績表のシートを選択し、[データの変換]でPower Queryエディタに取込みます。

  3. 右の名前を'不良実績'に変更します。

  4. 右の"適用したステップ"の"ソース"と"ナビゲーション"の次のステップを右クリックし、[最後まで削除]。 ⇒ 自動生成された不要なステップが削除される。

  5. [Column2]列の▼で[null]のチェックを外し[OK]。 ⇒ [Column2]列の不要な行が削除される。

  6. [変換]-[1行目をヘッダとして使用v]-[1行目をヘッダとして使用]。 ⇒ 1行目がヘッダになる。

  7. 自動的に"変更された型"のステップが追加されるので、適切でない型アイコン(列名の左側)をクリックし、適切な型を選択し、[現在のものを置換]。 ⇒ データ型が設定される。

  8. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

  9. 不良実績表と同様の手順で生産実績表を取得し、データモデルに追加します。クエリの名前は、'生産実績'にします。

参考 : クエリの名前がデータモデルのテーブル名になります。

2) 製品テーブルの作成

不良実績と生産実績を関連付ける、製品テーブルを作成します。

  1. 右に"クエリと接続"が表示されていなければ、[データ]-[クエリと接続]をクリックして"クエリと接続"ペインを右に表示し、適当なクエリを右クリックし[編集]で、Power Queryエディタを開きます。
  2. 左の'生産実績'を右クリックし、[参照]で新しいクエリを作成し、名前を'製品'に変更します。
  3. [製品]列を右クリックし、[その他の列の削除]。 ⇒ [製品]以外の列が削除される。
  4. [製品]列を右クリックし、[重複の削除]。 ⇒ 重複のない製品リストになる。
  5. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

3) 日付テーブルの作成

Power Pivotでは、DAX式を簡単にするため、日付テーブルを使うことをお勧めします。Excelのワークシート式で作る方法[*1]が理解しやすいですが、ここでは不良実績表と生産実績表に連動した日付を生成するPower Query Mのコードで作成します。コードの意味はコメントを見てください。Power Query Mの仕様は、Googleで調べてください。会計基準日追加のステップからは、Power Queryエディタのカスタム列の追加でも作成できます。

  1. [データ]-[データの取得v]-[その他のデータソースから]-[空のクエリ]でPower Queryエディタに空のクエリを生成し、右の名前を'日付'に変更します。
  2. [ホーム]-[詳細エディタ]で次のコードを上書きします。
let
Source1 = 不良実績, // [日付]列を持つクエリ名を設定
Source2 = 生産実績, // [日付]列を持つクエリ名を設定
    // ── 集計対象期間の決定 ── 年度末日まで ───────────
  MinDate = Date.StartOfMonth(List.Min({List.Min(Source1[日付]), List.Min(Source2[日付])})),
// MaxDate = Date.EndOfMonth(List.Max({List.Max(Source1[日付]), List.Max(Source2[日付])})), // 年度末日まで表示しない場合の式
MaxDateRaw = List.Max({List.Max(Source1[日付]), List.Max(Source2[日付])}),
FiscalYearEndYear = if Date.Month(MaxDateRaw) >= 4 then Date.Year(MaxDateRaw) + 1 else Date.Year(MaxDateRaw),
MaxDate = #date(FiscalYearEndYear, 3, 31),
    // ── 日単位カレンダーの生成 ──────────────────────
DateList = List.Dates(MinDate, Duration.Days(MaxDate - MinDate) + 1, #duration(1, 0, 0, 0)),
CalendarTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日付"}),
型設定済 = Table.TransformColumnTypes(CalendarTable, {{"日付", type date}}),
    // ── 会計年度(4月始まり)の基準日・年・月を1回だけ算出 ──
// EDATE([@日付], -3) 相当:3ヶ月前にずらすことで
// 会計年度の「年」と「月番号(4月=1~翌3月=12)」を取得
会計基準日追加 = Table.AddColumn(型設定済, "会計基準日", each Date.AddMonths([日付], -3), type date),
会計年追加 = Table.AddColumn(会計基準日追加, "会計年", each Date.Year([会計基準日]), Int64.Type),
会計月追加 = Table.AddColumn(会計年追加, "会計月", each Date.Month([会計基準日]), Int64.Type),
    // ── 表示用列の追加 ──────────────────────────────
    // 年:YEAR([@日付])
列_年 = Table.AddColumn(会計月追加, "年", each Date.Year([日付]), Int64.Type),
    // 月:TEXT([@日付],"m月") ※ゼロ埋めなし
列_月 = Table.AddColumn(列_年, "月", each Text.From(Date.Month([日付])) & "月", type text),
    // 年月:TEXT([@日付],"yy/mm") ※ゼロ埋めあり
列_年月 = Table.AddColumn(列_月, "年月", each
let
yy = Text.PadStart(Text.From(Date.Year([日付]) - 2000), 2, "0"),
mm = Text.PadStart(Text.From(Date.Month([日付])), 2, "0")
in
yy & "/" & mm,
type text),
    // 四半期.:INT((MONTH(x)-1)/3)+1 & "Q" ※年度なし
列_四半期ドット = Table.AddColumn(列_年月, "四半期.", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From(四半期番号) & "Q",
type text),
    // 四半期:(YEAR(x)-2000) & "/" & 四半期番号 & "Q" ※ゼロ埋めなし
列_四半期 = Table.AddColumn(列_四半期ドット, "四半期", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(四半期番号) & "Q",
type text),
    // 半期:(YEAR(x)-2000) & "/" & 半期番号 & "H" ※ゼロ埋めなし
列_半期 = Table.AddColumn(列_四半期, "半期", each
let
半期番号 = Number.IntegerDivide([会計月] - 1, 6) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(半期番号) & "H",
type text),
    // 期:IF(MONTH(x)<7,"上期","下期") ※年度なし
列_期 = Table.AddColumn(列_半期, "期", each
if [会計月] < 7 then "上期" else "下期",
type text),
    // 年度:(YEAR(x)-2000) & "年度" ※ゼロ埋めなし
列_年度 = Table.AddColumn(列_期, "年度", each
Text.From([会計年] - 2000) & "年度",
type text),
    // 年度.:YEAR(x) ※西暦そのまま、年度なし表示との組み合わせ用
列_年度ドット = Table.AddColumn(列_年度, "年度.", each [会計年], Int64.Type),

// 内部計算用の一時列を削除し、ご指定の列順に並べ替え
不要列削除済 = Table.RemoveColumns(列_年度ドット, {"会計基準日", "会計年", "会計月"}),
最終結果 = Table.ReorderColumns(不要列削除済,
{"日付", "年月", "四半期", "半期", "年度", "年度.", "四半期.", "期", "月", "年"})
in
最終結果

補足 : このクエリは'不良実績'クエリと'生産実績'クエリの日付の範囲の日付テーブルを生成します。年度始まりを4月としています。最初のSource1とSource2にクエリ名を設定しています。

  1. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

参考 : 日付テーブルは、重複しない連続した日付を持つディメンジョンテーブルです。Power PivotやPower BIで日付テーブルを用いると、DAXのタイムインテリジェンス関数を使うことができます。

[*1] : Excelのワークシートで日付テーブルを作成する方法は、次の記事を見てください。

4) リレーションの作成

次のいずれかの方法でリレーションを設定します。

a) [Power Pivot]-[管理]-[表示]-[ダイアグラムビュー]。
b) [データ]-[データモデルv(緑アイコン)]-[データモデルの管理]-[ホーム]-[表示]-[ダイアグラムビュー]。
c) [データ]-[データモデルv(緑アイコン)]-[リレーションシップ]-[編集]。

リレーションの項目と方向('テーブル'[項目])

ファクトテーブル *--<--1 ディメンジョンテーブル(関連)
'不良実績'[日付] *--<--1 '日付'[日付]
'生産実績'[日付] *--<--1 '日付'[日付]
'不良実績'[製品] *--<--1 '製品'[製品]
'生産実績'[製品] *--<--1 '製品'[製品]

リレーションを設定する手順

ダイアグラムビューでは、*(多)から1へ項目をドラッグします。
リレーションシップでは、上段が*(多)で下段の関連が1になるようにテーブルと項目を設定します。

5) ピボットテーブルの生成

[挿入]-[ピボットテーブルv]-[データモデルから]で、ピボットテーブルを生成します。

6) メジャーの作成

  1. 次のいずれかの方法でメジャーを作成します。
    a) ① ピボットテーブルを選択し、右に"ピボットテーブルのフィールド"を表示。② メジャーを作成するテーブル('予算'または'実績)を右クリックし[メジャーの追加]。
    b) [Power Pivot]-[管理]でメジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。
    c) [データ]-[データモデル(緑アイコン)v]-[データモデルの管理]で、メジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。

生産実績に作成するメジャー

M投入数前月:=CALCULATE(
SUM('生産実績'[投入数]),
PREVIOUSMONTH('日付'[日付])
)

解説 : PREVIOUSMONTH('日付'[日付])で'日付'を前月の範囲にし、SUM('生産実績'[投入数])で投入数を合計する。
前年同期にする場合は、SAMEPERIODLASTYEAR()を使います。この関数はコンテキストに期間が従うので、月でも四半期でも年でも使えます。

不良実績に作成するメジャー

M不良率:=DIVIDE(SUM('不良実績'[不良数]), SUM('生産実績'[投入数]))

解説 : 不良率 = 不良数 ÷ 投入数 です。
M不良数前月:=CALCULATE(
SUM('不良実績'[不良数]),
PREVIOUSMONTH('日付'[日付])
)

解説 : M投入数前月と同じ計算の仕組みです。

 

M不良率前月:=DIVIDE([M不良数前月], [M投入数前月])

解説 : 不良率 = 不良数 ÷ 投入数 です。

 

M不良率前月差簡単:=[M不良率] - [M不良率前月]

解説 : 対前月不良率差 = 当月の不良率 - 前月の不良率 です。この式では、前月の不良率が無い最初の月でも、当月の不良率が無い最新月の翌月でも、無い不良率を0%として計算します。また四半期や年度などにもその期の前の1ヶ月間に対する差が表示されます。本記事では、これらの無効な値を表示しない、次のメジャーを使用しています。

 

M不良率前月差:=VAR MinProdDate = EOMONTH(CALCULATE( MIN('生産実績'[日付]), ALL('生産実績') ), 0)    // 生産実績の最初の月末日
VAR MaxProdDate = CALCULATE( MAX('生産実績'[日付]), ALL('生産実績') ) // 生産実績の最後の日
VAR CurMinDate = MIN('日付'[日付]) // コンテキストの始めの日
VAR CurMaxDate = MAX('日付'[日付]) // コンテキストの最後の日
RETURN
SWITCH(
TRUE(),
CurMaxDate <= MinProdDate, "--", // 初月(前月が存在しない月) → "--"
CurMinDate > MaxProdDate, BLANK(), // データ期間外(初月以外) → BLANK()
NOT ISFILTERED('日付'[月]), "--", // 単月でない(年度・四半期など) → "--"
[M不良率] - [M不良率前月] // 通常の前月差
)

解説 : 前月の不良率が無い最初の月と、当月の不良率が無い最新月の翌月と、単月ではない合計列の不良率の差を計算しない式です。生産実績の最初の月末日と最後の日と、現在のコンテキストの最初と最後の日を各VARで変数に格納し、それをSWITCH関数の条件で判別して、処理を分けています。

参考 : 四半期は前四半期差、半期は前期差、年度は前年度差にすることもできます。詳しくは、次の記事を参考にしてください。

余談 : 同じ式で、日、月、四半期、半期、年度の平均不良率を算出できます。メジャーはワークシート式に比べて式の数が少なく、パラメータにセルアドレスではなくテーブル名と列名を使用するので、パラメータが何を指しているのかが分かりやすく、可読性が良いです。

7) ピボットテーブルの設定

  1. 次のように項目を設定します。
  • 列 : '日付'[年度]、'日付'[四半期.]、'日付'[月]
  • 行 : '不良実績'[不良項目]、Σ値
  • Σ値 : '生産実績'[投入数]、'不良実績'[不良数]、[M不良率]、[M不良率前月差]
  1. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]で、"更新時に列幅を調整する"のチェックを外す。
  2. [ピボットテーブル分析]-[オプション]-[表示]で、"データのないアイテムを行/列に表示する"のチェックを外す。(これをチェックする場合は、フィルターやスライサーで表示しないディメンジョン項目の値の選択を解除する。)
  3. [デザイン]-[レポートのレイアウト]-[表形式で表示]。
  4. [デザイン]-[総計v]-[列のみ集計を行う]。
  5. 小計を表示する列項目を右クリックし、["xxx"の小計]をクリックして✓マークを付ける。(四半期.、年度など)
  6. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]で、レイアウトの"セルとラベルを結合して中央揃えにする"をチェック。
  7. [デザイン]-[ピボットテーブルスタイル]で、ベースとするスタイルを右クリックし[複製]。ユーザー設定のスタイルを右クリックし、[変更]でスタイルを変更。
  • 最初の列 : 右罫線
  • 見出し行 : 下罫線; 網掛け
  • 小計列 1 : 右罫線(太); 網掛け
  • 小計列 2 : 右罫線(細); 網掛け
  • 列小見出し 1 : 上罫線(太)
  • 列小見出し 2 : 上罫線(細)
  • 列小見出し 3 : 上罫線(細)
  • 総計行 : 上罫線(細); 網掛け
  1. 上記ピボットテーブルをコピーし、次のように項目を設定します。
  • 列 : '日付'[年度]、'日付'[四半期.]、'日付'[月]
  • 行 : '製品'[製品]、Σ値
  • Σ値 : '生産実績'[投入数]、'不良実績'[不良数]、[M不良率]、[M不良率前月差]

参考 : ピボットテーブルの設定は、データモデルに影響しないので、ピボットテーブルをコピーして別の設定をすることが可能です。一方テーブルは、データモデルそのものなので、コピーして別の設定にすることができません。

8-1) 不良率の高い不良項目の順に並び替え(半自動)

  1. 不良項目別不良率推移のピボットテーブルの不良項目の[▼]-[その他の並べ替えオプション...]で"降順"を選択し、[M不良率]を選択。
  2. [その他のオプション]で並べ替えで並び替えのキーに使用する列の[M不良率]の最初のセルを選択し[OK]。

260807defect1

8-2) 最新月の不良率の高い不良項目の順に並び替え(自動)

最新月の不良率の順位(降順)を'不良実績'テーブルに「計算列」で追加し、それをピボットテーブルの'不良実績'[不良項目]の上に配置します。

  1. [Power Pivot]-[管理]-'不良実績'で[列の追加]をWクリックし、列名を[M最新不良率順位]に変更する。
  2. 数式バーに次のDAX式を入力し[✓]をクリックする。
=
// ① '不良実績'テーブル全体(現在行のフィルタを無視)から最新の日付を取得
// ALLで計算列自身の行コンテキストによるコンテキスト変移を解除している
VAR vLatestDate =
CALCULATE ( MAX ( '不良実績'[日付] ), ALL ( '不良実績' ) )
// ② ①で求めた最新日付が、'日付'テーブルの「年月」列で何月に該当するかを取得
VAR vLatestYM =
LOOKUPVALUE ( '日付'[年月], '日付'[日付], vLatestDate )
// ③ 順位付けの母集団となる「不良項目」の一覧(重複なし、フィルタなし)を取得
VAR vDefectItems =
ALL ( '不良実績'[不良項目] )
RETURN
// ④ vDefectItemsの各不良項目を1つずつイテレートしながら、
// それぞれの不良率を計算し、その値で降順に順位付けする
RANKX (
vDefectItems,
        // --- ここから、RANKXが1不良項目ごとに評価する式 ---
        // イテレート中の対象不良項目(RANKXの行コンテキスト)を変数に保持
VAR vCurrentItem = '不良実績'[不良項目]
        // 最新年月(vLatestYM)かつ対象不良項目(vCurrentItem)に絞った不良数合計
// ALLで、外側(計算列)の行コンテキストによるコンテキスト変移を解除
VAR vDefectQty =
CALCULATE (
SUM ( '不良実績'[不良数] ),
ALL ( '不良実績' ),
'不良実績'[不良項目] = vCurrentItem,
'日付'[年月] = vLatestYM
)
        // 最新年月(vLatestYM)における投入数合計(製品・不良項目は問わない全体)
VAR vInputQty =
CALCULATE (
SUM ( '生産実績'[投入数] ),
ALL ( '生産実績' ),
'日付'[年月] = vLatestYM
)
        // 不良率 = 不良数合計 ÷ 投入数合計(0除算はDIVIDEでブランクを返す)
RETURN
DIVIDE ( vDefectQty, vInputQty ),
        // --- ここまでがRANKXの評価式(第2引数は省略=現在行の不良率を評価) ---
        ,        // 第3引数(並び順の詳細指定)は省略
DESC // 不良率が大きいほど順位が小さい数字(1位)になるよう降順で順位付け
)
  1. ピボットテーブルのフィールドで'不良実績'[C最新不良率順位]を行の'不良実績'[不良項目]の上に配置します。

参考 : 計算列もDAX式で記述します。計算列ではピボットテーブルのフィルターコンテキストは掛かりません。直接式に書かれた列名とコンテキストを変更する関数には、計算列の行コンテキストが掛かります。コンテキストを変更しない関数の中の引数は、コンテキストが掛かりません。

補足 : 計算列に順位を追加すると、ピボットテーブルの列/行に配置することで、自動的に順位で並び替えされます。一方、メジャーに順位を追加した場合は、Σ値に順位を表示し、それを列/行項目の並び替えのソースに設定します。メジャーだと、重複する順位表示が発生します。なので、計算列に順位を追加するのが良いです。Power Query Mが得意な人は、Power Queryで順位を追加しても良いです。

9. サンプル

ダウンロード - 260807defect.zip

C:\Users\Public\Documents\260807defect に展開した各ファイルを置いてください。

10. 参考

| | コメント (0)

Excel Power Pivot 入庫表と出庫表から在庫を算出

1. 前置き

入庫表と出庫表をExcel Power Queryで取得し、Power Pivotで在庫を算出する方法を紹介します。

在庫は次の式で求めます。

在庫 = 入庫累計 - 出庫累計

本記事は、次の記事をシンプルにしたものです。

関連記事

2. 入力

ここでは、入庫表と出庫表が各Excelブックの1つのシートにリスト形式のテーブル化されていない表を例に説明しますが、これ以外の形式でも対応できます。

1) 入庫表

◢ A B C
1 入庫    
2 日付 品名 入庫数
3 2026/04/01 品A 10
4 2026/04/16 品B 5
5 2026/05/01 品A 11
6 2026/05/16 品B 4
7 2026/05/31 品A 10
8 2026/06/15 品B 5
9 2026/06/30 品A 9

2) 出庫表

◢ A B C
1 出庫    
2 日付 品名 出庫数
3 2026/04/05 品A 8
4 2026/04/20 品B 4
5 2026/05/05 品A 11
6 2026/05/20 品B 4
7 2026/06/04 品A 10
8 2026/06/19 品B 5

3. 出力

ピボットテーブル

品名 値 26年度 26年度 集計
1Q 1Q 集計
4月 5月 6月
品A 合計 / 入庫数 10 21 9 40 40
合計 / 出庫数 8 11 10 29 29
M在庫 2 12 11 11 11
品B 合計 / 入庫数 5 4 5 14 14
合計 / 出庫数 4 4 5 13 13
M在庫 1 1 1 1 1
全体の 合計 / 入庫数 15 25 14 54 54
全体の 合計 / 出庫数 12 15 15 42 42
全体の M在庫 3 13 12 12 12

4. 手順

1) 入庫表と出庫表の取得

  1. 在庫を算出するための在庫Excelブックを作成し、開きます。

  2. [データ]-[データの取得v]-[ファイルから>]-[Excelブックから]で入庫表のブックを選択し、[インポート]で入庫表のシートを選択し、[データの変換]でPower Queryエディタに取込みます。

  3. 右の名前を'入庫'に変更します。

  4. 右の"適用したステップ"の"ソース"と"ナビゲーション"の次のステップを右クリックし、[最後まで削除]。 ⇒ 自動生成された不要なステップが削除される。

  5. [Column2]列の▼で[null]のチェックを外し[OK]。 ⇒ [Column2]列の不要な行が削除される。

  6. [変換]-[1行目をヘッダとして使用v]-[1行目をヘッダとして使用]。 ⇒ 1行目がヘッダになる。

  7. 自動的に"変更された型"のステップが追加されるので、適切でない型アイコン(列名の左側)をクリックし、適切な型を選択し、[現在のものを置換]。 ⇒ データ型が設定される。

  8. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

  9. 入庫表と同様の手順で出庫表を取得しデータモデルに追加します。クエリの名前は'出庫'にします。

参考 : クエリの名前がデータモデルのテーブル名になります。

2) 製品テーブルの作成

入庫テーブルと出庫を関連付ける製品テーブルを作成します。(これをディメンジョンテーブルと呼びます。)

  1. 右に"クエリと接続"が表示されていなければ、[データ]-[クエリと接続]をクリックして"クエリと接続"ペインを右に表示し、適当なクエリを右クリックして[編集]でPower Queryエディタを開きます。
  2. 左の'入庫'を右クリックし[参照]で新しいクエリを作成し、名前を'製品'に変更します。
  3. [品名]列を右クリックし、[その他の列の削除]。 ⇒ [品名]以外の列が削除される。
  4. [品名]列を右クリックし、[重複の削除]。 ⇒ 重複のない品名リストになる。
    参考 : ディメンジョンテーブルは、重複が無いリストにする必要があります。
  5. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加されます。

3) 日付テーブルの作成

Power Pivotでは、DAX式を簡単にするため、日付テーブルを使うことをお勧めします。最も分かりやすい作り方は、Excelのワークシートで作る方法[*1]ですが、ここでは入庫表と出庫表に連動した日付を生成するPower Query Mのコードで作成します。コードの意味はコメントを読んでください。M関数の仕様はGoogleで調べてください。理解できなければ、AI/LLMにこのコードの解説をしてもらってください。AI/LLMにこのコードを短くしてもらうこともできます。

  1. [データ]-[データの取得v]-[その他のデータソースから]-[空のクエリ]でPower Queryエディタに空のクエリを生成し、右の名前を'日付'に変更します。
  2. [ホーム]-[詳細エディタ]で次のコードを上書きします。
let
Source1 = 入庫, // [日付]列を持つクエリ名を設定
Source2 = 出庫, // [日付]列を持つクエリ名を設定

// ── 集計対象期間の決定 ──────────────────────────
  MinDate = Date.StartOfMonth(List.Min({List.Min(Source1[日付]), List.Min(Source2[日付])})),
MaxDate = Date.EndOfMonth(List.Max({List.Max(Source1[日付]), List.Max(Source2[日付])})),
// ── 日単位カレンダーの生成 ──────────────────────

DateList = List.Dates(MinDate, Duration.Days(MaxDate - MinDate) + 1, #duration(1, 0, 0, 0)),
CalendarTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"日付"}),
型設定済 = Table.TransformColumnTypes(CalendarTable, {{"日付", type date}}),
// ── 会計年度(4月始まり)の基準日・年・月を1回だけ算出 ──

// EDATE([@日付], -3) 相当:3ヶ月前にずらすことで
// 会計年度の「年」と「月番号(4月=1~翌3月=12)」を取得
会計基準日追加 = Table.AddColumn(型設定済, "会計基準日", each Date.AddMonths([日付], -3), type date),
会計年追加 = Table.AddColumn(会計基準日追加, "会計年", each Date.Year([会計基準日]), Int64.Type),
会計月追加 = Table.AddColumn(会計年追加, "会計月", each Date.Month([会計基準日]), Int64.Type),
// ── 表示用列の追加 ──────────────────────────────


// 年:YEAR([@日付])

列_年 = Table.AddColumn(会計月追加, "年", each Date.Year([日付]), Int64.Type),

// 月:TEXT([@日付],"m月") ※ゼロ埋めなし

列_月 = Table.AddColumn(列_年, "月", each Text.From(Date.Month([日付])) & "月", type text),

// 年月:TEXT([@日付],"yy/mm") ※ゼロ埋めあり

列_年月 = Table.AddColumn(列_月, "年月", each
let
yy = Text.PadStart(Text.From(Date.Year([日付]) - 2000), 2, "0"),
mm = Text.PadStart(Text.From(Date.Month([日付])), 2, "0")
in
yy & "/" & mm,
type text),

// 四半期.:INT((MONTH(x)-1)/3)+1 & "Q" ※年度なし

列_四半期ドット = Table.AddColumn(列_年月, "四半期.", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From(四半期番号) & "Q",
type text),
    // 四半期:(YEAR(x)-2000) & "/" & 四半期番号 & "Q" ※ゼロ埋めなし
列_四半期 = Table.AddColumn(列_四半期ドット, "四半期", each
let
四半期番号 = Number.IntegerDivide([会計月] - 1, 3) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(四半期番号) & "Q",
type text),

// 半期:(YEAR(x)-2000) & "/" & 半期番号 & "H" ※ゼロ埋めなし

列_半期 = Table.AddColumn(列_四半期, "半期", each
let
半期番号 = Number.IntegerDivide([会計月] - 1, 6) + 1
in
Text.From([会計年] - 2000) & "/" & Text.From(半期番号) & "H",
type text),

// 期:IF(MONTH(x)<7,"上期","下期") ※年度なし

列_期 = Table.AddColumn(列_半期, "期", each
if [会計月] < 7 then "上期" else "下期",
type text),

// 年度:(YEAR(x)-2000) & "年度" ※ゼロ埋めなし

列_年度 = Table.AddColumn(列_期, "年度", each
Text.From([会計年] - 2000) & "年度",
type text),

// 年度.:YEAR(x) ※西暦そのまま、年度なし表示との組み合わせ用

列_年度ドット = Table.AddColumn(列_年度, "年度.", each [会計年], Int64.Type),

// 内部計算用の一時列を削除し、ご指定の列順に並べ替え

不要列削除済 = Table.RemoveColumns(列_年度ドット, {"会計基準日", "会計年", "会計月"}),
最終結果 = Table.ReorderColumns(不要列削除済,
{"日付", "年月", "四半期", "半期", "年度", "年度.", "四半期.", "期", "月", "年"})
in
最終結果

補足 : このクエリは'入庫'クエリと'出庫'クエリの日付の範囲の日付テーブルを生成します。年度始まりを4月としています。最初のSource1とSource2にクエリ名を設定します。

  1. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で、"接続の作成のみ"と"このデータをデータモデルに追加する"を選び[OK]でExcelに戻ります。 ⇒ データモデルに追加される。

参考 : 日付テーブルは、重複しない連続した日付を持つディメンジョンテーブルです。Power PivotやPower BIで日付テーブルを用いると、DAXのタイムインテリジェンス関数を使うことができます。

[*1] : Excelのワークシートで日付テーブルを作成する方法は、次の記事を見てください。

4) リレーションの作成

次のいずれかの方法でリレーションを設定します。

a) [Power Pivot]-[管理]-[表示]-[ダイアグラムビュー]。
b) [データ]-[データモデルv(緑アイコン)]-[データモデルの管理]-[ホーム]-[表示]-[ダイアグラムビュー]。
c) [データ]-[データモデルv(緑アイコン)]-[リレーションシップ]-[編集]。

リレーションの項目と方向('テーブル'[項目])

ファクトテーブル *--<--1 ディメンジョンテーブル(関連)
'入庫'[日付] *--<--1 '日付'[日付]
'出庫'[日付] *--<--1 '日付'[日付]
'入庫'[品名] *--<--1 '製品'[品名]
'出庫'[品名] *--<--1 '製品'[品名]

リレーションを設定する手順

ダイアグラムビューでは、*(多)から1へ項目をドラッグします。
リレーションシップでは、上段が*(多)で下段の関連が1になるようにテーブルと項目を設定します。

5) ピボットテーブルの生成

[挿入]-[ピボットテーブルv]-[データモデルから]でピボットテーブルを生成します。

6) メジャーの作成

  1. 次のいずれかの方法でメジャーを作成します。
    a) ① ピボットテーブルを選択し、右に"ピボットテーブルのフィールド"を表示。② メジャーを作成するテーブル('予算'または'実績)を右クリックし[メジャーの追加]。
    b) [Power Pivot]-[管理]でメジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。
    c) [データ]-[データモデル(緑アイコン)v]-[データモデルの管理]で、メジャーを書くテーブルの下の空白セルを選択。数式バーにメジャーを入力する。

入庫に作成するメジャー

M入庫累計:=CALCULATE(
SUM('入庫'[入庫数]),
FILTER(ALL('日付'), '日付'[日付] <= MAX('日付'[日付]))
)

解説 : ALL('日付')で全日付をFILTERの対象とし、コンテキストの日付(MAX('日付'[日付]))以下の日付にFILTERで絞り込み、SUM('入庫'[入庫数])で合計すると累計になります。MAX()の中はピボットテーブルのフィルタコンテキストが掛かっており、ピボットテーブルの日付を示します。例えば、1Q(第1四半期)であれば、MAX()は7月31日になるので、7月31日の累計が計算されます。

出庫に作成するメジャー

M出庫累計:=CALCULATE(
SUM('出庫'[出庫数]),
FILTER(ALL('日付'), '日付'[日付] <= MAX('日付'[日付]))
)

解説 : M入庫累計と同じ仕組みで累計を求めます。

M在庫:=[M入庫累計] - [M出庫累計]

解説 : 在庫 = 入庫累計 - 出庫累計

参考 : 3つのメジャーだけで、日、月、四半期、半期、年度の期末在庫を算出できます。このようにメジャーはワークシート式に比べて式の数が少なく、パラメータにセルアドレスを使用しないので、パラメータが何を指しているのかが分かりやすく、可読性が良いです。

7) ピボットテーブルの設定

  1. 次のように項目を設定します。
  • 列 : '日付'[年度]、'日付'[四半期.]、'日付'[月]
  • 行 : '製品'[品名]、Σ値
  • Σ値 : '入庫'[入庫数]、'出庫[出庫数]、[M在庫]
  1. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]で"更新時に列幅を調整する"のチェックを外す。
  2. [ピボットテーブル分析]-[オプション]-[表示]で"データのないアイテムを行/列に表示する"のチェックを外す。(これをチェックする場合は、フィルターやスライサーで表示しないディメンジョン項目の値の選択を解除する。)
  3. [デザイン]-[レポートのレイアウト]-[表形式で表示]。
  4. [デザイン]-[総計v]-[列のみ集計を行う]。
  5. 小計を表示する列項目を右クリックし、["xxx"の小計]をクリックして✓マークを付ける。
  6. [ピボットテーブル分析]-[オプション]-[レイアウトと書式]でレイアウトの"セルとラベルを結合して中央揃えにする"をチェック。
  7. [デザイン]-[ピボットテーブルスタイル]でベースとするスタイルを右クリックし[複製]。ユーザー設定のスタイルを右クリックし[変更]でスタイルを変更。
  • 小計列 1 : 右罫線(太); 網掛け
  • 小計列 2 : 右罫線(細); 網掛け
  • 列小見出し 1 : 上罫線(太)
  • 列小見出し 2 : 上罫線(細)
  • 列小見出し 3 : 上罫線(細)

参考:ピボットテーブルの設定は、データモデルに影響しないので、ピボットテーブルをコピーして別の設定をすることが可能です。テーブルは、データモデルそのものなので、コピーして別の設定にすることができません。

9. サンプル

ダウンロード - 260805stock.zip

C:\Users\Public\Documents\260805stock に展開した各ファイルを置いてください。

10. 参考

| | コメント (0)

« 2026年7月 | トップページ | 2026年9月 »