質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1552閲覧

[VBA]ピボットテーブルのフィルター

gaku1115

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/09/13 09:11

編集2021/09/14 06:46

前書き

大学院に通う理系学生です.
研究の実験データの処理のためにマクロを使ってデータ処理を行おうと思っています.
プログラムは今回が初めてで,ネットで調べて勉強して1から取り組んでいる状態です.
初心者なので至らない部分もあるかと思いますが,皆様のお力をお借りしたいです.

内容・目的

今回の目的はピボットテーブルにラベルのフィルターをかけることです.
実験のエクスポートしたデータを処理するのに使用します.

横軸x/H,縦軸y/H (Hで無次元化した座標系)を指定し,その位置での値u/U0をテーブルに表示します.

ラベルの数値(今回はx/Hのみをフィルターするためy/Hはフィルターをかける必要なし)は各実験ごとに
フィルターの値が変化するので,それに対応できるプログラムを組みたいと考えています.

そこで取り出すラベルの値を別個に計算したものが,1~8行目となっており,
8行目の値がフィルターしたい数値となっており,値で張り付けてあります.
E8~AD8を参照してフィルターをかけていくという流れです.

イメージ説明

プログラムのソース

Sub test2() Dim itm As PivotItem For Each itm In ActiveSheet.PivotTables(1).PivotFields("x/H").PivotItems Select Case itm.Value Case Range("e8"), Range("f8"), Range("g8"), Range("h8"), Range("i8"), Range("j8"), Range("k8"), Range("l8"), Range("m8"), Range("n8"), Range("o8"), Range("p8"), Range("q8"), Range("r8"), Range("s8"), Range("t8"), Range("u8"), Range("v8"), Range("w8"), Range("x8"), Range("y8"), Range("z8"), Range("aa8"), Range("ab8"), Range("ac8"), Range("ad8") itm.Visible = True Case Else itm.Visible = False End Select Next itm End Sub

問題点

このプログラムで実行してみたのですが,フィルター後,表示できていないラベルがいくつかできてしまいます.
具体的にはH8~L8までのラベルが表示できていません.
ちなみに以下のことは確認済みです.

・ピボットテーブルのラベルの数値とD8AD8までの数値は,最後の桁まで完全に一致
・フィルターで折りたたまれているラベルの中にH8
L8までの値の存在を確認.

問題点をまとめると,
H8~L8までのラベルが折りたたまれてしまっているということです.

イメージ説明

解決法がわかる方がおりましたら,ご享受頂ければ幸いです.

ご質問について(手作業の場合の動作)

写真の一枚目がフィルターをかける前,二枚目がフィルタをかけた後のものです.
手作業の場合,算出したラベルの数値のみが残るように,他のラベルのチェックを外していくという作業を行っております.
この作業が非常に手間のかかるものなので,VBAで自動化することが目的です.
ちなみにラベルの数値は昇順に並んでおり,現在のプログラムでは昇順に(値の小さい方から)フィルターを
かける・かけないの判断をしている模様です.(プログラムを一時停止して確認しました)

フィルター前

フィルター後

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hex309

2021/09/14 00:35

プログラムで実行している処理を、手作業で行うとどうなりますか? 念の為確認いただけると。
gaku1115

2021/09/14 06:32

手作業の場合は,E8~AD8までの数値ラベルが残るように,それ以外のラベルを消していくという作業を行っています. 詳細は質問の最後に付け加えておきました.
hex309

2021/09/14 06:41

Select Case文を、表示されない列のみにし、さらに、対象の値をイミディエイトウィンドウに表示するように、以下のようにして見てください。 Debug.Print itm.Value Case Range("e8"), Range("f8"), Range("g8"), Range("h8") さらに、「F8」キーのステップ実行で動作を確認できますか? 確証はないのですが、セルの値を比較するときに、対象が小数なので、正しく判定できていないような気がしています。
gaku1115

2021/09/14 07:29

ご回答ありがとうございます. すみません.試してみたのですが,デバッグがうまくできません. どのようにコードを変更させればよいのでしょうか. 現在試してみたコードがこちらです. Sub test4() Dim itm As PivotItem For Each itm In ActiveSheet.PivotTables(1).PivotFields("x/H").PivotItems Select Case itm.Value Case Range("e8"), Range("f8"), Range("g8"), Range("h8") Debug.Print itm.Value End Select Next itm End Sub 初心者なので理解力がなくてすみません.
hex309

2021/09/14 07:33

