前提・実現したいこと
未だ研究室に属していない学生の身分ですのでレポート作成においてグラフを描画するには専らExcelを用いています.科学的なグラフではデータの位置を表すプロットの上を線が通るか通らないかということは大きな意味を持ちます.プロットより表面に線が来ていれば,それはそのプロットを確実に線が通っているということを意味し,逆に線がプロットの背面であればプロットを通っているとは言えず,近似的な意味を持ちます.しかし,Excelの近似曲線では系列より表面に描画されてしまい,"近似"ではなくなってしまいます.近似式を取得して近似曲線の系列を作り,マーカーなしにしてマーカー同士を結べば元のデータ系列のマーカー背面に位置させることができますが,科学実験で得られるデータは不規則なことやデータ間が広いことがしばしばあり,結ばれる線がヨレヨレに見えることがあります.理論的には近似曲線の系列を十分に細かくとってやれば滑らかに見えますが,どんな場合でも滑らかに見えるような区切り方となると無限に細かくせざるを得ません.当然そんなことをすればExcelもPCも悲鳴をあげます.そこで白抜きにしたいグラフを複製し,片方をマーカーのみ,もう片方をマーカー以外見えるようにして背景の塗りつぶしを無くしてぴったり重ねる方法を取ります.ぴったり重ねるにはグラフシートにマーカー以外を表示しているグラフを移動させ,そこにオブジェクトとしてマーカーのみのグラフを移動させて,最大化しています.
Rなら白抜きプロットは簡単にできるのですが,細かな体裁の調整はExcelの方が簡易で,VBAのコードもほぼ完成に近いためこのままExcelで成し遂げたいと思います.
発生している問題・エラーメッセージ
実は上記の手法をVBAで書くことは下記のコードでほぼ達成されています.現在問題となっているのは2つ以上の系列に近似曲線を描画し,凡例をグラフに重ねずに付けた上で下記のコードを実行すると,重ね合わせるグラフがずれてしまうことです.
原因はマーカーのみ表示のグラフの方で近似曲線を透明化して凡例に表示されている近似曲線も透明化された際,Excelが要らぬ気を利かせて凡例の幅を自動調整し,結果としてプロットエリアの幅が広くなり,マーカー以外表示のグラフとずれてしまうことです.「近似曲線を透明化しても凡例の近似曲線はそのまま」や「凡例の自動調整を無効にする」などこの問題の解決に妙案ありましたらご教授頂けますでしょうか.
該当のソースコード
VBA
1Option Explicit 2Sub Macro1() 3Dim PlotCha As ChartObject 4Dim LineCha As ChartObject 5Dim OriginSh As Worksheet 6Dim LineName As String 7'On Error Resume Next 8 Set LineCha = ActiveChart.Parent 9 LineName = LineCha.Name 10 Set OriginSh = ActiveSheet 11 If LineCha Is Nothing Then 12 MsgBox "白抜きプロットにするグラフを選んでから実行してください.", Title:="手順ミス" 13 Exit Sub 14 End If 15 LineCha.Chart.ChartArea.Copy 16 Range("A1").Select 17'Application.ScreenUpdating = False 18 OriginSh.Paste 19 Set PlotCha = Selection.Parent.Parent 20Dim PlotName As String 21 PlotName = LineName & "Copy" 22 PlotCha.Name = PlotName 23 With OriginSh.Shapes(LineName) 24 .Fill.Visible = msoFalse 25 .Line.Visible = msoFalse 26 End With 27 With LineCha.Chart 28Dim i As Long 29 For i = 1 To .FullSeriesCollection.Count 30 .FullSeriesCollection(i).MarkerStyle = xlMarkerStyleNone 31 Next i 32Dim ChartSh As String 33 ChartSh = "Sheet_" & LineName 34 .Location xlLocationAsNewSheet, Name:=ChartSh 35 End With 36 With OriginSh.Shapes(PlotName) 37 .Fill.Visible = msoFalse 38 .Line.Visible = msoFalse 39 End With 40 With PlotCha.Chart 41 .ChartArea.Format.TextFrame2.TextRange.Font.Fill.Transparency = 1 42 With .Axes(xlCategory) 43 .MajorGridlines.Format.Line.Visible = msoFalse 44 With .Format 45 .Line.Visible = msoFalse 46 .Fill.Visible = msoFalse 47 End With 48 End With 49 With .Axes(xlValue) 50 .MajorGridlines.Format.Line.Visible = msoFalse 51 With .Format 52 .Line.Visible = msoFalse 53 .Fill.Visible = msoFalse 54 End With 55 End With 56Dim j As Long 57 For j = 1 To .FullSeriesCollection.Count 58 With .FullSeriesCollection(j) 59Dim k As Long 60 For k = 1 To .Trendlines.Count 61 .Trendlines(k).Format.Line.Visible = msoFalse 62 Next k 63 End With 64 .FullSeriesCollection(j).Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1 65 Next j 66 .Location xlLocationAsObject, Name:=ChartSh 67 End With 68 With Sheets(ChartSh).Shapes(PlotName) 69 .ScaleWidth 2.0341434821, msoFalse, msoScaleFromTopLeft 70 .ScaleHeight 2.2135414844, msoFalse, msoScaleFromTopLeft 71 'マクロの記録で得られた値ですが,この数値で良いのか,また,そもそもメソッドとして最大化の(マーカー以外表示グラフのサイズに合わせる)方法はないのか思案中です. 72 End With 73 ActiveChart.ChartArea.Copy 74 OriginSh.Pictures.Paste.Select 75'Application.ScreenUpdating = True 76End Sub
試したこと
凡例をグラフに重ねて表示しているものに上記コードを実行するとずれることはありません.また,凡例をグラフに重ねずに表示しているものに上記コードを実行後,グラフシートに作成されたマーカーのみのグラフの幅を少し狭めるとマーカーが正しい位置に来る点があります.これらのことから,やはり凡例の幅が縮まったことによってプロットエリアの幅が広くなり,重ねた際のズレを生み出していると考えられます.実際,適当なグラフを作って凡例をグラフに重ねずに表示し,近似曲線を手動で透明化するとプロットエリアが広くなる様子が見て取れます.
補足情報(FW/ツールのバージョンなど)
PC
MacBook Air,Intel Core i5-5250U,Boot CampによりWindows 10 Homeにて運用
Excel
2016 32ビット,バージョンは最新の状態
###追記1
回答を受けまして,「変更点」と示した部分に設定された色を取得して再設定するコードを付加しました.2020年8月25日17時01分
VBA
1Option Explicit 2Sub Macro1() 3Dim PlotCha As ChartObject 4Dim LineCha As ChartObject 5Dim OriginSh As Worksheet 6Dim LineName As String 7'On Error Resume Next 8 Set LineCha = ActiveChart.Parent 9 LineName = LineCha.Name 10 Set OriginSh = ActiveSheet 11 If LineCha Is Nothing Then 12 MsgBox "白抜きプロットにするグラフを選んでから実行してください.", Title:="手順ミス" 13 Exit Sub 14 End If 15 LineCha.Chart.ChartArea.Copy 16 Range("A1").Select 17'Application.ScreenUpdating = False 18 OriginSh.Paste 19 Set PlotCha = Selection.Parent.Parent 20Dim PlotName As String 21 PlotName = LineName & "Copy" 22 PlotCha.Name = PlotName 23 With OriginSh.Shapes(LineName) 24 .Fill.Visible = msoFalse 25 .Line.Visible = msoFalse 26 End With 27 With LineCha.Chart 28Dim i As Long 29 For i = 1 To .FullSeriesCollection.Count 30 .FullSeriesCollection(i).MarkerStyle = xlMarkerStyleNone 31 Next i 32Dim ChartSh As String 33 ChartSh = "Sheet_" & LineName 34 .Location xlLocationAsNewSheet, Name:=ChartSh 35 End With 36 With OriginSh.Shapes(PlotName) 37 .Fill.Visible = msoFalse 38 .Line.Visible = msoFalse 39 End With 40 With PlotCha.Chart 41 .ChartArea.Format.TextFrame2.TextRange.Font.Fill.Transparency = 0.99 42 With .Axes(xlCategory) 43 .MajorGridlines.Format.Line.Visible = msoFalse 44 With .Format 45 .Line.Visible = msoFalse 46 .Fill.Visible = msoFalse 47 End With 48 End With 49 With .Axes(xlValue) 50 .MajorGridlines.Format.Line.Visible = msoFalse 51 With .Format 52 .Line.Visible = msoFalse 53 .Fill.Visible = msoFalse 54 End With 55 End With 56Dim j As Long 57 For j = 1 To .FullSeriesCollection.Count 58 With .FullSeriesCollection(j) 59Dim k As Long 60 For k = 1 To .Trendlines.Count 61 With .Trendlines(k).Format.Line 62Dim LineCol As Variant 63 LineCol = .ForeColor 64 .ForeColor.RGB = RGB(LineCol Mod 256, Int(LineCol / 256) Mod 256, Int(LineCol / 256 / 256)) '変更点 65 .Transparency = 0.99 66 End With 67 Next k 68 End With 69 .FullSeriesCollection(j).Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1 70 Next j 71 .Location xlLocationAsObject, Name:=ChartSh 72 End With 73 With Sheets(ChartSh).Shapes(PlotName) 74 .ScaleWidth 2.0341434821, msoFalse, msoScaleFromTopLeft 75 .ScaleHeight 2.2135414844, msoFalse, msoScaleFromTopLeft 76 End With 77 ActiveChart.ChartArea.Copy 78 OriginSh.Pictures.Paste.Select 79'Application.ScreenUpdating = True 80End Sub
###追記2
実際のグラフは動作確認用ですが以下のような感じです.2020年8月25日17時14分
データ
マクロ実行前に選択されるグラフ
実行後にグラフシートにて背面に来るグラフ(マーカー以外表示グラフ)
実行後にグラフシートにて表面に来るグラフ(マーカーのみ表示グラフ)
実行前グラフの近似曲線の色を取得して,同色を単色として再設定し,透明度99%に設定
グラフシートにて重なった2つのグラフ
###追記3
追記1の通り一応望むものはごり押しでできました.今暫く回答受付中にしますので,これよりスマートな記述法がありましたらご教授願います.これが最適である場合にはその旨を教えて下さると幸いです.2020年8月25日17時18分
###追記4
追記2にて重なったグラフ(完成グラフ)を載せるのを忘れていましたので修正しました.2020年8月25日17時22分
回答3件
あなたの回答
tips
プレビュー