« 2025年2月 | トップページ | 2025年4月 »

2025年3月

RCヘリコプター XK K110Sの設定と調整

安全で丈夫なヘリが欲しいと思い、ネットで評判の良いWLTOYS XK K110Sを購入しました。発売日は2022/08/11らしいです。
https://hitecrcd.co.jp/information/p20220729_k110s/
海外通販のものもS-FHSS方式だとのことでしたので、海外通販で購入しました。日本語取扱説明書は付きません。

1. 初めての人
次の理由により、初心者の人は日本の店で日本語取扱説明書付きで調整済みのものを購入された方が良いと思います。

1) 工場出荷状態の調整精度が低いです。調整するためには、未調整の機体でホバリングする操縦技術が必要です。(私が購入したものは、サーボホーンのニュートラルが出ていない状態でリンケージが調整されていました。ジャイロ基板が曲がって付いていました。)
2) 取扱説明書の英語が難解で誤記もあり、英語で書かれた方法では6軸のキャリブレーションができませんでした。

読みにくい英語の例(RC Groupでは、broken chinglishと書かれていました。)
rocker : 揺り軸=Stickです。
lifting rocker : Elevater or Pitchです。
open the remote control : 送信機の電源を入れることだと思われます。
Charge the helicopter : ヘリの電源を入れることだと思われます。


2. 取扱書の英語の誤記と思われる部分

>6G aircraft hovering mode settings
>1. Open the TX, make sure that the gyro(3D/6G) switch is on 6G OFF position.
⇒6G OFFではなく、6G ONが正しいと思われます。

>2. Charging the helicopter, put the throttle rocker and lifting rocker to bottom after the gyro finish self-checking. Then, red lamp of TX will flash slowly and into 6G hover flight debugging mode.
⇒red lampではなくblue LEDが正しいと思われます。

>Gyroscope calibration
>1. Open the remote control, make sure the throttle stick at the lowest position, 3D switch is in the OFF position.
⇒ネットの記事だと3D ONだと書かれています。でも、どちらでも良い可能性もあります。

>3. Push the throttle rocker, by the hovering of rocker control, the plane landed.
⇒この操作は意味が無いように思え、不要だと思われます。

以上は、次のRC GroupやHeli Freakの記事と実際に操作をした結果から判断しました。
https://www.rcgroups.com/forums/showpost.php?p=32616105&postcount=2
https://www.helifreak.com/showthread.php?t=788189


3. 初期設定と調整

当方も万年初心者ですので、間違っているかもしれませんが、設定と調整方法をメモしました。間違っていれば、コメントをください。

■ プロポの初期設定(Futaba T10Jの例)
1) リバース : スロットルのリバースを解除します。(CH1~4,6はNormalです。)
2) エンドポイント : 100(初期値)にします。
3) トリム、サブトリム : 0(初期値)にします。
4) スワッシュタイプ : H-1(エルロン、エレベータ、ピッチサーボが独立しているタイプ)
5) アイドルアップ、スロットルホールド : 使用するものを有効にします。
6) スロットルカット : 有効にします。
7) デュアルレート : UP側100%、DOWN側75%以上にします。

8) スロットルカーブ

Position Normal Idle Up 1 Idle Up 2
1 0% 90% 100%
2 70% 90% 100%
3 70% 90% 100%
4 70% 90% 100%
5 70% 90% 100%

9) ピッチカーブ

Position Normal Idle Up 1 Idle Up 2 Throttle Hold
1 -8% -40% -40% -40%
2 +4% -20% -20% 0%
3 +16% 0% 0% 0%
4 +28% +20% +20% 0%
5 +40%/10.5° +40% +40% +40%

※ Throttle Holdは、リンケージ調整用です。オートローテーション用の設定値ではありません。オートローテーションを使用するなら、Idle Upと同じピッチにします。
※ NormalでPosition3より少し上でホバリングします。この状態でIdle Upに入れるとピッチが0%に近くなるので、高度が下がります。なので、Idle Upに入れる時は、スロットルを直ぐにコントロールする必要があることを意識しておくと良いです。

10) 6G/3D切替スイッチ : CH5に割り当てます。

極性 : Futaba T10Jのサーボ表示で下(2000μsec)が6G、上(1000μsec)が3Dのようです。

確認方法 : 低速でメインロータを回した状態で機体を傾け、6G/3Dスイッチを切り替えます。スワッシュがメインマストに垂直になる側が3D、地面に水平になる側が6Gだと思われます。
(6G=6軸ジャイロモードです。3D=3軸ジャイロモードです。)

11) スロットルホールド : 有効にします。リンケージ調整用です。

※ デュアルレート、エキスポ、スロットルカーブ、ピッチカーブ、スロットルホールドなどは、お好みに応じて変更してください。但し、デュアルレート、エンドポイントを小さくし過ぎると、ジャイロのキャリブレーションモードに入ることができなくなります。


■ バインディング
1) キャノピーを外します。
2) スロットルを下げ、フライトモードをノーマルにして、送信機の電源を入れます。
3) ヘリの電源を入れ、赤LEDがゆっくり点滅したら、基板のボタンを1秒間押します。
4) 赤と青のLEDが点灯したら完了です。


■ リンケージの調整
工場出荷時に調整されているようです。未調整の機体を購入した時のみ調整します。リンケージを回す方向が分からない人は、悪化させる可能性があるので、調整しないでください。

