[[20201223100521]] 『折れ線グラフの色をマクロで設定する』(しのみや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『折れ線グラフの色をマクロで設定する』(しのみや)

 折れ線グラフを作成し、系列1と系列2の書式設定を設定するマクロの記録を取りました。

 凡例で表すと
  系列1は -■- (赤)
  系列2は -×- (青) このような感じです。

 【記述】
 ’系列1
 Sub Macro1()

     With Selection
         .MarkerStyle = 2
         .MarkerSize = 7
     End With
     Selection.MarkerStyle = 1
     With Selection.Format.Fill
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Solid
     End With
     With Selection.Format.Fill
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Transparency = 0
         .Solid
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Transparency = 0
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Transparency = 0
     End With
 End Sub

 '系列2
 Sub Macro2()

     With Selection
         .MarkerStyle = 1
         .MarkerSize = 7
     End With

     Selection.MarkerStyle = -4168
     Selection.Format.Fill.Visible = msoFalse
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(0, 112, 192)
         .Transparency = 0
     End With
     With Selection.Format.Line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(0, 112, 192)
     End With
     With Selection.Format.Line
         .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 112, 192)
         .Transparency = 0
     End With
 End Sub

 系列1を選択し、Macro2を動かした後 Macro1を動かすと
 マーカーの塗りつぶしがなしになって
 -□-このようになります。

 ひとつ前の設定が残っている状態のような気がするのですが、
 検証してもしっかりとつかめなくてハテナです…

 どのようにしたらよいでしょうか

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 ホントだー。言う事きいてくんないですね。

 なんかそもそも[マクロの記録]で生成されたコード自体 「ウソを吐き出している」
 とまでは言わないですけど「怪しい」感じがします。
 2010特有の現象なのかな? (私も2010ユーザーなので他のバージョンがわからない)

 Point単位で個別に設定してもClearFormatsしても
 一旦MarkerStyleをxlMarkerStyleAutomaticにしても出てこないです。

 塗りつぶし部分をMarkerBackgroundColorとMarkerForegroundColorで操作すれば
 近い感じにはなりましたけど、多分正解じゃないですね。

    Sub Test1()
        If TypeName(Selection) <> "Series" Then Exit Sub
        With Selection
            .MarkerStyle = xlMarkerStyleSquare
            .MarkerSize = 7
            .Format.Line.ForeColor.RGB = &HFF&
            .MarkerBackgroundColor = &HFF&
            .MarkerForegroundColor = &HFF&
        End With
    End Sub

    Sub Test2()
        If TypeName(Selection) <> "Series" Then Exit Sub
        With Selection
            .MarkerStyle = xlMarkerStyleX
            .MarkerSize = 7
            .Format.Line.ForeColor.RGB = &HC07000
            .MarkerBackgroundColorIndex = xlColorIndexNone
            .MarkerForegroundColor = &HC07000
        End With
    End Sub

(白茶) 2020/12/23(水) 14:35


 マクロの記録を頼りにしてましたので…
 どんくさいもので検証にン時間溶かしました。

 いただいた記述で必要な結果が得られました。
 しかも見やすくなって助かります。
(しのみや) 2020/12/23(水) 15:50

 頂いた記述をもとに、以下のような記述にしました。

 Dim StrRGB As String
 SrRGB = RGB(0, 112, 192)

 Select Case Selection.MarkerStyle

  Case 2, 1, 3, 8, '◆・■・▲・●
    With Selection
       .Format.Line.ForeColor.RGB = StrRGB
       .MarkerBackgroundColor = StrRGB
       .MarkerForegroundColor = StrRGB
    End With

  Case -4168, 5, 9, -4118 '×・*・+・−
    With Selection
       .Format.Line.ForeColor.RGB = StrRGB
       .MarkerBackgroundColorIndex = xlColorIndexNone
       .MarkerForegroundColor = StrRGB
    End With

  Case -4142 'なし
    With Selection
       .Format.Line.ForeColor.RGB = StrRGB
    End With

  Case -4105  '自動マーカー              

 End Select

 ここでCase -4105の自動マーカーの場合、
 もとのMarkerStyleのまま色を変えるという動きにしたいのです。
 しかしもとのMarkerStyleというものが、取ってこれない状態です。
 取ってくる方法はありますか?
