Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4290 / 13644 ツリー ←次へ | 前へ→

【57352】円グラフのデータラベルが0%だった場合にラベルと凡例を削除したい ドラキー 08/8/12(火) 17:31 質問[未読]
【57353】Re:円グラフのデータラベルが0%だった場合... りん 08/8/12(火) 18:32 回答[未読]
【57401】エラーが出てしまいました; ドラキー 08/8/18(月) 17:03 質問[未読]
【57404】Re:エラーが出てしまいました; りん 08/8/18(月) 22:10 発言[未読]
【57423】見えないグラフとグラフエリアのサイズ変更 ドラキー 08/8/21(木) 15:20 質問[未読]
【57426】グラフエリアのサイズ変更 ドラキー 08/8/21(木) 16:30 発言[未読]
【57446】Re:グラフエリアのサイズ変更 りん 08/8/23(土) 21:19 発言[未読]
【57470】ありがとうございました! ドラキー 08/8/25(月) 17:50 お礼[未読]

【57352】円グラフのデータラベルが0%だった場合に...
質問  ドラキー  - 08/8/12(火) 17:31 -

引用なし
パスワード
   はじめまして!よろしくお願い致します。
(※当方Excel 2003ユーザーです。)

円グラフを作成したとき、
値がゼロまたは空欄の場合は円グラフのデータラベルに"0%"が表示されてしまいますが、これを自動的に0%という値と、0%だった項目(凡例内)を削除するVBを作りたいと思っております。

イメージ的には、

      A   B   C
パーセント 10%  0%  90%

を元データにした円グラフで、データラベルはそれぞれ

A…10%, B…0%, C…90%と表示されているのを、
「B」の"0%"を削除して、データラベルの表示を
A…10%, C…90% のみにしたいのです。

また、円グラフの横に表示される「凡例」からも、0%であった「B」の項目は表示から消したいと思っております。

既に作成してしまっているグラフとファイルが大量にあることもあり、更に元データをなるべくいじりたくないことから、グラフを作る段階で"0%"の表示を防止するのではなく、直接グラフの表示を修正するようなVBAを作りたいのですが、超初心者ゆえに技量が足りずなかなかうまくいきません。。

色々サイトを除いてまずはデータラベルの値を消すVB(下)を書いてみましたが、やはり仕組みが分かっていないためか、エラー438が出て止まってしまいました。><

Sub ゼロを削除()

Dim k As Integer
Dim co As ChartObject
Dim pp As Point

k = 0
Do
k = k + 1
Set co = ActiveSheet.ChartObjects(k)
co.Activate
For Each pp In co.Chart.SeriesCollection(1).Points
  If pp = "0%" Then
    ActiveChart.SeriesCollection(1).DataLabels.Delete
  End If
Next
Loop
End Sub

どなたかご教授いただけますでしょうか?m(_ _)m

大変お手数ですが、宜しくお願い致します。><
※お返事が少々遅くなってしまうかもしれないのですが、必ずお返事いたしますので宜しくお願い致します。

【57353】Re:円グラフのデータラベルが0%だった場...
回答  りん E-MAIL  - 08/8/12(火) 18:32 -

引用なし
パスワード
   ドラキー さん、こんばんわ。

>(※当方Excel 2003ユーザーです。)
私もです。


>また、円グラフの横に表示される「凡例」からも、0%であった「B」の項目は表示から消したいと思っております。
>
>既に作成してしまっているグラフとファイルが大量にあることもあり、更に元データをなるべくいじりたくないことから、グラフを作る段階で"0%"の表示を防止するのではなく、直接グラフの表示を修正するようなVBAを作りたいのですが、超初心者ゆえに技量が足りずなかなかうまくいきません。。

アクティブなシート上の埋め込みグラフの系列1で、値が0の時に「既に表示されている」データラベルを削除し、同時に凡例の項目も削除します。