1) 初めての場合はトリムとサブトリムを全て0にし、ジャイロを3Dモードにし、送信機とヘリの電源を入れ、ヘリを水平に置き、調整用に設定したスロットルホールドに入れ、スロットルを中央にします。これでピッチ指令が0度になります。
2) この状態でサーボホーンとリンケージの角度が90度の位置の近くに無ければ、ホーンを外してできるだけ90度に近い位置に取り付けます。
K110s_link1(私購入した機体はこれがずれていて、ピッチを上げると1つのサーボがロックしスワッシュが傾きました。)
3) エルロン、エレベータ、ピッチのサブトリムを微調整してサーボホーンとリンケージの角度を90度に近づけます。
① エルロンのサブトリムを調整して、左右のサーボの角度が同じになるようにします。
② エレベータのサブトリムを調整して、全てのサーボの角度が同じになるようにします。
③ ピッチのサブトリムを調整して、全てのサーボの角度が90度になるようにします。

4) ヘリを水平で平らな台の上に置きます。台に対しメインマストが垂直になるようにしてください。テールブームが台と平行になるように、テールフィンの下に約t2.0mmの板を挟みます。スキッドがフレームから浮いていないか、スキッドが変形していないかを確認してください。浮いていたり変形していたりするとメインマストが垂直になりません。
K110s_link2
5) メインブレードを90度曲げてメインマストを回転させ、ヘリの右90度の位置にブレードの先端が来た時と、左90度の位置に来た時の台からブレードの先端までの高さが同じになるように、後方の2つのサーボのリンケージの長さを調整します。
K110s_link3
【注意】リンケージを挿入する時、指で片側から強く押し付けるとスワッシュのアームを壊す可能性があります。指で入らない場合は、ラジオペンチなどの工具を使用したほうが良いです。ボールの傷付防止と滑り止めのために、ラジオペンチの先にゴムチューブをかぶせておくと良いと思います。
K110s_link4K110s_link5
6) 同様に前後の位置でブレードの高さが同じになるように、前方または後方2つのリンケージの長さを調整します。
【調整するリンケージの選択方法】5)~6)を行う時、2つのブレードの先端の高さが同じ高さに近づく方向のリンケージを調整します。例えば、マイナスピッチになっている場合は、リンケージを長くするので、ロータの先端が高い方のサーボのリンケージを長くします。
7) 5)~6)を繰り返して、前後左右で2つのブレードの高さが同じになるようにします。なお、微調整の範囲ならサブトリムで調整しても良いと思います。(サブトリムを調整するとサーボホーンの90度がずれるので、リンケージが外れない範囲で、ボールリンクの回転角を調整したほうが良いです。)

8) スティックを上下左右に動かして、サーボがロックしたりリミットが掛かったりしていないかを確認します。もし、ロックやリミットが掛かるようであれば、エンドポイントを調整してください。
スロットルスティックのみを上下した時、スワッシュが傾くなら、エンドポイントを調整してください。

【注意】
・店で調整済みのものを購入した場合は、調整しない方が良いです。
・台とブレード間ではなく、メインフレームとスワッシュアーム間の距離を同じに調整する方法もあります。
・スワッシュレベラーを使用する方が正確だと思われます。

■ 3軸ジャイロのキャリブレーション
1) 送信機の電源を入れます。
2) K110Sの電源を入れ、ヘリを水平に置いて静止状態にし、初期設定が終わるのを待ちます。
3) 送信機のジャイロスイッチを3軸モード(3D)にします。(付属取説と異なります。取説と同じでも良いかもしれません。)
4) スロットルとエレベータスティックを下端、ラダースティックを左端、エルロンスティックを右端にします。(ハの字)
5) 青LEDが速く点滅したら、スロットル以外のスティックを中央に戻します。
6) キャリブレーションが終わると、青LEDが点灯し、赤LEDが点滅した後点灯します。

ジャイロ調整でキャリブレーションモードに入らない場合は、デュアルレートをUPにしてください。

■ 6軸ジャイロのキャリブレーション
6軸ジャイロのキャリブレーションは無風が良いです。ジャイロの調整が狂っている場合は、舵を入れ続けないと1点でホバリングできません。操縦に慣れていない人は、広い屋外で粗調整の意味でのキャリブレーションした後に、屋内で微調整の意味でのキャリブレーションをすると良いでしょう。

6軸ジャイロのキャリブレーション
1) 送信機の電源を入れます。
2) K110Sの電源を入れ、初期設定が終わるのを待ちます。
3) 送信機のジャイロスイッチを6軸モード(6G)にします。(付属取説と異なります。)
4) スロットルとエレベータスティックを下端に下げます。
5) 青LEDがゆっくり点滅するまで待ちます。(キャリブレーションモードに入ります。)
6) 離陸して一ヵ所でホバリングしている状態でゆっくり着陸し、スロットルを一番下に下げます。
7) エレベータースティックを下端に下げます。(キャリブレーションデータの保存処理が始まります。)
8) キャリブレーションが終わると青LEDが点灯し、赤LEDが点滅した後点灯します。

推定:一ヵ所でホバリングしている時のジャイロ信号(ヘリの傾き)を平均化して目標値に記憶するのがキャリブレーションの動作なのかもしれません? なので、ヘリが横滑りしている状態で着陸すると、その姿勢を目標値に設定してしまう気がします?

私の機体は6Gで前に走ってしまったので、屋外で調整し、再度屋内で調整しました。1度調整すると6Gの安定性が増すので、その後の屋内調整が行いやすくなる気がします。

参考:上記と異なる調整方法が記載されています。
ROBINさん:違いはホバリング時に3Dにしていることです。こちらの方が癖が無いので良いのかもしれません? まあ、どちらでも良い気もします。
https://robin.jp/SHOP/XK-K110S-BNF.html

 

4. 修理

