アプリ版:「スタンプのみでお礼する」機能のリリースについて

グラフのサイズを揃えたいのでVBAを使っていたのですが、数値軸の最大値などが異なる際は、
プロットエリアでは、幅が揃えられません。というのも、色々試した結果・・・
プロットエリアサイズは、数値軸の文字左側からグラフの右端までの長さを規定しているようなのです。
そこをグラフの箱部分のサイズを揃えることを可能にできないでしょうか?

'// データを取得
With ActiveChart
chtH = .Parent.Height
chtW = .Parent.Width
chtPH = .PlotArea.Height
chtPW = .PlotArea.Width
End With

現在上記のマクロで調整したグラフからサイズを取得し、他のグラフのデータを書き換えるという
マクロを組んでいます。参考までにグラフを載せておきます。
この2つのグラフは、このマクロを使って揃えましたが、最大値が異なるため横幅が揃いません。
最大値を揃えると横幅が綺麗に揃います。しかしそのようにするとグラフが見難くなるためできません。

どなたかアドバイスをお願いします。
手動で揃えるには、大変な量なので・・・

「グラフのサイズを揃えたいのでVBAを使っ」の質問画像

A 回答 (3件)

>回答番号:No.2 この回答への補足


>.InsideLeftなどは、取得のみで設定ができないようなのですが
>書いて頂いたものも、やはりエラーで回りません。
「エラーになる」という報告だけでなく、その内容と発生行を教えて頂くと状況把握の一助になります。
しかし、残念ながらExcel2003を持っていないので確認することができません。

試しに、私が提示したコードで、Insideという文字列を全て外してみればどうなりますか。
≪例≫
piw = ActiveChart.PlotArea.InsideWidth
pil = ActiveChart.PlotArea.InsideLeft

piw = ActiveChart.PlotArea.Width
pil = ActiveChart.PlotArea.Left
とか
With ActiveChart.PlotArea
.InsideLeft = mxpil
.InsideWidth = piw - (mxpil - pil)
End With

With ActiveChart.PlotArea
.Left = mxpil
.Width = piw - (mxpil - pil)
End With
のようにして試してみてください。

あと、gen_sailさんが書かれたコードでは、PlotAreaのサイズを設定するだけになっています。
座標(PlotArea.Left、PlotArea.Top)を考慮する必要があると思います。
更に、数値軸ラベルの桁数による差を吸収する手立てを考えなければならないと思います。
    • good
    • 0

ActiveChart基準で書いてみました。


グラフは
同一ワークシート上にある複数の埋め込みグラフ
を対象にしています。
Excelのバージョンは問題ないと思います。
試してみてください。

Dim cht As ChartObject
Dim piw As Double
Dim pil As Double
Dim mxscl As Double
Dim mxpil As Double

piw = ActiveChart.PlotArea.InsideWidth
pil = ActiveChart.PlotArea.InsideLeft

For Each cht In ActiveSheet.ChartObjects
With cht.Chart
If mxscl < .Axes(xlValue).MaximumScale Then
.PlotArea.InsideLeft = 0
mxpil = .PlotArea.InsideLeft
mxscl = .Axes(xlValue).MaximumScale
End If
End With
Next

With ActiveChart.PlotArea
.InsideLeft = mxpil
.InsideWidth = piw - (mxpil - pil)
End With

For Each cht In ActiveSheet.ChartObjects
cht.Width = ActiveChart.Parent.Width
cht.Height = ActiveChart.Parent.Height
With cht.Chart.PlotArea
.InsideLeft = mxpil
.InsideTop = ActiveChart.PlotArea.InsideTop
.InsideWidth = ActiveChart.PlotArea.InsideWidth
.InsideHeight = ActiveChart.PlotArea.InsideHeight
End With
Next

Web上で拾われたコードなら、ソース元のURLを貼っていただくと良かったと思います。
あるいは、編集中のコードがあるなら、コード全体を提示し相談して頂く方が良いと思います。

この回答への補足

≫xls88さん
わざわざ記述頂きありがとうございます。
前の細くにも書かせて頂きましたが、.InsideLeftなどは、取得のみで設定ができないようなのですが
書いて頂いたものも、やはりエラーで回りません。

現状以下のように記述しています。

Sub SameSize_Set()

Dim chtH As Double '// 基準のグラフの高さ
Dim chtW As Double '// 基準のグラフの幅
Dim chtPH As Double '// 基準のプロットエリアの高さ
Dim chtPW As Double '// 基準のプロットエリアの幅
Dim cot As Integer '// グラフのカウンタ
Dim cht As Object '// 処理をする対象のグラフ

'// データを取得
With ActiveChart
chtH = .Parent.Height
chtW = .Parent.Width
chtPH = .PlotArea.Height
chtPW = .PlotArea.Width
End With

'グラフ、プロットエリアの高さ/幅を揃える
For Each cht In ActiveSheet.ChartObjects
With cht
.Height = chtH
.Width = chtW
.Chart.PlotArea.Height = chtPH
.Chart.PlotArea.Width = chtPW
End With
Next

End Sub

補足日時:2010/01/13 16:12
    • good
    • 0

Excel2007で確認しています。


PlotAreaには
InsideLeft
InsideTop
InsideWidth
InsideHeight
があります。これを使ってサイズを決めた方が良いようです。

ActiveChartを基準にするとして
(ChartObjectsのIndexとか名前を使えばActivateしないコードに出来ます)
各グラフの数値軸の最大値を比較しその最大値を取得
最大値のグラフのPlotAreaのInsideLeftを基準にする
ActiveChartのPlotAreaのInsideWidthを最大値のグラフのPlotAreaのInsideLeftを基準に補正する。
その後ActiveChartのPlotAreaのInside・・・値を基準にする。

大雑把な回答ですがこんなことでどうでしょうか。
質問文で提示されたコードがかける御方ですから大丈夫だと思います。

この回答への補足

すみませんバージョンを表記し忘れましたが、Excel2003でやりたいと思っています。

InsideLeft
InsideTop
InsideWidth
InsideHeight

このコードは、先日発見したのですが・・・取得のみで設定ができないようです。
手元に2007がないため確認できていませんが、2007では設定が可能なのでしょうか?
インターネットで検索したのですが、残念ながら見つけられずよろしければ教えて頂けますか。
お願いします。

補足日時:2010/01/04 11:51
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています