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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
【お題】 ・世界最古のコンビニについて知ってる事を教えてください
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
【マクロ】for nest について 別のブックを動かす際のコード
Excel(エクセル)
-
Excelのフォントについて
Excel(エクセル)
-
-
4
Excel vbaのテキストボックスの扱い
Excel(エクセル)
-
5
VBA バックグラウンドで別ブックを開いてデータ転記
Excel(エクセル)
-
6
Excelにて数式を使用して 工数計算をしたいのですが、 計算方法が分からないので教えて下さい。 1
Excel(エクセル)
-
7
【マクロ】顧客番号にて一致させ、情報を表へ上書きする為には
Excel(エクセル)
-
8
エクセルでチェックボックスを一列にたくさんつくり、各行にリンク先のセルを設定する場合、どのようにした
Excel(エクセル)
-
9
エクセルで日付の入ったセルの月別の個数が知りたい
Excel(エクセル)
-
10
エクセルVBA
Visual Basic(VBA)
-
11
【関数】スペースがいくつ入った後の文字列を取り出したい
Excel(エクセル)
-
12
VBAについての質問です
Excel(エクセル)
-
13
Excel VBA 選択範囲の罫線色の変更プロージャの動作速度の改善について
Visual Basic(VBA)
-
14
(マクロ)vlookupの元データを同じブックのシートではなく、別のブックに設定したい
Excel(エクセル)
-
15
【マクロ】アクティブセルにブックやシートを指定する方法
Excel(エクセル)
-
16
下記マクロでMsgBox 空白です。"の部分の メッセージボックスは現れるものの 空白です。の文字"
Excel(エクセル)
-
17
エクセルVBAコードで教えて下さい!
Visual Basic(VBA)
-
18
Excel(M365) Vlookup/セル反転(VBA)について
Visual Basic(VBA)
-
19
エクセルのマクロについて教えてください。
Visual Basic(VBA)
-
20
VBAコードのインデント表示
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
多量のSUMIF式を軽くしたい
-
外部データの更新がうまくでき...
-
【エクセル】測定時間がバラバ...
-
データ取得時のエラーに関して
-
カンマからスラッシュに
-
VBAで判定音を鳴らす方法
-
曲線グラフからピーク値を求め...
-
モジュラス103の算出方法について
-
この行は既に別のテーブルに属...
-
二分探索の平均探索回数
-
[COBOL]日付比較
-
C言語の度数分布の問題
-
エクセルで2つの時系列のデー...
-
パースとはなんですか?
-
COBOL数値転記をCOPY句内での仕様
-
バーコードリーダーの読込デー...
-
S9タイプからXタイプにデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
【プログラム】プログラミング...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
C# ソケット通信でデータ受信時...
-
カンマからスラッシュに
-
S9タイプからXタイプにデータ...
-
[C言語] コメント文字列を無視...
-
ページ数を求めたい
-
ブレーカー落ちで壊れたりしな...
-
Accessで該当データにフラグを...
-
シーケンサにパソコンからアク...
-
CString型の文字列連結について
おすすめ情報
ご回答下さりましてありがとうございます。
実際のコードはそれなりに量があるため、該当部分を抽出しております。
構成としては以下です。
グラフを作成するワークシートを定義
→グラフに使用するデータを定義
→円グラフを作成
→データラベルを追加(分類名+パーセンテージ)、区切り文字は改行
→データラベルの一部を削除(今回の質問部分)
作成したグラフに対して処理をすることから、作成したグラフが最後のグラフになるため、そのようなコードにしています。
また、系列は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%未満のデータラベルを消すことだけです。