1) テールブームの交換
テールブームは圧入されているだけなのですが、非常に固いです。抜く方は何とか出来たのですが、新しいものが奥まで入りません。次のようにしました。1~2mm程度入り切っていない気もしますが、妥協しました。
(1) テールブームの周りに輪ゴムを巻いて滑り止めにする。
(2) 受け側を100℃程度に設定したヒートガンで温める。
(3) テールブームの先端をやすりで面取りする。
(4) ごく僅かにテールブームを削る。(やすりが少し黒くなる程度)
テールブームの交換は半田付け作業などが面倒なので、モータまで一体になったアセンブリパーツを買うと楽です。
テールロータのスリップ防止のため、ダイヤモンドやすりとモータ軸を万力で挟んで、表面に僅かな凹凸を付けました。


5. 余談

初心者は、最初に屋外で飛ばすのが良いと思います。芝生の上が良いと思います。

GPSが無いヘリをFutabaで調整するのは初めてだったのですが、Futabaに慣れていないので分かりにくかったです。センター1520μsecの影響は不明です。

 

6. その他

1) スケールボディ

2) サブトリムを調整してはいけない? ⇒ 本当か???

サブトリムに関しては疑問があります。K110Sを含むジャイロ側にニュートラル設定が無いジャイロに関しては、サブトリムの調整が必要だと思っています。

サーボのニュートラルには個体差がありますが、ホーンの角度はリニアに調整できないので、サブトリムを調整しないとニュートラルでホーンとロッドが90度になりません。
送信機のニュートラルにも個体差があります。ジンバルのニュートラルをキャリブレーションできない送信機が多数あります。また、双葉のニュートラルは1520usですが、双葉以外は1500usです。双葉の送信機を使用すれば、サブトリム0で20μs+製造誤差分ずれます。60度で800μsecのサーボの場合、20μsec×60度÷800μsec=1.5度のずれになります。サーボホーンの溝が25Tの場合、1T=360度÷25T=により、14.4度単位でしか取付角を調整できます。即ち、1.5度のずれは機械的に調整できません。サブトリム調整しないなら、穴無円盤ホーンか溝無ホーンを使うしかないことになりますが、K110用のホーンは販売されていません。この状態で前記Youtuberなどのサブトリム調整禁止信者の人は、このずれをサブトリムを使わずにどのように調整しているのか不明です。 

各社サーボ駆動パルス
https://fa-tamariba.sakura.ne.jp/sblo_files/kousaku/data/8Ae8ED083T815B837B8BEC93AE83p838B83X.pdf

RCサーボの制御パルス幅とArduinoのServoクラス
https://lipoyang.hatenablog.com/entry/20130108/p1

私は各機器のニュートラルの製造バラツキ、サーボの取付角、ニュートラルのメーカ差を微調整するための機能がサブトリムだと思っています。サブトリムでホーンとロッドを90度に調整しても、問題ないと思っています。

参考:サブトリム調整してはいけないFC

ジャイロ側にニュートラルやエンドポイントの設定があるフライトコントローラーは、送信機側でサブトリムやエンドポイントを設定してはいけないと言われています。例えば、RotorFlightなどは、フライトコントローラー側で設定します。これは、FC側にExpoカーブ等のニュートラルが必要な機能があるためだと思われます。例えば、飛行の結果エルロンサーボのニュートラルが1550μsの場合、TXのサブトリムが0のニュートラル1500μsの状態で、FCのニュートラルを1550μsにすることで、FCのExpoのニュートラルが1550μsにします。これを、TXのサブトリムで1550μsにすると、FC側のExpoのニュートラルを1500μsにして、FC出力を1550μsにすることになり、ExpoのニュートラルとFC出力のニュートラルが合わなくなります。実際の調整では、飛行中にエルロンをTXのトリムで調整し、ニュートラルからずれた量をFCに反映し、TXのトリムを0に戻します。

7. EdgeTX

TX16S Mark II 4IN1での設定は、次の記事を参考にしました。

  • XK K110 を EdgeTX (OpenTX) で設定する方法 : 長野県でラジコンを飛ばそう! : 2021/08/21
    https://www.youtube.com/watch?v=1BwKkFQDYVg
    (サブトリムを使ってはいけないと言っています。どのようにしてニュートラルの90度調整をしているのか不明です。まあ、ある程度90度に近ければ、ピッチの上下によるスワッシュの傾きも小さいから気にするなということなのかも知れません。)

4IN1 Multi TX ModuleのS-FHSSは、送信機と受信機のPWMパルス幅が異なります。送信機の1500µsが受信機の1520µs、送信機の1000µsが受信機の2032µs、送信機の2000µsが受信機の1008µs、になります。詳細は、次の記事を見てください。

| | コメント (0)

DIPSユーザーの操縦者情報の登録(2025年3月24日~)

個人で飛行申請する人は「操縦者情報の更新」が必要だそうです。

1. 操縦者情報の登録・更新
1) 下記サイトの「お知らせ/News 重要 2025.03.17 全てのDIPS2.0ユーザ様において、初回のみ「操縦者情報の登録・変更画面」から操縦者情報の更新が必要です。詳しい対応方法はこちら。」をクリックします。
無人航空機 飛行許可・承認申請ポータルサイト
https://www.mlit.go.jp/koku/permitapproval/
250325rc0

2) 下記PDFが開くので、これに従って3)以降の作業を進めます。
ドローン情報基盤システム(DIPS2.0)で飛行許可・承認申請手続きを行う全てのユーザー様へのお願い
https://www.mlit.go.jp/common/001867779.pdf

3) 下記サイトにログインします。
ドローン情報基盤システム2.0
https://www.ossportal.dips.mlit.go.jp/portal/top/

4) [登録手続等はこちら]-[飛行許可・承認申請へ*]-[操縦者情報の登録・変更]
ここで「操縦者情報管理/操縦者情報一覧」が表示されません。
以前「ドローン情報基盤システム(Drone/UAS Information Platform System)」と「ドローン情報基盤システム(飛行情報共有機能)」と連携したのですが、DIPS 2.0に情報が引き継がれてないようです。
250325rc1

5) [新規作成(技能証明なし)]で新規に操縦者情報を入力しました。
250325rc2

