
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
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No3です。
>無理やり丸めているように見受けられるため~
百分率を求める場合、どこかの桁で丸めれば、丸め誤差の蓄積により合計が100丁度にならないことは普通に発生します。
表示値の合計を100丁度にする方法については、概念的な共通性はあるものの、定番の決まった方法があるわけではありません。
ですので、他人任せで調整を行えば、質問者様のお気に召さない結果になる可能性は十分にあります。
それが嫌なら、ご自身で値を調整し、表示すればよいだけのことと思います。
>計算値と円グラフが一致しないため~
それがわかっているので、DataLabel.Text の値で判断しているのかと推測したのですが、違うのでしょうか?
※ 内容が当初の質問とは異なるものになってきていると思われますので、一旦閉じて別質問になさった方が良いのかも知れません。
No.3
- 回答日時:
No2です。
>ブレークポイントを設定したときとしないときで結果に
>差異が生じることについて~~
ご提示のコードも実際とは違うようなので、推測すらできませんけれど・・
非同期の処理を行っているなどでない限り、エクセル単独ならシングルスレッドのはずですので、そのようなことは起こらないと思います。
ブレークポイントを設定せずに、途中経過を出力するようにしてみれば、原因もわかるだろうとは思いますけれど、ご提示の内容の部分に関してなら、たいした処理ではないので、ロジックを見直してきちんと作成し直した方が早そうに思います。
No.2
- 回答日時:
No1です。
全体像がほとんどわかりませんけれど・・・
>→円グラフを作成
グラフの作成もVBAで行っているのなら、その時点でChartObject は取得できているでしょうから、それならば、ご提示のようにわざわざ全体からグラフを探す必要もないように思いますけれど・・・?
>系列はFor Nextでループして1つ目から最後の系列まで
>順番に処理をしています。
「系列」というのは「データ系列」のことです。
(オブジェクトで言えば、Series のこと)
ループしているというのは、系列内の各データに対応するPoint のことでは?
(円グラフの場合は、あまりpoint感はないですけれど・・)
それとも、系列のループに関してはご質問文では省略しているってことなのかなぁ・・
No.1
- 回答日時:
こんにちは
回答が無いようですので・・・
ご提示のコードは、その外側にもWith構文がありそうなので、よくわかりかねますが・・
(ご提示のままでは、最初のセンテンスでエラーにならるはず)
・グラフ等の取得に「最後のグラフ」「最後の系列」のようにしていますけれど、
それが目的のグラフや系列と合っているのかは当方には不明です。
(ひとつしかない前提なら、1に固定でもよいはず)
・ラベルの文字列を「vbLf & "0%"」で検索していますが、合致していますか?
(デフォルト表示だと「, 」(=カンマ+スペース)区切りのようですが・・?)
確実を期すなら、正規表現で「数字の連続+%」を探して、それが「0%」なら消すようにすればよさそうに思います。
別法として、元データの表からパーセンテージを計算して、それが一定値以下なら、ラベルを表示しないという処理方法も考えられるかと。
元のデータが負の値の場合、グラフやパーセンテージ等は絶対値で計算されるようですが、ラベルの値は負の値で表示されるようですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA listBoxについて 2 2024/03/26 16:14
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) ExcelVBA修正のお願い 1 2024/07/02 23:06
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) WORD VBA プログラム修正をお願いします。 2 2024/04/25 23:43
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで半角の?の文字を探し...
-
教えて下さい
-
エクセルでの「外部データの取...
-
C言語プログラム変更
-
Data(加算名詞、不可算名詞)に...
-
データのアップロードやダウン...
-
EXCEL2007の質問です。
-
C#の2次元配列について
-
VBAを使ってOutlookメール本文...
-
情報がパソコン上から流出する...
-
日付処理について
-
SQLで時間差分とその合計の求め方
-
配列でデータが入っている要素...
-
エクセルマクロ 特定数の文字...
-
FROM SQL文 がしたい
-
100万行の連続データを可視...
-
VBAエキスパート
-
フレームワークとはいったいど...
-
マクロで検索条件2つのデータ...
-
2バイトデータのビットシフトに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
ユーザーフォームのテキストボ...
-
特定のデータの抽出方法を教え...
-
二分探索の平均探索回数
-
EXCELVBAでSQLserverからデータ...
-
Accessで該当データにフラグを...
-
VBA 空白セルを削除ではない方...
-
この行は既に別のテーブルに属...
-
Excel VBAでのオートフィルター...
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
アクセス2000で画像データ...
-
CString型の文字列連結について
-
カンマからスラッシュに
-
VBにおいてフォーム間の変数の...
-
<VB>String→Object
おすすめ情報
ご回答下さりましてありがとうございます。
実際のコードはそれなりに量があるため、該当部分を抽出しております。
構成としては以下です。
グラフを作成するワークシートを定義
→グラフに使用するデータを定義
→円グラフを作成
→データラベルを追加(分類名+パーセンテージ)、区切り文字は改行
→データラベルの一部を削除(今回の質問部分)
作成したグラフに対して処理をすることから、作成したグラフが最後のグラフになるため、そのようなコードにしています。
また、系列はFor Nextでループして1つ目から最後の系列まで順番に処理をしています。
>別法として(以下、略させていただきます)
やはり元データを別に計算する処理を追加するのが安牌ですよね。
また、ラベルの負の値について、ご指摘のように、内部データが絶対値だけれど、表示は負の値というのは気づかなかったです。
ありがとうございます。
>グラフの作成もVBAで行っているのなら...
その通りです。作成と同時に変数に格納してしまえば冗長な記述は必要ありません。
>「系列」というのは...
失礼しました。語彙を誤っており、先の補足は「要素」に読み替えてください。
(要素で正しく伝わるかはわかりませんが。)
なお、データ系列を、「グラフ内の最後の」としていることにあまり意味はありません。
処理上、実際にはデータ系列は1つしか存在しえないため、.SeriesCollection(1)でよいです。
しかしながら、本質問の究極的な意図としては、作成したグラフ(系列は1つ)に処理を行う際、
ブレークポイントを設定したときとしないときで結果に差異が生じることについて、
経験や知識をお持ちの方がいるかどうかというものです。
言葉が足りず申し訳ありませんでした。
今回は冗長な記述や意味のない記述についてはスルーしてください。
グラフの作成毎に途中経過を出力させたりもしたのですが、変化はありませんでした。
やはり、ブレークポイントを設定すると正しい結果が得られます。
そもそもなのですが、DataLabel.Textで取得した文字列を対象に消すか消さないかの処理をしているのに、なぜ検索条件に一致しない文字列(-1%)が生じるのかがよく分かっていません。
また、Excelの円グラフについて、丸めた時の割合の合計値が100を超過したとき、全体値を100にするために丸める優先度をつけるのでしょうか。
実際例として、0.500、0.519の二つがあり、これらを含めたデータで円グラフを(割合値は整数)作成すると、0.500は-1、0.519は1と表示されます。
円グラフの作成の際には100を超過しないように無理やり丸めているように見受けられるため、計算値と円グラフが一致しないため、どうしたものかと悩んだ今日でした。
度々ありがとうございます。
>それがわかっているので、DataLabel.Text の値で...
その通りです。しかし、DataLabel.Text の文字列での判断が、ブレークポイントがないときにうまくいかないため、お気づきの点があるかどうかという趣旨で質問をさせていただいております。
しかし、No.1のご回答で、改善の有無で結果に差異がないコードの冗長性について言及がされていたため、余談として情報を提供させていただいた次第です。
丸め誤差についても、正直たいした違いは気にしておらず、計算をExcelに任せようと、自作しようとどっちでも構いません。
端的に言えば、コードの冗長性や丸め誤差については本質問の焦点ではありません。
私自身、知りたいことは終始「なぜブレークポイントが無いと一部のラベルが消えないのか」です。
やりたいことは、1%未満のデータラベルを消すことだけです。