みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

EXCEL VBA グラフの表示位置

あるシート(sheet1とする)上のデータの一部を使用して、
別のシート(sheet2とする)に棒グラフを書こうとしています。

これ用のマクロを作ったのですが、グラフが267~291行あたり、
列はCH~CQあたりに表示されてしまうのです。
sheet2上にはグラフ以外何もデータがありません。
印刷プレビューで見ると、紙が64枚ぐらい出そうです。
これを"A1"の近くに表示させるにはどうしたらいいのでしょうか?

ちなみにsheet1には300行、300列ぐらいにデータが入っています。
何か関連性があるのでしょうか?

投稿日時 - 2007-05-16 12:16:10

QNo.3004400

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

こんにちは。

>最後に変数に全部Nothingを代入していますが、これは必須ですか?

それは、初級に出てくる話ではあっても、その説明は難しいですね。(^^;

私個人は、VBAの回答者として、ある程度、模範的な書き方にしたがっています。余計な突っ込みされたくもないというのが本来の理由です。

実際の問題としては、私の知る範囲では、VBAのプロシージャが終わると、ローカル変数(Sub の中に書かれる変数)のオブジェクトは、自動的は開放されるはずだと思うのです。ExcelのVBAのメモリの割り振り自体も、どうも有限のようで、必要以上には膨らまないように、残さない仕組みにはなっているようです。だから、Window OSにも、プロセスは、単独で残るようなことはありません。

しかし、時には、開放されないものがあるようなのですね。ローカル変数以外、つまり、Sub の外で行われるもの、また、サブルーチンで使用される場合、また、オートメーション・オブジェクトで使われる場合、COMで使われる場合など、極端な場合、Excelを終了しても単独で、残ってしまうことがあります。状況によって、そうした使い分けをするよりも、最初から、オブジェクトを開放するように書いておけば、問題はないと思うのです。

投稿日時 - 2007-05-16 15:03:05

お礼

毎度ありがとうございます。

投稿日時 - 2007-05-19 18:21:15

ANo.1

こんにちは。

前回の続きですね。この際は、まとめて質問してしまっても早いかもしれません。
グラフだけは、インテリセンスも使えないので、難しいですね。マニュアルとかもないし。

以下は、オーソドックスな書き方だと思います。400,300 というのは、任意ですから、実際に合わせて書き換えてください。実際は、省略したり、リテラル値(値をそのまま入れる)でも、できる部分があるのですが、このポイントは、

Set objChart = sh2.ChartObjects.Add ....

の部分で、オブジェクトを一旦、取得することです。With ステートメントでは使わないほうがよいです。


'---------------------------------------------

Sub ChartObjectMaking()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim rngData As Range
Dim objChart As ChartObject
Dim rngFirst As Range

Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
  'グラフのデータの左上端の始まりの位置
  Set rngData = sh1.Range("A1").CurrentRegion
  'シート2 のグラフの左上端の位置
  Set rngFirst = sh2.Range("A1")
  'グラフの大きさは任意です。 +3 は、ぴったりとつかないようにしました。
  Set objChart = sh2.ChartObjects.Add( _
   rngFirst.Left + 3, rngFirst.Top + 3, 400, 300) '400-幅, 300-高さ
    
  '加工する場合は、以下の中で行います。
  With objChart.Chart
   .SetSourceData Source:=rngData, _
               PlotBy:=xlColumns '棒グラフ
   .ChartType = xlColumnClustered
  End With
  
Set rngFirst = Nothing
Set rngData = Nothing
Set objChart = Nothing
Set sh1 = Nothing
Set sh2 = Nothing
End Sub

投稿日時 - 2007-05-16 12:59:01

お礼

いつもありがとうございます。
最後に変数に全部Nothingを代入していますが、これは必須ですか?

投稿日時 - 2007-05-16 13:25:49

あなたにオススメの質問