6) 登録が受け付けられると次の画面が表示されます。
250325rc3

2. 機体登録は残っていました。
250325rc4

3. 参考
無人航空機の飛行許可・承認手続
https://www.mlit.go.jp/koku/koku_fr10_000042.html

| | コメント (0)

(Excel/Power BI)メジャーが予期しない値を返す原因とDAXコンテキストの理解

メジャーが期待した値を出さない多くの原因は、DAX式内のパラメータが指す範囲を誤解していることにあります。この範囲はコンテキストによって決まります。本記事では、DAX式内のテーブルや列のコンテキストが何を指すのかを整理しました。

素人の独自解釈なので間違っているかもしれません。間違っていれば修正したいので、コメントで教えていただけると幸いです。

※本記事ではメジャーと計算列を対象とし、計算テーブルやDAXクエリは扱いません。


1. DAXのパラメータの種類 
[*1]

DAX式の中のパラメータには次の種類があるようです。
1) 表 <table> : 表全体。例 : '表'
2) 列 <column> : 列。例 : '表'[列]
3) 値 <value>:1つの値。例 : "値"
4) メジャー : メジャーは1つの値<value>を示しますが、中に'表'や[列]などを含みます。例:[メジャー]

定数などの値はコンテキストの影響を受けませんが、表や列はコンテキストによって計算対象範囲が変わります。
メジャーは中に'表'や[列]などを含むので、コンテキストによって計算対象範囲が変わります。

[*1] ここでのパラメータは、DAX関数の引数やDAX式の中の参照のことであり、クエリパラメータやフィールドパラメータのことではありません。


2. DAXの計算対象

計算の対象はデータモデルのテーブルです。ピボットテーブルやマトリックスではありません。
(例 : ピボットテーブルに数量と単価と金額のメジャーを展開した場合、金額のメジャーはピボットテーブルの数量と単価を掛け算するのではなく、データモデルの数量と単価の掛け算を行います。)


3. 行コンテキストとフィルタコンテキスト

DAXのコンテキストには、次の2種類があります。

1) 行コンテキスト

現在処理している行のことです。
- 計算列では、DAX式が計算される行です。
- イテレータ関数(SUMX、FILTERなど)の内では、現在処理している行を指します。

2) フィルタコンテキスト

フィルタ関数やピボットテーブルの条件など、適用されるフィルタの集合を指します。
- 例:ピボットテーブルで「日付=2024/03/18、製品=A」の位置のメジャーは、該当条件を満たすデータモデルのレコードを対象とします。

余談:コンテキストとフィルタは厳密に言うと同じでは無いですが、コンテキストという単語がイメージできないのであれば、フィルタと読み替えたほうが理解しやすいかも知れません?


4. 適用されるコンテキスト

範囲に適用されるコンテキストは、DAX式の記述場所(メジャー、計算列)や、DAX式の中の記述場所の機能により異なります。

1) メジャー

基本的にはメジャーの中のパラメータが示す範囲は、メジャーが値を表示するピボットテーブルなどのセル位置のフィルタコンテキストに従います。但し、式内の関数や場所により範囲が異なる場合があります。

以下の例の青字斜字の部分が各項目で説明しているパラメータです。

(1) CALCULATE関数の第1引数の関数の中の範囲

"CALCULATE関数に掛かるコンテキスト[*2]"を第2引数以降の"フィルタ"に置き換えたコンテキストに従います。
第2引数が無い場合は、CALCULATE関数に掛かるコンテキストに従います。

