[[20120605091921]] 『散布図のX軸とY軸の目盛りの間隔を同じにしたい』(rin.t) ページの最後に飛ぶ

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

 

『散布図のX軸とY軸の目盛りの間隔を同じにしたい』(rin.t)

 Excel2003,Windows7

 タイトルの通り、散布図でX軸とY軸の目盛りの間隔を同じにする方法が分かりません。
 ここでいう間隔を同じにするというのは、例えば点(0,0)と点(5,5)を通る
 傾き1の直線を描くとグラフ上で45°になるようにしたいという意味です。

 現在は、オートシェイプの直線をShiftを押しながら45°の線を引き、
 グラフの上に重ね合わせて微調整しています。

 もっといい方法はないでしょうか?

 (0,0)(5,5)の系列(ダミーデータ)を増やし、直線で結ぶ。
 X,Y軸の最大値を揃える。
 プロットエリアの高さと幅をVBAで同じにする。
   VBAはマクロの記録で簡単に出来ると思います。
    プロットエリアを選択した状態で
    ●記録開始
    テキトーに、高さと幅を変更
    ■記録終了
    コードを開いて、二ヶ所の値を同じにする
    プロットエリアを選択して、先ほど作ったマクロを実行。

 と、それなりには成るのではないかと思いますが。。。

 (HANA)

 お返事ありがとうございます。長文失礼します。
 VBAは殆ど触ったことがないので感覚で修正し実行しました。
 また会社PCで調べているのですが、ガードがかかるサイトが殆どなので、
 なかなか効率よく調べることができません。

 >(0,0)(5,5)の系列(ダミーデータ)を増やし、直線で結ぶ。
 この作業の意図はどういうところにあるのでしょうか?

 アドバイス頂いた方法でマクロ記録を行うと以下のようになりましたので、
 WidthとHeightを同じ値にして実行してみました。
 Sub プロットエリア調整()
     Selection.Width = 100
     Selection.Height = 100
     Selection.Top = 14
 End Sub

 結果、目的の形状に近づきましたが、以下不明な点があります。

 1.オートシェイプの45°の直線を目盛りの交点に重ねると微妙にズレがあります。
 2.表示の縮小(100%→50%)を行うとプロットエリアの形が正方形から長方形に変わります。
 3.表示の拡大(100%→200%)、縮小(200%→100%)行ったあとに上記マクロを実行すると
   リサイズされるのでプロットエリアの形状がかわっています。
 4.また、当然ですがグラフエリアが目的のプロットエリアサイズ以上でないと、
   目的のプロットエリアサイズにならないので、予め、グラフエリアを大きくとって、
   マクロを実行しプロットエリアをサイズ調整していますが、
   以下を繰り返すことになるので少し手間に感じています。
    プロットエリアを調整する(マクロ実行)
    グラフエリアが大きすぎるので小さくする
    プロットエリアも小さくなる
   そこでグラフエリアも調整するマクロを記録して以下を得ました。 

   Sub グラフエリア調整()
      ActiveSheet.Shapes("グラフ 148").ScaleWidth 1.09, msoFalse, msoScaleFromTopLeft
      ActiveSheet.Shapes("グラフ 148").ScaleHeight 1.11, msoFalse, msoScaleFromTopLeft
   End Sub

   こちらもWidthとHeightを揃えればグラフエリアも揃えることが出来ると思いますが、
   よくよく考えてみると、最適なグラフエリアのサイズは上記の様に、
   グラフエリアをプロットエリアを何度も調整しないと分からないため大変です。
   最適なグラフエリアのサイズを取得する方法はないでしょうか。
   また上記マクロには"グラフ 148"とあり、恐らく現在作業中のエクセルブック?の中の
   148個目のグラフにのみ適用できるマクロだと思いますが、任意(例えば選択したグラフ)に
   変更することはできないでしょうか?

 以上、よろしくお願いします。

 (rin.t)

 >>(0,0)(5,5)の系列(ダミーデータ)を増やし、直線で結ぶ。
 >この作業の意図はどういうところにあるのでしょうか?
 失礼しました、これじゃ意味が分からないですよね。。。
 「直線で結ぶ」ではなく
 系列の書式設定のパターンで 線を表示し
         マーカーを なし
 にする事を想定して居ました。

 すると45°の直線になる(予定)なので、オートシェイプを重ねなくても
 良くなると思いました。

 が。。。直線は原点を通る訳では無いっぽいですね。
 値は適宜変更してもらえると良いと思います。

 他の事に関しては 基本的に良く分かりません。
 私の認識としては、所詮簡易的にしか仕様出来ないと思っています。
 特にエクセル上で「見た目」や「印刷したとき」の精度は非常に劣ると思っています。

 表示の縮小・拡大は どうしても必要でしょうか?
 グラフのサイズは各々違うのでしょうか?

 たたき台として、まずはこの程度ではどうでしょう?

 '------
