人生最悪の忘れ物

Excel VBA(Office 365)で円グラフを作成。
作成した円グラフにデータラベル(分類名+パーセンテージ)を追加したグラフがあります。

円グラフに対して各データラベルを以下のコードで、「0%」という条件に合致したもののみを削除したいのですが、
条件に対して大半は正しくヒットするのですが、なぜかヒットしないものがあります(データラベルが「0%」であるにも関わらず)。
また、一部(すべてではありません)の「1%」のデータラベルがヒットして削除されてしまうこともあります。
上記の不具合?はブレークポイントを設定せず(コードを止めずに)に実行すると生じます。
Next point_cntのところにブレークポイントを置いて、一つずつ動作を確認しながら実行すると、なぜか全く問題なく正常に動作します。
以上の不具合?の改善方法、または、データラベルの特定条件条件検索とDeleteの他の方法について、
お気づきの方が居りましたらご教授いただければ幸いです。

With ws.ChartObjects(.ChartObjects.count).Chart.SeriesCollection(.SeriesCollection.count)
Dim point_cnt
For point_cnt = 1 To .Points.count
If .Points(point_cnt).DataLabel.Text Like "*" & vbLf & "0%" Then
.Points(point_cnt).DataLabel.Delete
End If
Next point_cnt
End With

質問者からの補足コメント

  • うれしい

    ご回答下さりましてありがとうございます。
    実際のコードはそれなりに量があるため、該当部分を抽出しております。
    構成としては以下です。
    グラフを作成するワークシートを定義
    →グラフに使用するデータを定義
    →円グラフを作成
    →データラベルを追加(分類名+パーセンテージ)、区切り文字は改行
    →データラベルの一部を削除(今回の質問部分)

    作成したグラフに対して処理をすることから、作成したグラフが最後のグラフになるため、そのようなコードにしています。
    また、系列はFor Nextでループして1つ目から最後の系列まで順番に処理をしています。

    >別法として(以下、略させていただきます)
    やはり元データを別に計算する処理を追加するのが安牌ですよね。
    また、ラベルの負の値について、ご指摘のように、内部データが絶対値だけれど、表示は負の値というのは気づかなかったです。
    ありがとうございます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/08/20 20:30
  • >グラフの作成もVBAで行っているのなら...
    その通りです。作成と同時に変数に格納してしまえば冗長な記述は必要ありません。

    >「系列」というのは...
    失礼しました。語彙を誤っており、先の補足は「要素」に読み替えてください。
    (要素で正しく伝わるかはわかりませんが。)
    なお、データ系列を、「グラフ内の最後の」としていることにあまり意味はありません。
    処理上、実際にはデータ系列は1つしか存在しえないため、.SeriesCollection(1)でよいです。

    しかしながら、本質問の究極的な意図としては、作成したグラフ(系列は1つ)に処理を行う際、
    ブレークポイントを設定したときとしないときで結果に差異が生じることについて、
    経験や知識をお持ちの方がいるかどうかというものです。
    言葉が足りず申し訳ありませんでした。
    今回は冗長な記述や意味のない記述についてはスルーしてください。

    No.2の回答に寄せられた補足コメントです。 補足日時:2024/08/20 22:19
  • グラフの作成毎に途中経過を出力させたりもしたのですが、変化はありませんでした。

    やはり、ブレークポイントを設定すると正しい結果が得られます。

    そもそもなのですが、DataLabel.Textで取得した文字列を対象に消すか消さないかの処理をしているのに、なぜ検索条件に一致しない文字列(-1%)が生じるのかがよく分かっていません。

    また、Excelの円グラフについて、丸めた時の割合の合計値が100を超過したとき、全体値を100にするために丸める優先度をつけるのでしょうか。
    実際例として、0.500、0.519の二つがあり、これらを含めたデータで円グラフを(割合値は整数)作成すると、0.500は-1、0.519は1と表示されます。

    円グラフの作成の際には100を超過しないように無理やり丸めているように見受けられるため、計算値と円グラフが一致しないため、どうしたものかと悩んだ今日でした。

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/08/21 19:02
  • 度々ありがとうございます。

    >それがわかっているので、DataLabel.Text の値で...
    その通りです。しかし、DataLabel.Text の文字列での判断が、ブレークポイントがないときにうまくいかないため、お気づきの点があるかどうかという趣旨で質問をさせていただいております。
    しかし、No.1のご回答で、改善の有無で結果に差異がないコードの冗長性について言及がされていたため、余談として情報を提供させていただいた次第です。

    丸め誤差についても、正直たいした違いは気にしておらず、計算をExcelに任せようと、自作しようとどっちでも構いません。

    端的に言えば、コードの冗長性や丸め誤差については本質問の焦点ではありません。
    私自身、知りたいことは終始「なぜブレークポイントが無いと一部のラベルが消えないのか」です。
    やりたいことは、1%未満のデータラベルを消すことだけです。

    No.4の回答に寄せられた補足コメントです。 補足日時:2024/08/22 21:06