例 : CALCULATE(SUM('表'[列1]), '表'[列2] = "定数", ALL('表'[列3]))
例 : RANKX(ALL('table'[column]), CALCULATE(SUM('表'[列1]), '表'[列2] = "定数", ALL('表'[列3]))

この例では、CALCULATE関数に掛かるコンテキストが、第2引数の'表'[列2]="定数"と、第3引数のALL('表'[列3])のANDに変更されたコンテキストが、SUM関数の中の'表'[列1]のコンテキストになります。
(ALL関数の中の'表'[列3]は(3)メジャーのフィルタコンテキストに従います。)

[*2] CALCULATE関数に掛かるコンテキストとは
    - CALCULATEの外側に関数が無ければ、メジャーに掛かるフィルタコンテキストです。
    - イテレータ関数などの中のCALCULATEの場合は、外側の関数の行コンテキストなどをフィルタコンテキストに変えたコンテキストです。[*3]

[*3] 行コンテキストと同じ行があれば、フィルタコンテキストは複数行を示します。

(注意 : 第2引数以降のフィルタ内の関数の引数は、(3)メジャーのフィルタコンテキストに従います。)

参考:CALCULATE関数の中で、CALCULATE関数に掛かるコンテキストと第2引数以降のフィルタのANDをコンテキストにする場合は、第2引数以降にKEEPFILTERS関数を用いて、CALCULATE関数に掛かるコンテキストを残します。次の記事の[M売上_Top3]がその事例です。

ExcelのピボットテーブルでTop3とその他合計と合計行を表示するメジャー
https://bigarrow.tea-nifty.com/blog/2025/10/post-2f7984.html

(2) 関数の引数の内、関数内の行コンテキストやフィルタコンテキストが直接掛かる範囲

関数内の行コンテキストやフィルタコンテキストに従います。

例 : SUMX('table', '表'[列])  :  'table'の1行毎に'表'[列]を加算します。
例 : FILTER('table', '表'[列] = "定数")  :  '表'[列]="定数"を満たしている行のみに'table'を絞り込みます。
例 : CALCULATE(SUM('table'[column]), '表'[列] = "定数")  :  '表'[列]="定数"を満たしている行のみにCALCULATE関数内のコンテキストを変更して'table'[column]に適用し、加算します。

(3) その他の関数の引数(基本)

メジャーに掛かるフィルタコンテキストに従います。これが基本です。

例 : SUM('表'[列])、ALL('表')、VALUES('表'[列]2)、SUMX('表',...)、FILTER('表',...)、
例 : CALCULATE(SUM('table'[column1]), VALUES('表'[列2]), FILTER(ALL('表'[列3]), '表'[列3] <= MAX('表'[列3])
                                        (1)                              (3)                            (3)           (2)                     (3)

(FILTER('表', フィルタ)は'表'をフィルタしたテーブルを示しますが、FILTER('表', フィルタ)の'表'はフィルタされる前のテーブル(メジャーに掛かるフィルタコンテキストに従う)です。)

(4) イテレータ関数の第2引数のメジャー

イテレータ関数の行コンテキストを変換したフィルタコンテキスト[*3]に従います。[*4]
例 : RANKX(ALL('table'[column]), [メジャー])

[*4]「メジャーを呼び出したときの DAX の評価ルール」 によりDAX の "メジャーの暗黙的な CALCULATE の適用" が行われます。これは(3)の基本仕様とは異なります。

(5) タイムインテリジェンス関数の第1引数

DATEINPERIODなどの第1引数は、日付テーブルを指定しますが、これは一般的な関数と異なりコンテキストが掛からず、全てが対象になります。
DATEINPERIOD('Date',... とDATEINPERIOD(ALL('Date'),... は、同じです。


2) 計算列

計算列はDAX式が値を表示する行コンテキストに従いますが、関数内はコンテキストがありません。

(1) 直接参照される列(基本1)

行コンテキストに従います。

例 : = '表'[列]

(2) CALCULATE関数の第1引数の関数の中の範囲

"コンテキストが無い=全範囲"を第2引数以降の"フィルタ"で変更したコンテキストに従います。

例 : CALCULATE(SUMX('表'[列]), フィルタ...)

(3) その他の関数の引数(基本2)

"コンテキストが無い=全範囲"を示します。

例 : SUM('表'[列])、VALUES('表'[列])、SUMX('表',...)、FILTER('表',...)


5. その他

1) ALLの戻り値

(1) ALL('表')はテーブル<table>を返します。
(2) ALL('表'[列])は、[列]のみのテーブル<table>を返します。 1列の場合でも列<column>を返すのではありません。

例 : FILTER(ALL('表'[列1]), '表'[列1] = "値") はOKですが、FILTER(ALL('表'[列1]), '表'[列2] = "値") はエラーになります。理由は、ALL('表'[列1]) に '表'[列2]が無いからです。

(3) ALL('表'[列1])は、指定された列のフィルタを解除し、フィールド値の重複行を削除します。(重複行を削除するためにDISTINCT(ALL('表'[列]))と記述する必要はありません。重複行を削除しない場合は、REMOVEFLITERS('表'[列])を使用します。)
(4) ALL('表')は、テーブル全体のフィルタを解除します。全く同じ行があっても重複行は削除されません。

2) "1列のテーブル"は"テーブル"であり、"列"ではありません

テーブル<table>はテーブル型の構造を持ち、列<column>とは型が異なります。

例 : SUMX(<table>, <expression>)で、SUMX(ALL('表'[列]), ...) はOKですが、SUMX('表'[列], ...) はエラーになります。
例 : SUM(<column>)で、SUM('表'[列]) はOKですが、SUM(ALL('表'[列])) はエラーになります。

3) DAX式のエラー箇所の調べ方

[Power Pivot]-[管理]-[データビュー]または[データ]-[データモデル]-[データモデルの管理]-[データビュー]の数式バーで、式のエラー部分に赤波線の下線が付きます。下線が付かないケースもあります。

4) 日付テーブル、カレンダーデーブルの勧め

日付テーブルを作成する理由は色々ありますが、メジャーが予期しない値を返すことを軽減する効果があります。日付テーブルを作成すると、ALL()で日付テーブルのみフィルタを解除し、ファクトテーブルのフィルタコンテキストを変えることが無くなることと、日付テーブルは全ての日付を含むことから、意図しないフィルタやデータの抜けによる計算漏れが起きにくくなり、メジャーが意図通りに動きやすいです。

5) ピボットテーブルの行・列に配置する項目

ピボットテーブルの行・列に配置する項目は、基本的にはディメンジョンテーブルの項目にします。こうすると、メジャーで配置した項目のフィルタをした場合、ファクトテーブルや、他のディメンジョンテーブルに影響しないので、メジャーの式が簡単になります。
ファクトテーブルの項目を行・列に配置すると、行・列項目のフィルタ式がファクトテーブルの他の列にも影響するので、想定外の値が出てしまうことがあります。

 

6. サンプルファイル

ダウンロード - 250313all.xlsx


7. 参考(外部リンク)

DAX 用語集
https://learn.microsoft.com/ja-jp/dax/dax-glossary

DAX の構文
https://learn.microsoft.com/ja-jp/dax/dax-syntax-reference

Power BI Desktop における DAX の基本を学習する
https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-quickstart-learn-dax-basics

CALCULATE
https://learn.microsoft.com/ja-jp/dax/calculate-function-dax


8. 関連記事

Excelのピボットテーブルでグループ内の順位を項目にしたクロス表を作る
https://bigarrow.tea-nifty.com/blog/2025/03/post-e0f809.html

Excel メジャーのRANKXで順位を求める方法(式の中に適用されるコンテキスト)
https://bigarrow.tea-nifty.com/blog/2025/02/post-1ee8c7.html

累計メジャーDAXの勘違い(歯抜け)
https://bigarrow.tea-nifty.com/blog/2025/01/post-08315e.html

| | コメント (0)

FanCtrlがWindows Defenderでブロックされた(2025/03/12)

[2026/01/10]追記

