LoginSignup
0

More than 5 years have passed since last update.

ExcelVBA グラフの凡例に示されるマーカーの影が消えない問題

Posted at

(Excel for Mac 2011で動作確認しています。)

散布図の書式をVBAで編集してると、たまにこうなります。

スクリーンショット 2017-02-10 12.32.33.png

スクリーンショット 2017-02-10 12.40.38.png


結論から言うと、グラフを選択した状態でこちらのマクロを実行していただくと消えることが多いです。

Sub CannotEraseShadow()
    With ActiveChart  'グラフを選択した状態で実行してください

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow 

    End With

End Sub

原因と対策

散布図に対し、VBAで書式変更をしていくような場合です。

散布図のデフォルト設定が「マーカーに影をつける」になっていて、まずこの影を消そうとして四苦八苦します。
私の使っている環境では、影を見えなくするためのプロパティが、存在しているのに動作していません。
この現象で悩む人は多いようで、解決法としては、影の種類を変更して「見えなく」してしまいます。

影の種類を変える方法は2種類あります。
ひとつめは、

    .SeriesCollection(1).Format.Shadow.Type = msoShadow1

影のTypeは40種類以上用意されていますが、影を見えなくしたいならmsoShadow1が良いだろうとの噂です。

もうひとつは、

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow 

こちらは影のStyleで、内付きか外付きを選べます。内付きにするとやはり影が見えなくなります。

上記の方法は、どちらもプロットエリア上の影が見えなくなります。
しかし、Typeのほうを実行すると凡例に示されるマーカーの影がバグってしまうようなのです。

というわけで、Typeは触らないのが得策です。

追求と実験


どうにも頭痛がするのは、このStyleとTypeの扱う書式が、棲み分けがなされておらず、競合しているという点です。

そのため、マクロの中にStyleを指定する行とTypeを指定する行を混在させると、行の順序によって結果が変わります。それでいて、Styleのみ、Typeのみを指定した場合と、両方を指定した場合では、やはり結果が異なるのです。

これは何を意味するかというと、既に何度も編集が繰り返されているグラフに影の形を変えるマクロを適用した場合、どんな見た目になるかは、それまでの編集履歴次第ということです。

Excelのグラフの最終的な見栄えを統一するには、編集履歴をも統一する必要があるのです。

さて影のStyleとTypeの競合を確認してみることにしましょう。

以下の動作確認においては書式変更の履歴を統一するため、毎度新しくデフォルトのグラフを用意して、それぞれに対して一度だけマクロを適用しています。

original.png

こちらが元のグラフです。

単体での動作

Typeのみ指定

    .SeriesCollection(1).Format.Shadow.Type = msoShadow1

type.png

プロットエリアからは影が消えますが、凡例がバグります。

Style(内付き)のみ指定

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow 

innerStyle.png

プロットエリアからも凡例からも影が一掃される、大変お得な設定です。

Style(外付き)のみ指定

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleOuterShadow 

outerStyle.png


しっかりと目立つ影が現れます。

複数を組み合わせたときの動作

Type→Style(内付き)

    .SeriesCollection(1).Format.Shadow.Type = msoShadow1
    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow 

type_innerStyle.png

Style内付きのみ指定したときと同じような結果になります。
よって、すでに凡例がバグってしまって、とにかく消したい、といった場合は、とりあえずStyle(内付き)の指定を行なうと良くなるかもしれません。

Type→Style(外付き)

    .SeriesCollection(1).Format.Shadow.Type = msoShadow1
    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleOuterShadow 

type_outerStyle.png

Style(外付き)の効果が微妙に現れていますが、単体で指定したときとは違った見た目になります。StyleにはTypeの効果を完全に塗り替える能力は無いことがわかります。

Style(内付き)→Type

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleInnerShadow 
    .SeriesCollection(1).Format.Shadow.Type = msoShadow1

innerStyle_type.png

最悪です。順序が違うだけでこの始末です。

Style(外付き)→Type

    .SeriesCollection(1).Format.Shadow.Style = msoShadowStyleOuterShadow 
    .SeriesCollection(1).Format.Shadow.Type = msoShadow1

outerStyle_type.png

こちらも最悪です。しかも外付きにすらならないのです。

どうやら、TypeはStyleの後継のプロパティのようで、種類も豊富ですし、基本的にはStyleの効果を塗り替える能力を持つようです。ただ凡例がバグっちゃうのが玉に瑕です。

まとめ

Excelのグラフの見栄えは編集履歴に依存して変わる可能性があります。
すでに影のTypeを変更してしまったグラフと、Typeを一度も触っていないグラフでは、影のStyleを指定したときの出来栄えが違うことがあります。

影の種類の指定としてはTypeのほうが充実していますが、凡例がバグるという欠点があります。

シンプルなグラフが欲しい人は影のStyleを「内付き」にするのが良さそうです。

グラフの書式の編集履歴は、後からでは確認しようがないことが多いです。
行き詰まった場合は、潔くグラフを消去し、最初から作り直すのが良いかと思います。

あとそうですね、よく考えてみたら、グラフを書くソフトはExcel以外にもたくさんあります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0