Sub test()
  Dim co As ChartObject, sc As Series, pt As Point
  Dim II As Long, Imax As Long, Hmax As Long
  '
  'アクティブなシートが対象
  With Application.ActiveSheet
   '埋め込みグラフでループ
   For Each co In .ChartObjects
     With co.Chart
      '系列は1
      Set sc = .SeriesCollection(1)
      'データの数
      Imax = sc.Points.Count
      '凡例に表示されている数
      If .HasLegend = False Then
        Hmax = 0
      Else
        Hmax = .Legend.LegendEntries.Count
      End If
     End With
     '
     '削除は後ろからが無難
     For II = Imax To 1 Step -1
      Set pt = sc.Points(II)
      '値がゼロ
      If sc.Values(II) = 0 Then
        'ラベルがあれば削除
        If pt.HasDataLabel = True Then
         pt.DataLabel.Delete
        End If
        'データ数と凡例表示数が一致する時だけ処理
        If Hmax = Imax Then
         co.Chart.Legend.LegendEntries(II).Delete
        End If
      End If
     Next
   Next
  End With
End Sub

こんな感じです。

【57401】エラーが出てしまいました;
質問  ドラキー  - 08/8/18(月) 17:03 -

引用なし
パスワード
   りんさん、こんにちは!
スクリプトをイチから書いていただいてありがとうございます!恐縮です。
初心者ゆえに、解読に時間がかかりお返事が遅くなってしまいました。すみません。

教えていただいたVBですが、

>         co.Chart.Legend.LegendEntries(II).Delete

でエラーになり止ってしまう場合があります。
しかし不思議なことに、エラーが出ないシートと出るシートがあり、どこがダメなのか掴めない状況です。。

エラー表示は、2パターンあり

(A)
「実行時エラー'1004'
LegendEntryクラスのDeleteメソッドが失敗しました。」

か、

(B)
「実行時エラー'1004'
凡例には最低1つの凡例文字列が含まれていなければなりません。」

とあります。

(A)パターンの場合は変数II、Imax、Hmaxがそれぞれ同じ値の場合(一番最初の段階)で出てきてしまいます。
(B)パターンの場合は変数IIの値が"1"の場合で出てきてしまいます。

どのグラフも同じ設定で作成しているのですが。。。
何かこのエラーに関して、考えられる原因等はございますでしょうか?
大変お手数ですが、よろしくお願いいたします。m(_ _)m

【57404】Re:エラーが出てしまいました;
発言  りん E-MAIL  - 08/8/18(月) 22:10 -

引用なし
パスワード
   ドラキー さん、こんばんわ。

>(A)
>「実行時エラー'1004'
>LegendEntryクラスのDeleteメソッドが失敗しました。
こっちはまだ再現できていませんが、

>(B)
>「実行時エラー'1004'
>凡例には最低1つの凡例文字列が含まれていなければなりません。」
見えないところにデータのないグラフがあるのかもしれませんね。

実物をみていないのでなんともいえませんが、ログをとってみれば何かわかるかもしれません。

Sub test()
  On Error GoTo errlogs
  Dim co As ChartObject, sc As Series, pt As Point
  Dim II As Long, Imax As Long, Hmax As Long
  '
  'アクティブなシートが対象
  With Application.ActiveSheet
   '埋め込みグラフでループ
   For Each co In .ChartObjects
     With co.Chart
      '系列は1
      Set sc = .SeriesCollection(1)
      'データの数
      Imax = sc.Points.Count
      '凡例に表示されている数
      If .HasLegend = False Then
        Hmax = 0
      Else
        Hmax = .Legend.LegendEntries.Count
      End If
     End With
     '
     '削除は後ろからが無難
     For II = Imax To 1 Step -1
      Set pt = sc.Points(II)
      '値がゼロ
      If sc.Values(II) = 0 Then
        'ラベルがあれば削除
        If pt.HasDataLabel = True Then
         pt.DataLabel.Delete
        End If
        'データ数と凡例表示数が一致する時だけ処理
        If Hmax = Imax Then
         co.Chart.Legend.LegendEntries(II).Delete
        End If
      End If
     Next
   Next
  End With
Exit Sub
'エラーになったらイミディエイトウィンドウにログ追加
errlogs:
  Debug.Print "Err" & Err.Number, co.Parent.Name & "の"; co.TopLeftCell.Address & "にある" & co.Name, Error(Err.Number)
  Resume Next '復帰