Ring 0を使用しないバージョンv1.7.8が出ていますね。当方は未確認です。
https://github.com/lich426/FanCtrl/releases

[2025/03/12]最初の記事

2024/3/12にWindowsのUpdateをしたら、再起動後にFanCtrlがWindows Defenderでブロックされました。
250312fanctrl
検索したところ、以下の情報がヒットしました。

[2025/03/14]追記
誤検知であり、Defender側が修正されたとの書き込みがあります。どうも、Microsoftのカーネルへのアクセスの認証が変わったことと脆弱性の疑いあるがそれがブロックすべきレベルなのかで迷っている印象です。まだ、コメントが増えている状態で、何が真実なのかが不明です。

FanControl tracked as virus by Windows Defender - HackTool:Win32/Winring0
https://github.com/Rem0o/FanControl.Releases/issues/3016

Why does Defender hate Fan Control? An explanation of Windows Drivers, WinRing0.sys, and its 7.8 CVE score:
https://www.reddit.com/r/FanControl/comments/1j93doq/why_does_defender_hate_fan_control_an_explanation/?rdt=34419
2025/09/18頃?から新しい書き込みが散見されます。Defenderがブロックを再開したのかも知れません?[2025/09/23]
2025/10/05にOpenHardwareMonitor が引っ掛かりDefenderにより削除されました。タスクスケジューラは手動で削除する必要があります。[2025/10/06]

Windows 11/10がWinRing0を警告 対象アプリと脆弱性の実態
https://reinforz.co.jp/bizmedia/73627/

Windowsがファン制御ソフトを「危険」と判断する理由とは?
https://gigazine.net/news/20250314-windows-pc-fan-control-software-threat/

※ 以下の本記事は上記情報が書かれる前のものです。どのように対処するのかは、上記URLの記事を読んでいただき、各自自己責任で判断をしてください。上記URLの書き込みでは、使用を中止した人も継続している人もいます。私は次に記載の通り、アンインストールしました。

以下は、2025/3/12時点の書き込みになります。

少ししか読んでいませんがMicrosoftがWinring0ドライバーの脆弱性をブロックしたようです。これはFanCtrl以外にも使用されているドライバーらしく、LibreHardwareMonitor, CapFrameX, ZenTimings and OpenRGB、OpenHardwareMonitor 等も同様らしいです。

対策するためには、Winring0ドライバーをゼロから書き直して、デジタル署名の取得をする必要があるらしいのですが、その可能性は小さいだろうというようなことが書かれています。

対象フォルダをWindows Defenderの検索範囲から除外するような回避する方法も少し書かれていますが、許可するのは危険でFanCtrlの使用を中止すべきだと書かれています。
250312fanctrl2
私は一度許可してしまったので、[ウイルスと脅威の防止]の[許可された脅威]から[許可しない]に戻しました。

というわけで、FanCtrlの使用を中止し、UEFIのファンコントロールで使うことしか無さそうです。UEFIだとSSDの温度でSSDのFanを制御できないのですが、仕方ないです。

そこでFanCtrlのフォルダを消そうと思ったら消えません。FanCtrlが起動しないので、Windows起動時にFanCtrlが起動する設定を解除できないです。そこで、タスクマネージャーを確認したところ、スタートアップアプリにFanCtrlがありません。プロセスには、FanCtrlがあったので[タスクの終了]をしました。これでFanCtrlのフォルダの削除ができました。
250312fanctrl3

スタートアップにFanCtrlが無いということは、他にFanCtrlを起動する設定があるはずです。そこで、タスクスケジューラを確認したところ、FanCtrlがいましたので削除しました。これでWindows起動時のエラーイベントビューワーのエラーも無くなりました。
250312fanctrl4

もし、他にやっておきべきことがあれば、コメントを頂けると嬉しいです。

[2026/08/23]追記

  • PCが突然落ちる・再起動する原因は「アレ」だった…!買い替える前に絶対に試してほしい対処法【KB5121003】: けんくんPC | Kenkun PC : 2026/08/23
    https://www.youtube.com/watch?v=n9q07ZKvI5s
    Ring 0と書いてあるので、もしかするとFanCtrlにも影響するかも?? 当方はFanCtrlの使用を止めたので未確認です。

| | コメント (0)

Excelのピボットテーブルでグループ内の順位を項目にしたクロス表を作る

Yahoo!知恵袋にExcelの試験問題で問題番号別の出題傾向を求める質問がありました。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14311558284
そこで、問題番別(グループ別)の分類別出題回数の順位の表を作成する方法をメモしました。

1. 元データ

問題一覧
問題番号 年度 分類
1 2020 Pivot Table
2 2020 Power Query
3 2020 VBA
1 2021 Pivot Table
2 2021 Power Pivot
3 2021 DAX
1 2022 Pivot Table
2 2022 Power Query
3 2022 Power Query
1 2023 Power Query
2 2023 Power Pivot
3 2023 Power Query
1 2024 Power Query
2 2024 DAX
3 2024 Power Query

Excelでテーブル名を"問題一覧"にし、次の手順でPower Queryに取込みます。

(1) "問題一覧"の1つのセルを選択し、[データ]-[テーブルまたは範囲から]をクリックします。
(2) [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"を選択し[OK]。

2. ピボットテーブルによる解

上記表をそのままピボットテーブルにすると以下のような集計をすることができます。

ピボットテーブル1
問題番号 DAX Pivot Table Power Pivot Power Query VBA 総計
1   3   2   5
2 1   2 2   5
3 1     3 1 5
総計 2 3 2 7 1 15

作成方法

(1) [データ]-[クエリと接続]で"問題一覧"を右クリックし、[読込先]で"ピボットテーブル"、"新規ワークシート"を選択し[OK]。
(2) ピボットテーブルのフィールドを次のように設定。
      列:分類、行:問題番号、Σ値:分類(個数)
(3) 年度を右クリックし、[スライサーとして追加]

これで傾向を知ることはできますが、出題回数の順位別に分類を表したい場合は、次のような表が考えられます。

3. 本記事で集計する表

順位のピボットテーブル
問題番号 1位 2位 3位
1 Pivot Table Power Query  
2 Power Query, Power Pivot   DAX
3 Power Query VBA, DAX  

特徴

1) 順位(値)がピボットテーブルの列項目である。
2) 分類(文字列)がピボットテーブルのΣ値である。