以下でどうでしょう。 ループの最初に、対象の値をイミディエイトウィンドウに出力します。 E8~H8のいずれかの値と一致すれば、「E or F or G or H」がイミディエイトウィンドウに出力されます。 Sub test4() Dim itm As PivotItem For Each itm In ActiveSheet.PivotTables(1).PivotFields("x/H").PivotItems Debug.Print itm.Value Select Case itm.Value Case Range("e8"), Range("f8"), Range("g8"), Range("h8") Debug.Print "E or F or G or H" End Select Next itm End Sub これで、少なくともリストの値はすべて出力去れると思うので、実際のセルE8-H8の値と目で見て比較しつつ、動作を確認できるかと
gaku1115

2021/09/14 08:02

ありがとうございます! 今試してみましたが,E~Gまでは認識されておりましたが,やはりH(プログラムで表示されないラベル) の部分は,数値は出るのですが,フィルターの値として認識されませんでした. 他の表示されない部分も試してみましたが,認識されませんでした. これはVBAではもうだめということなのでしょうか.
hex309

2021/09/14 08:12

なるほど。おそらく丸め誤差の問題かと。 回答つけさせていただきます。
guest

回答1

0

ベストアンサー

おそらく丸め誤差の問題だと思われます。
見た目は一致しているとのことですので、強引ですが、文字列に変換して比較してみてはいかがでしょうか?
値を文字列に変換するには、CStr関数を使用します。
以下、ご参考まで。

VBA

1Select Case CStr(itm.Value) 2 Case CStr(Range("e8").Value), CStr(Range("f8").Value)

ちなみに、丸め誤差は、コンピュータが実際には2進数で処理していることから発生する問題です。
例えば、イミディエイトウィンドウで次のコードを実行すると、結果は「False」になります。

VBA

1?0.3=1*0.1

投稿2021/09/14 08:13

hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gaku1115

2021/09/14 08:52

ご回答ありがとうございます. 何度もすみません.ご対応して頂いて,本当にありがたいです. 今,試してみたところやはりうまくいきません. これまで同様H8~L8までが認識できないようです. 試したコードはこちらです. Sub test5() Dim itm As PivotItem For Each itm In ActiveSheet.PivotTables(1).PivotFields("x/H").PivotItems Select Case CStr(itm.Value) Case CStr(Range("e8")), CStr(Range("f8")), CStr(Range("g8")), CStr(Range("h8")), CStr(Range("i8")), CStr(Range("j8")), CStr(Range("k8")), CStr(Range("l8")), CStr(Range("m8")), CStr(Range("n8")), CStr(Range("o8")), CStr(Range("p8")), CStr(Range("q8")), CStr(Range("r8")), CStr(Range("s8")), CStr(Range("t8")), CStr(Range("u8")), CStr(Range("v8")), CStr(Range("w8")), CStr(Range("x8")), CStr(Range("y8")), CStr(Range("z8")), CStr(Range("aa8")), CStr(Range("ab8")), CStr(Range("ac8")), CStr(Range("ad8")) itm.Visible = True Case Else itm.Visible = False End Select Next itm End Sub エクセルデータの方も何か処理をしなければいけないのでしょうか.
hex309

2021/09/15 00:00

ダメでしたか。すみません。 年のため、セルH8の値と、該当するラベルの値を貼り付けて(画像じゃなくて、値として)いただけないでしょうか? 頂いた画像では、ラベルのフィルターに表示される値の桁数と、セルに表示されている値の桁数が異なるので。 あとは、可能性としてですが、CStrで文字列にして比較しましたが、CCurで有効桁数の多いデータ型(Currencyです)に変換してためすことはできますか? 私の手元にデータが有れば、試してからお知らせするのですが、簡単なサンプルしか用意できないのですみません。
gaku1115

2021/09/28 08:20

ご返答ありがとうございます! ご親切に対応して頂いたにもかかわらず,返信が遅くなってしまい申し訳ございません. 結論から申し上げますと,今,CCurを使用して試したところ見事成功しました! ご親切に対応いただきまして本当にありがとうございました. hex309様には心から感謝しております! 追記 参考にセルH8と該当するラベルの値を記述させていただきます. セルH8:-0.0477870941162101 該当する値:-0.0477870941162101 値は完全に一致しているため,(エクセルの数値処理による)値の違いが原因ではなかったと考察します. 真の原因が何かと考え,データを見直した結果,フィルターがかけられなかったラベルの値は,他のラベルより桁数が大きいことに気づきました.そのため,ご教授頂いたCCurを用いることでうまくいったのではないかと考えております.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問