Sub グラフサイズ変更()
    Dim プロットエリア As Double
    If Not ActiveChart Is Nothing Then
        MsgBox "グラフをアクティブにして下さい。"
    Else
        With ActiveChart
            With .Parent
                    'グラフ幅を グラフ高さ+40 のサイズに変更
                .Width = .Height + 40
                プロットエリア = .Height * 0.9
            End With
            With .PlotArea
                    'プロットエリアの幅を グラフ高さ*90%のサイズに変更
                .Width = プロットエリア
                    'プロットエリアの高さを グラフ高さ*90%のサイズに変更
                .Height = プロットエリア
            End With
        End With
    End If
End Sub
 '------

 自動調整されたり、されなかったりする部分が有ると思いますので
 実用までにはまだ変更が必要だとは思いますが
 一旦リサイズのみです。

 実行する前にアクティブに成っているグラフの高さを基準に
 幅とプロットエリアのサイズを変更するマクロです。

 (HANA)

 お邪魔します。
 Excel2003だとわかると思いますが、プロットエリアを選択すると
 8点の四角のハンドルが表示されるので、そのどれか1点をマウスで
 左クリックで押下したままの状態にすると、外側に点線の枠が表示されます。
 これが、本当のPlotAreaです。
 従って、PlotAreaのWidthとHeightは軸のラベル部分を含んでいるので、
 これを同じ長さにしても、内枠の長さは同じになりません。
 PlotAreaのInsideWidthとInsideHeightを同じにする必要があります。
 ところが、このInsideWidthとInsideHeightは値の取得のみで、設定は
 出来ません。
 外枠と内枠の相対関係を取得・計算して、外枠のPlotAreaを調整する必要が
 あります。

 以下のサンプルは、X,Y軸の短い方に合わせます。

 Sub Sample()
     Dim PR As Double, PB As Double, PIB As Double, PIR As Double
     Dim L As Double, R As Double, T As Double, B As Double
     Dim x As Double, y As Double
     Dim orn As Boolean

     With Sheets(1).ChartObjects(1).Chart
         .ChartArea.AutoScaleFont = False       '自動だと軸ラベルのFontSizeが変更されてしまう
         With .PlotArea
             If .InsideWidth = .InsideHeight Then
                 Exit Sub
             ElseIf .InsideWidth > .InsideHeight Then
                 orn = True
             End If
             PR = .Left + .Width                   'PlotAreaの右端位置
             PB = .Top + .Height                   'PlotAreaの下端位置
             PIR = .InsideLeft + .InsideWidth      'PlotAreaInsideの右端位置
             PIB = .InsideTop + .InsideHeight      'PlotAreaInsideの下端位置
             L = .InsideLeft - .Left               '左側余白(Y数値軸ラベルの巾)
             T = .InsideTop - .Top                 '下側余白(X項目軸ラベルの高さ)
             R = PR - PIR                          '右側余白
             B = PB - PIB                          '上側余白
             x = .Width - (.InsideHeight + L + R)  '調整長さ(横方向)
             y = .Height - (.InsideWidth + T + B)  '調整長さ(縦方向)
         End With
 '-------------------------------------------------------------------
         'グラフサイズはそのままで、Y数値軸長=X項目軸長にする
 '        If orn Then
 '            .PlotArea.Width = .PlotArea.Width - x
 '        Else
 '            .PlotArea.Height = .PlotArea.Height - y
 '        End If
 '-------------------------------------------------------------------
          'Y数値軸長=X項目軸長にして、グラフサイズを変更する場合
         If orn Then
             .Parent.Width = .Parent.Width - x
         Else
             .Parent.Height = .Parent.Height - y
         End If
 '--------------------------------------------------------------------
     End With

 End Sub

 (あすなろ)


 お返事ありがとうございます。
 >特にエクセル上で「見た目」や「印刷したとき」の精度は非常に劣ると思っています。
 ご指摘の通りですので、細かなところは妥協しようと思います。

 >表示の縮小・拡大は どうしても必要でしょうか?
 >グラフのサイズは各々違うのでしょうか?
 ワークシートのサイズが大きいため、拡大縮小は頻繁に行っています。
 またグラフを作成した直後のサイズは恐らく同じなので固定することはできるかもしれません。

 >たたき台として、まずはこの程度ではどうでしょう?
 マクロを実行してみましたが、動作しませんでした。
 「グラフをアクティブにする」というのはグラフエリアをクリックした状態?で良いのでしょうか。
 基本的なことですみません。

 (rin.t)

 あすなろさんお返事ありがとうございます。

 マクロを実行すると以下でエラーが出ました。
 >  With Sheets(1).ChartObjects(1).Chart
 1のところに、ワークシート名とグラフの番号?を入れないといけないと思うのですが、
 シート名はわかりますが、グラフの番号?を入れる方法がわかりません。
 どの数値を入力すればいいのでしょうか。

 (rin.t)

 「グラフをアクティブにして下さい。」のメッセージが表示されましたか?
 こちらでは、
  グラフをクリックして黒い枠で囲われた状態
  グラフの中のプロットエリアをクリックした状態
 どちらの状態からでも実行されましたが。。。

 もっと考えられたコードを載せて下さっている様ですので
 そちらを確認してもらえると良いと思います。

 (HANA)

 HANAさんお返事ありがとうございます。
 グラフをクリックして8個のハンドルが表示された状態
 グラフの中のプロットエリアをクリックして8個のハンドルが表示された状態
 どちらの状態でもマクロを実行すると「グラフをアクティブにして下さい」と表示されます。
 何も選択しない状態でマクロを実行すると、
 >            With .Parent
 の行で