この表を"問題一覧"があるExcelに作成します。

(余談 : この表は定性的な表なので、分析をするためには2.のピボットテーブルの方が良いと思います。二極化志向の人向けには、定性的な表が良いかも知れません。)

4. 本記事の順位を求める方法

次の2つの方法をメモしました。

1) Power Query M : Table.AddRankColumn()を使用する。https://learn.microsoft.com/ja-jp/powerquery-m/table-addrankcolumn

2) DAX : RANKX()を使用する。メジャーはピボットテーブルの項目に使えないので、計算列で使用する。https://learn.microsoft.com/ja-jp/dax/rankx-function-dax

5. Power Queryで順位を求める

1-1) 回数順位 Power Query

'問題一覧'から[回数]と[順位]の列を持った表を作成するクエリです。

(1) [データ]-[クエリと接続]で適当なクエリを右クリックし[編集]でPower Queryエディタを開く。
(2) '問題一覧'クエリを右クリックし[参照]、プロパティの名前を'回数順位'に変更する。
(3) '問題番号'と"分類"列をCtrlキーを押しながら選択し、[ホーム]-[グループ化]で新しい列名に"回数"、操作に[行数のカウント]を選択し[OK]
(4) '問題番号'を選択し、[ホーム]-[グループ化]で新しい列名に"サブテーブル"、操作に[すべての行]を選択し[OK]
(5) [ホーム]-[詳細エディタ]で次のようにコードを修正して、[OK]

let
    ソース = 問題一覧,
    グループ化された行 = Table.Group(ソース, {"問題番号", "分類"}, {{"回数", each Table.RowCount(_), Int64.Type}}),
    グループ化された行1 = Table.Group(グループ化された行, {"問題番号"}, {{"サブテーブル", each _, type table [問題番号=nullable number, 分類=nullable text, 回数=number]}}),

    // 各サブテーブル内でランク列を追加
    ランク追加 = Table.TransformColumns(
        グループ化された行1,
        {
            {"サブテーブル", each Table.AddRankColumn(_, "順位", {"回数", Order.Descending})}
        }
    )
in
    ランク追加

(6) サブテーブルの右の展開アイコンをクリックし、[さらに読み込む]をクリックし、"問題番号"と"元の列名をプレフィックスとして使用します"のチェックを外し、[OK]
(7) "分類","回数","順位"をCtrlを押しながら選択し、[変換]-[データ型の検出]
(8) [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"ピボットテーブル"と"新規テーブル"と"データモデルに追加"を選択し[OK]。

参考 : '回数順位'の完成コード
let
    ソース = 問題一覧,
    // 問題番号と分類でグループ化し、行数から回数を得る。
    グループ化された行 = Table.Group(ソース, {"問題番号", "分類"}, {{"回数", each Table.RowCount(_), Int64.Type}}),
    // 問題番号毎に順位を求めるため、問題番号毎のサブテーブルを作る。
    グループ化された行1 = Table.Group(グループ化された行, {"問題番号"}, {{"サブテーブル", each _, type table [問題番号=nullable number, 分類=nullable text, 回数=number]}}),
    // 各サブテーブル内でランク列を追加する。
    ランク追加 = Table.TransformColumns(
        グループ化された行1,
        {
            {"サブテーブル", each Table.AddRankColumn(_, "順位", {"回数", Order.Descending})}
        }
    ),
    // ランク列が追加されたサブテーブルを元に戻す。
   #"展開された サブテーブル" = Table.ExpandTableColumn(ランク追加, "サブテーブル", {"分類", "回数", "順位"}, {"分類", "回数", "順位"}),
    変更された型 = Table.TransformColumnTypes(#"展開された サブテーブル",{{"分類", type text}, {"回数", Int64.Type}, {"順位", Int64.Type}})
in
    変更された型

参考情報
[Power BI] Table.AddRankColumnで月別ランク表を作る
https://qiita.com/spumoni/items/43e2a530f2c3b0386073

1-2) 順位 Power Query

同位順位があると回数順位表に順位の抜けが生じます。集計表で抜けがある順位を空白値で表示するために、抜けのない順位表を作成します。

(1) Power Queryエディタの[ホーム]-[新しいソース]-[その他のソース]-[空のクエリ]で、プロパティの名前を'順位'に変更する。
(2) [ホーム]-[詳細エディタ]でコードを次のように全て書き換える。

let
    // データの参照
    ソース = 回数順位,
    // "順位" 列のユニーク値を取得
    順位リスト = List.Distinct(ソース[順位]),
    // 順位の最小値と最大値を取得
    最小順位 = List.Min(順位リスト),
    最大順位 = List.Max(順位リスト),
    // 1 から 最大順位 までのリストを作成
    完全順位リスト = List.Numbers(最小順位, 最大順位 - 最小順位 + 1),
    // テーブル化
    順位テーブル = Table.FromList(完全順位リスト, Splitter.SplitByNothing(), {"順位"}, null, ExtraValues.Error),
    変更された型 = Table.TransformColumnTypes(順位テーブル,{{"順位", Int64.Type}})
in
    変更された型

(3) [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"と"データモデルに追加"を選択し[OK]。


2) リレーション Power Pivot

(1) Excelの[Power Pivot]-[管理]-[ダイアグラムビュー]、または[データ]-[データモデル]-[リレーションシップ]で次のようにリレーションを取ります。

'回数順位’[順位] *:1 '順位'[順位]

3) メジャー