End Sub

イミディエイトウィンドウの内容で、どのグラフでどんなエラーが発生したのか、そのグラフが他のとどう違うか確認してみてください。

【57423】見えないグラフとグラフエリアのサイズ変...
質問  ドラキー  - 08/8/21(木) 15:20 -

引用なし
パスワード
   りん さん、こんにちわ!
いつもありがとうございます&お返事遅れてしまい申し訳ないです。m(_ _)m

また新たに教えていただいたスクリプトにより、
イミディエイトウィンドウでエラー内容を確認することができました。
(お恥ずかしながら、イミディエイトウィンドウの存在自体知りませんでした;)

>見えないところにデータのないグラフがあるのかもしれませんね。

↑ご指摘どおり、見えていないグラフが多数(100個近く…)ありました…!
そのデータが邪魔してエラーが出ていたことが一つの原因のようでした。
目に見えないので、グラフのインデックス番号をVBで指定して隠れたグラフの削除を試みた後、VBを実行してみたのですが、相変わらず同じ1004エラーが出てしまい、前述のVBでグラフがきちんと削除できていないようでした。特定のグラフを削除するVBは単純なスクリプトなので間違えようがないはずなのですが。。

ちなみに、

>ActiveSheet.ChartObjects.Delete

でグラフを全削除すると、ちゃんと見えないデータも消えてくれました。


また、見えないグラフだけではなく、目に見えるグラフでも

>(A)
>「実行時エラー'1004'
>LegendEntryクラスのDeleteメソッドが失敗しました。

が出てしまう場合があり、その傾向を調査したところ、
グラフ作成ウィザードでグラフを作成した後に、グラフエリアのサイズを変更した場合にのみ、該当のエラーが出ることが判明しました。
グラフエリアのサイズを変更していないグラフに関しては、全くエラーが出ませんでした。

グラフエリアのサイズ変更をすると、データ上何か不都合でも起きてしまうのでしょうか?><

【57426】グラフエリアのサイズ変更
発言  ドラキー  - 08/8/21(木) 16:30 -

引用なし
パスワード
   ちなみにですが、グラフエリアのサイズ変更をしたグラフに出るエラーですが、
凡例を消す段階でVBがストップします。

たとえば、データラベルが10個ある状態で、
本来ならば凡例も10個になるところ、
途中でエラーが起き凡例が14個…という具合に消されずに残ってしまうのです。

グラフエリアのサイズを変更していない状態ですと、このようなことは起きません。
不思議です。。

【57446】Re:グラフエリアのサイズ変更
発言  りん E-MAIL  - 08/8/23(土) 21:19 -

引用なし
パスワード
   ドラキー さん、こんばんわ。

>たとえば、データラベルが10個ある状態で、
>本来ならば凡例も10個になるところ、
>途中でエラーが起き凡例が14個…という具合に消されずに残ってしまうのです。
>
>グラフエリアのサイズを変更していない状態ですと、このようなことは起きません。
>不思議です。。

試してみましたが、エラーになりませんでした。
なぜでしょうね。

【57470】ありがとうございました!
お礼  ドラキー  - 08/8/25(月) 17:50 -

引用なし
パスワード
   りんさん、お世話になります。

引き続き確認していただきありがとうございました。
こちらでも何度か確認してみたのですが、同じ元データで、グラフエリアのサイズ変更を行ったものとそうでないものと複数作成しましたが、やはり変更したもののグラフでVBが止まるようでした。
原因はいまいち分からないのですが、サイズ変更さえしなければエラーは出ないので、ひとまずサイズ変更無しのグラフで運用するようにすることにしました。

ちなみに、該当のグラフ(ファイル)は2000で作ったもので、2003で参照しているのですが、そちらはあまり関係がないでしょうか。。
また、大量のグラフをコピー&ペーストして作っているため、修正時にフォントエラー(p://support.microsoft.com/kb/215573/ja)も頻発していたため、グラフ内に見えない変なデータが残ってしまっているような気も致します。

またまたお返事が遅れましたが、スクリプトを教えてくださり、ありがとうございました!!
また、よろしくおねがいします。

4290 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free