(しのみや) 2020/12/25(金) 11:52

 MarkerStyleがxlMarkerStyleAutomaticの時、実際どんな形のマーカーが適用されているのか知りたい
 と言う事ですよね?

 それに寄って、
 MarkerForegroundColor(輪郭色)だけ変えれば良いのか、
 MarkerBackgroundColor(ベタ色)も変えないといけないのかが判断出来ない。と。

 すみませんが私は直接取得する方法は存じません。
 (法が有るのか無いのか知りません って意味ですよ)

 実際方法が無かったとして、
 それでも、たぶん適用される順番は決まってるんでしょうから、
 その系列がSeriesCollectionの何番目の系列なのかを数えて判断すれば、
 何とかなりそうな気もしますね...

(白茶) 2020/12/25(金) 12:32


 ご丁寧にありがとうございます。
 感謝です。
(しのみや) 2020/12/25(金) 15:16

    「何とかなりそうな」ついでに何とかしてくれそうな関数書いてみました。

    Rem 選択中の系列の系列番号を取得する関数
    Function SelSeriesId() As Long
        If TypeName(Selection) <> "Series" Then Exit Function
        Dim s As Series, i As Long
        For Each s In Selection.Parent.SeriesCollection
            i = i + 1
            If Selection.Name = s.Name Then Exit For
        Next
        SelSeriesId = i
    End Function

    Rem 系列番号に対応する既定マーカースタイルを返す関数(ウチの2010はこの順番だった)
    Function GetDefaultMarkerStyle(SeriesId As Long) As XlMarkerStyle
        Select Case (SeriesId - 1) Mod 9 + 1
            Case 1: GetDefaultMarkerStyle = xlMarkerStyleDiamond
            Case 2: GetDefaultMarkerStyle = xlMarkerStyleSquare
            Case 3: GetDefaultMarkerStyle = xlMarkerStyleTriangle
            Case 4: GetDefaultMarkerStyle = xlMarkerStyleX
            Case 5: GetDefaultMarkerStyle = xlMarkerStyleStar
            Case 6: GetDefaultMarkerStyle = xlMarkerStyleCircle
            Case 7: GetDefaultMarkerStyle = xlMarkerStylePlus
            Case 8: GetDefaultMarkerStyle = xlMarkerStyleDot
            Case 9: GetDefaultMarkerStyle = xlMarkerStyleDash
        End Select
    End Function

(白茶) 2020/12/25(金) 15:59


 >もとのMarkerStyleのまま色を変えるという動きにしたいのです。
 >しかしもとのMarkerStyleというものが、取ってこれない状態です。
 >取ってくる方法はありますか?

とる必要があるのかな?

Sub test2()

    Dim p As Point

    On Error Resume Next
    Set p = Selection
    On Error GoTo 0
    If p Is Nothing Then Exit Sub

    With p
        .MarkerBackgroundColor = vbBlue
        .MarkerForegroundColor = vbBlue
        .Format.Line.ForeColor.RGB = vbBlue

        If .MarkerStyle <> xlMarkerStyleAutomatic Then
            .MarkerStyle = IIf(.MarkerStyle = 1, 2, 1)
        End If
    End With
End Sub

コピペじゃなく手入力してみてください。
(まっつわん) 2020/12/25(金) 17:27


 ありがとうございます。

 頂いた記述を理解していたところ、
 Selection.PlotOrderというものに気が付いたので、
 そちらで系列番号をとってきて振り分ける方法を試しています。
 まだ検証中ではありますが、ひとまずこちらで問題なさそう…

Case -4105 '自動マーカー

  Select Case (Selection.PlotOrder - 1) Mod 9 + 1

   Case 1, 2, 3, 6, 8, 9, 10
          '◆・■・▲・●・-

   Case 4, 5, 7
          '×・*・+・−
End Select

(しのみや) 2020/12/28(月) 14:47