ピボットテーブルのΣ値には項目('回数順位'[分類])を表示できないことと、同一順位の分類が複数ある場合があるので、以下のメジャーを作成します。

(1) '回数順位'から作成したピボットテーブルを選択し、ピボットテーブルのフィールドを表示し、'回数順位'を右クリックし、[メジャーの追加]で次のように入力する。

メジャーの名前 : M分類q
数式 :
=IF(
    ISFILTERED('回数順位'[問題番号]) && ISFILTERED('順位'[順位]),
    CONCATENATEX('回数順位', '回数順位'[分類], ",")
)


4) ピボットテーブル

ピボットテーブルのフィールドの[すべて]をクリックし、以下のように項目を展開します。
列 : '順位'[順位]
行 : 問題番号
Σ値 : M分類q

6. DAXで順位を求める

1) 回数 Power Query

'問題一覧'から[回数]の列を持つ表を作成するクエリです。

(1) [データ]-[クエリと接続]で適当なクエリを右クリックし[編集]でPower Queryエディタを開く。
(2) "問題一覧"クエリを右クリックし[参照]、プロパティの名前を"回数"に変更する。
(3) "問題番号"と"分類"列をCtrlキーを押しながら選択し、[ホーム]-[グループ化]で新しい列名に"回数"、操作に[行数のカウント]を選択し[OK]
(4) [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"ピボットテーブル"と"新規テーブル"と"データモデルに追加"を選択し[OK]。

2) 順位 Power Pivot 計算列

計算列で'回数'表に順位の列を追加します。

(1) Excelの[Power Pivot]でPower Pivot for Excelを起動し、[管理]-[データビュー]-[回数]タブ-[列の追加]をダブルクリックし名前を"C順位"に変更。
(2) [C順位]の下のセルを選択し、数式バーに次の式を入力。

=RANKX( // ランクを求める
    FILTER( // ランクの対象範囲を'回数'の行コンテキストの[問題番号]の行に絞り込む
        '回数', // フィルタ対象
        '回数'[問題番号]=EARLIER('回数'[問題番号]) // フィルタ条件、EARLIER(...)は行コンテキストの問題番号
    ),
    '回数'[回数], // ランクを求める対象列
    ,
    DESC, // 降順
    Skip // 同一順位の順位をスキップ
)

関連記事
Excel メジャーのRANKXで順位を求める方法(イテレータ関数の中のコンテキスト)の11. 式の中に適用されるコンテキスト
https://bigarrow.tea-nifty.com/blog/2025/02/post-1ee8c7.html

3) メジャー

ピボットテーブルのΣ値には項目('回数順位'[分類])を表示できないことと、同一順位の分類が複数ある場合があるので、以下のメジャーを作成します。

(1) '回数'から作成したピボットテーブルを選択し、ピボットテーブルのフィールドを表示し、'回数'を右クリックし、[メジャーの追加]で次のように入力する。

メジャーの名前 : M分類c
数式 :
=IF(
    ISFILTERED('回数'[問題番号]) && ISFILTERED('回数'[C順位]),
    CONCATENATEX('回数', '回数'[分類], ",")
)

4) ピボットテーブル

ピボットテーブルのフィールドの[すべて]をクリックし、以下のように項目を展開します。
列 : '回数'[C順位]
行 : 問題番号
Σ値 : M分類c

7. サンプルファイル

ダウンロード - 250302grrank.xlsx


8. 余談

冒頭のYahoo!知恵袋の問題一覧はMOS(Microsoft Office Specialist)かも知れませんね。MOSの出題範囲にVBAはありますが、Power QueryやPower Pivotは入っていません。
Excelで集計の仕組みを作ることを主業務にしている人はVBA ADO(SQL)とか、他の言語の方が良いのでしょう。
でも一般的には集計の仕組みを利用している人の方が多いと思います。そして、セルアドレスの間違いで苦労している人も多い気がします。テーブルやピボットテーブルはその解決策として良い選択肢だと思います。それに加えて、モダンExcelの仕組みも良いと思っています。小さな表であれば、セルアドレスの方が直感的で速いですが、セルアドレスに苦しみを感じたらモダンExcelが良い気がします。

8. テキストマイニングの参考情報(外部リンク)

計量テキスト分析ツール KH Coder
https://khcoder.net/

30分で分かる!Pythonテキストマイニング入門 〜環境構築から基本分析まで〜
https://qiita.com/Tadataka_Takahashi/items/c67f51ed424c9367e30d

【日本語WordCloud】ExcelデータからPython/Pandasで頻出キーワードを可視化する
https://pala-ghe.com/japanese_wordcloud_excel_python_pandas_keywords/?utm_source=chatgpt.com

テキストマイニングとは?Power BIでワードクラウドを表現する方法!
https://frogwell.co.jp/blogs/pbi-textmining/

Power BIのText Analyticsは、無料では使えません。Power BI Premium Per User 2,998\/月が必要だと思われます?
https://frogwell.co.jp/blogs/powerbi-textmining/

Power BI Desktop
https://www.microsoft.com/ja-jp/power-platform/products/power-bi/desktop

Datasets
https://www.kaggle.com/datasets
https://www.kaggle.com/datasets/shivamchaudharys/tmdb-top-rated-movi-10k?resource=download

「無人航空機の飛行に関する許可・承認の審査要領(カテゴリー2飛行)」等の一部改正案に関する意見募集の結果について
https://public-comment.e-gov.go.jp/pcm/1040?CLASSNAME=PCM1040&id=155241249&Mode=1

| | コメント (0)

« 2025年2月 | トップページ | 2025年4月 »