Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
散布図の凡例のうち空白の系列を消す
投稿日時: 18/05/26 18:42:17
投稿者: naoya-007

散布図の凡例のうち、空白の系列を以下のVBAで消していました。(Excel2002)
Excel2016でも同様に空白の系列は凡例に表示しないようにしたいのですが、
どなたかご教授頂けますでしょうか?
------------------------------------------------------------------------
Sub グラフ変更()
 
 Dim bb As Integer
 For bb = 1 To 12
  
 
 'グラフの文字サイズを1(最小)にする。
 '散布図の系列が多いので、グラフ文字サイズを小さくしないと全部表示できないので
 '空白の系列を完全に消去できない場合がある。
    ActiveSheet.ChartObjects("グラフ " & bb).Activate
    ActiveChart.ChartArea.Select
    Selection.Font.Size = 1
 
    Dim V As Variant
    Dim i As Integer
     
    With ActiveSheet.ChartObjects("グラフ " & bb).Chart
        On Error Resume Next
        .Legend.Delete
        .HasLegend = True
        On Error GoTo 0
          
        For i = .SeriesCollection.Count To 1 Step -1
            On Error Resume Next
            V = .SeriesCollection(i).Values
            If Err.Number <> 0 Then
                .Legend.LegendEntries(i).Delete
            End If
            On Error GoTo 0
             
        Next
         
        'プロットエリアの幅・高さを変更
        .PlotArea.Width = 1000
        .PlotArea.Height = 1000
         
    End With
     
 'グラフの文字サイズを元に戻す。(任意サイズ)
    ActiveSheet.ChartObjects("グラフ " & bb).Activate
    ActiveChart.ChartArea.Select
    Selection.Font.Size = 8
 'グラフの凡例位置の調整
    ActiveChart.Legend.Select
    Selection.Left = 250
    Selection.Top = 200
    Range("A1").Select
     
 Next
 
End Sub

回答
投稿日時: 18/05/26 21:53:38
投稿者: simple

Excel2016ではどうなってしまうのか説明をしてください。
エラーが出るなら、エラーメッセージを、
想定と異なるなら、想定と現実を説明してください。

投稿日時: 18/05/26 22:01:35
投稿者: naoya-007

Excel2007と2016では、全ての凡例(空白の系列も)が表示されてしまいます。
空白の系列以外を凡例に表示するように間引きたいのですが・・

回答
投稿日時: 18/05/26 22:12:35
投稿者: simple

了解。
 
空白の系列というのは、x,yともにセルがブランクになっているということですか?
 
その系列に対して
>V = .SeriesCollection(i).Values
の値がどうなっているのか調べていますか?
その値で判定できませんか?

投稿日時: 18/05/26 22:34:38
投稿者: naoya-007

x,yともに、#N/A になっています。
 
→この辺りがポイントだと思うのですが・・知識不足で悩んでいます。
            V = .SeriesCollection(i).Values
            If Err.Number <> 0 Then
                .Legend.LegendEntries(i).Delete

回答
投稿日時: 18/05/26 22:42:48
投稿者: simple

ステップ実行して、Vの値がどうなっているのか調べてみてはどうですか?

投稿日時: 18/05/26 23:08:55
投稿者: naoya-007

ステップ実行すると、2007は、これを 選択せずに進んでしまいます。
.Legend.LegendEntries(i).Delete

回答
投稿日時: 18/05/26 23:20:45
投稿者: simple

それはそうでしょう。
その系列のVは何でしたか?
ステップ実行したときに、ローカルウインドウでVの値がわかると思うんですが。

投稿日時: 18/05/26 23:31:02
投稿者: naoya-007

こんな感じなのですが・・
 
Excel2002
: V : Empty 値 : Variant/Empty
 
Excel2007
 : V : : Variant/Variant(1 to 21)
: V(1) : Empty 値 : Variant/Empty

: V(21) : Empty 値 : Variant/Empty

回答
投稿日時: 18/05/26 23:39:17
投稿者: simple

え?
系列の数はいくつあるんですか?
V(1)からV(21)まであるって本当ですか?
特定のi を指定して、
V = .SeriesCollection(i).Values
としているんですよね。

投稿日時: 18/05/26 23:44:29
投稿者: naoya-007

系列は40あります。
ステップ実行すると、Excel2002では、以下の .Legend.LegendEntries(i).Delete の後に空白の系列の凡例が消えて行きます。
 
        For i = .SeriesCollection.Count To 1 Step -1
            On Error Resume Next
            V = .SeriesCollection(i).Values
            If Err.Number <> 0 Then
                .Legend.LegendEntries(i).Delete
            End If
            On Error GoTo 0
        Next
 
Excel2007では、 .Legend.LegendEntries(i).Delete をスキップ?なのか、選択せずに End Ifに進んでしまうようです。

回答
投稿日時: 18/05/27 00:06:09
投稿者: simple

エラーにならずにスキップするという事象は、
何度も書かなくてもわかっています。
 

    V = .SeriesCollection(i).Values
    If IsEmpty(V(1)) Then
        .Legend.LegendEntries(i).Delete
    End If

とでもしてみたらいかがですか?
 
# 1〜21というのが理解できないのですがね。
# 系列の数でもないと言うことですし。

投稿日時: 18/05/27 00:56:58
投稿者: naoya-007

無事解決しました。
ありがとうございました。