Dim j As Integer
 With ActiveSheet.Shapes("グラフ 1")
    For j = 1 To .Chart.FullSeriesCollection.Count
        With .Chart.FullSeriesCollection(j)
            Debug.Print .MarkerStyle, .MarkerSize
            Debug.Print .MarkerForegroundColor, .MarkerBackgroundColor
            With .Format.Line
                Debug.Print .ForeColor, .Transparency
            End With
        End With
    Next
 End With
(ふむ〜) 2020/12/28(月) 17:43

 ふむ〜さんありがとうございます

 頂いた記述をModule1に貼り付けて動かしてみると

 For j = 1 To .Chart.FullSeriesCollection.Count
 ここのところで、
 実行時エラー438
 オブジェクトはこのプロパティまたはメソッドをサポートしていません。
 となりました。

 なにか私のやりかたが悪いのでしょうか…
(しのみや) 2020/12/29(火) 16:51

こちらは office365 なので環境が違いました。
.Chart.SeriesCollection は行けるでしょうか

  Sub marker()
  Dim j As Integer
  Dim c As Object, a As Object
   With ActiveSheet.Shapes("グラフ 1")
    Set a = .Chart
    Debug.Print "ChartType"; .Chart.ChartType
    'For Each c In .Chart.FullSeriesCollection
    For Each c In .Chart.SeriesCollection
        With c
            Select Case .ChartType
            Case xl3DLine '3D折れ線
             ' 無効  .MarkerStyle  .MarkerSize
                Debug.Print .Name
                With .Fill
                    Debug.Print "Fill "; .Type, .ForeColor.RGB, .BackColor.RGB
                End With
                With .LeaderLines
                    'Debug.Print "LeaderLines"
                    'With .Bordor
                    '    Debug.Print "  Border "; .LineStyle, .Color, .Weight
                    'End With
                    With .Format.Line
                        Debug.Print "  ForeColor "; .ForeColor.RGB, .ForeColor.Brightness
                        Debug.Print "  BackColor "; .BackColor.RGB
                    End With
                End With
            Case Else '他の折れ線グラフ
                Debug.Print "マーカー"; .MarkerStyle, .MarkerSize
                Debug.Print "マーカー色"; .MarkerForegroundColor, .MarkerBackgroundColor
                With .Format.Line
                    Debug.Print "ライン"; .ForeColor, .Transparency
                End With
            End Select
        End With
    Next
   End With
 End Sub
(ふむ〜) 2020/12/30(水) 20:16

 白茶さん ありがとうございます
 系列で判断する方法を教えて頂き、規則があることも教えて頂き助かりました。
 私では気が付かなくてあきらめていたと思います…

 まっつあんさん ありがとうございます
 グラフの要素をクリックしてから、ステップインで動かしておりまして

 選択されているグラフ要素の塗りつぶしを青色にする
 選択されているグラフ要素の枠を青色にする
 選択されているラインを青色にする

 自動マーカーでない場合
 マーカースタイルが1であれば、マーカースタイルを2に それ以外は1にする

 といった動きだと理解しました…

 自動マーカーの場合で、*と×と-の場合塗りつぶされてしまうので、
 対処したいという状態でした。

 ふむ〜さん ありがとうございます
 自動マーカーどうこう関係なしに、グラフのタイプと塗りつぶしの色・枠線・マーカーの色といった
 状態を取ってこれるのでしょうか…

 系列8までのデータでマーカー付き折れ線でグラフ1を作って、 
 この記述を動かすとイミディエイトウィンドウに
 ChartType 65 
 マーカー -4105   7
 マーカー色-1 -1
 ライン16777215 -2.147484E+09
 こちらが8回繰り返し表示されています。

 手動で設定したグラフの系列は正しく入ってきているようです。

 すみません。
 自動マーカーは手動マーカーと同じようには
 取ってこれないのではないかと思っているのです。
 私の検証も慣れてなくてアタフタしておりまして、あまり自信がないのですが…

 ひとまずなんですが…2020/12/28(月) 14:47のSelection.PlotOrderというので問題なさそうでした。
(しのみや) 2021/01/04(月) 16:51

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.