A 回答 (4件)

No3です。



>無理やり丸めているように見受けられるため~
百分率を求める場合、どこかの桁で丸めれば、丸め誤差の蓄積により合計が100丁度にならないことは普通に発生します。
表示値の合計を100丁度にする方法については、概念的な共通性はあるものの、定番の決まった方法があるわけではありません。
ですので、他人任せで調整を行えば、質問者様のお気に召さない結果になる可能性は十分にあります。
それが嫌なら、ご自身で値を調整し、表示すればよいだけのことと思います。

>計算値と円グラフが一致しないため~
それがわかっているので、DataLabel.Text の値で判断しているのかと推測したのですが、違うのでしょうか?


※ 内容が当初の質問とは異なるものになってきていると思われますので、一旦閉じて別質問になさった方が良いのかも知れません。
この回答への補足あり
    • good
    • 0

No2です。



>ブレークポイントを設定したときとしないときで結果に
>差異が生じることについて~~
ご提示のコードも実際とは違うようなので、推測すらできませんけれど・・
非同期の処理を行っているなどでない限り、エクセル単独ならシングルスレッドのはずですので、そのようなことは起こらないと思います。

ブレークポイントを設定せずに、途中経過を出力するようにしてみれば、原因もわかるだろうとは思いますけれど、ご提示の内容の部分に関してなら、たいした処理ではないので、ロジックを見直してきちんと作成し直した方が早そうに思います。
この回答への補足あり
    • good
    • 0

No1です。



全体像がほとんどわかりませんけれど・・・

>→円グラフを作成
グラフの作成もVBAで行っているのなら、その時点でChartObject は取得できているでしょうから、それならば、ご提示のようにわざわざ全体からグラフを探す必要もないように思いますけれど・・・?

>系列はFor Nextでループして1つ目から最後の系列まで
>順番に処理をしています。
「系列」というのは「データ系列」のことです。
(オブジェクトで言えば、Series のこと)
ループしているというのは、系列内の各データに対応するPoint のことでは?
(円グラフの場合は、あまりpoint感はないですけれど・・)
それとも、系列のループに関してはご質問文では省略しているってことなのかなぁ・・
この回答への補足あり
    • good
    • 0

こんにちは



回答が無いようですので・・・

ご提示のコードは、その外側にもWith構文がありそうなので、よくわかりかねますが・・
(ご提示のままでは、最初のセンテンスでエラーにならるはず)

・グラフ等の取得に「最後のグラフ」「最後の系列」のようにしていますけれど、
 それが目的のグラフや系列と合っているのかは当方には不明です。
 (ひとつしかない前提なら、1に固定でもよいはず)

・ラベルの文字列を「vbLf & "0%"」で検索していますが、合致していますか?
(デフォルト表示だと「, 」(=カンマ+スペース)区切りのようですが・・?)
確実を期すなら、正規表現で「数字の連続+%」を探して、それが「0%」なら消すようにすればよさそうに思います。


別法として、元データの表からパーセンテージを計算して、それが一定値以下なら、ラベルを表示しないという処理方法も考えられるかと。
元のデータが負の値の場合、グラフやパーセンテージ等は絶対値で計算されるようですが、ラベルの値は負の値で表示されるようですね。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A