「オブジェクト変数またはWithブロック変数が設定されていません。」
 と出てしまいました。

 (rin.t)

 こんにちは

 ご参考までに

http://peltiertech.com/Excel/Charts/SquareGrid.html

 (穂高)


 > 1のところに、ワークシート名とグラフの番号?を入れないといけないと思うのですが、
 > シート名はわかりますが、グラフの番号?を入れる方法がわかりません。

 With Sheets("Sheet1").ChartObjects("グラフ 134").Chart

 のようにするか、

 With ActiveChart

 と書き換えて、グラフのどこかをクリックした状態で、マクロを実行。

 (あすなろ)


 う〜〜ん、何ででしょうねぇ。。。
 取り敢えず、その部分は無くしてみたのと
 内枠の長さが同じに成るように変更してみました。

 '------
Sub グラフサイズ変更2()
    Dim グラフ高さ As Double
    With ActiveChart
                'フォントの自動サイズ変更の停止
        .ChartArea.AutoScaleFont = False
        With .Parent
            グラフ高さ = .Height
                'グラフ幅を グラフ高さ+40 のサイズに変更
            .Width = グラフ高さ + 40
        End With
        With .PlotArea
                'プロットエリアの高さを グラフ高さ*90%のサイズに変更
            .Height = グラフ高さ * 0.9
                'プロットエリアの幅を プロットエリアの高さに合わせる
            .Width = .Width - .InsideWidth + .InsideHeight
        End With
    End With
End Sub
 '------

 (HANA)

 >穂高さん
 ありがとうございます。
 VBAは初心者ですがコードを読み解きながらやっていることを理解していこうと思います。

 >あすなろさん、HANAさん
 お二方のプログラム共に無事動きました。
 まだコードの中身を完全に理解していないので読み解いて、
 自分なりにアレンジを加えてみようと思います。

 皆様、ありがとうございました。

 (rin.t)

コメント返信:

[ 一覧(最新更新順) ]


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