プロが教えるわが家の防犯対策術!

エクセルのVBAを用いてプログラムを書いているのですが、どうしてもわからないことがあるので教えて下さい。
あるデータの時間経過(推移)の折れ線グラフを自動的にチャートシートに作図させたのですが、X軸に日付の目盛りを表示させ忘れてしまい、X軸に日付の目盛りを表示させるようにマクロを記録し、それを基に手直しをして追加プログラムを書いているのですがうまく行きません。というのは、X軸に日付の目盛りを表示させることはできたのですが、それに伴い、チャートの形が変わってしまうのです。グラフの種類は折れ線でサインカーブの様なスムーズな線が角張ったゴツゴツした感じの線になってしまいます。これってバグでしょうか?
具体的なプログラムは、Range(cells(50, 2), cells(150, 5))のデータでグラフを作成し、その後、Range(cells(50, 1), cells(150,1))の日付データをX軸に設定するといった感じで組んでいます。グラフの表示形式を変えずに、X軸の目盛りラベルのみを変更(表示)させるにはどのようにすれば良いでしょうか

A 回答 (4件)

> 「AxisクラスのMinimumScaleプロパティを設定できません」


一つ、重大な過ちに気づきました(汗)。「折れ線グラフ」で描かれている
ということを見落としていました。申し訳ありません。
もし、問題なければ、X軸のサンプル間隔に制限のない「散布図」を使われては
いかがでしょう?。スムーズな線がゴツゴツになってしまう例として、X軸系列
の増分が一定でないことが考えられます。
回答No.3に示したマクロの
For Each Chart In .Charts
の下に
Chart.ChartType = xlXYScatter
With Chart.SeriesCollection(1)
.Border.Weight = xlHairline
.Smooth = True
End With
の5行追加していただければOKです。

なお、「折れ線グラフのままにしたい」ということでしたら、
次のように書き直してください。

Sub Macro2()
With ActiveWorkbook
Set stTime = Sheets("Sheet1").Cells(2, 1) 'x軸の最小値
Set edTime = Sheets("Sheet1").Cells(38, 1) 'x軸の最大値
n = edTime.Row - stTime.Row 'x軸の幅n
For Each Chart In .Charts
With Chart.Axes(xlCategory)
.TickLabelSpacing = n / 10 '目盛ラベルにnの10分割を入れる
.TickMarkSpacing = n / 10
End With
Next Chart
End With
Set stTime = Nothing
Set edTime = Nothing
End Sub

なお、シート保護がかかった状態でも同様のエラーメッセージが出ます。
-いずれもEXCEL2000にて動作確認-
    • good
    • 0
この回答へのお礼

毎度、ありがとうございます。
今晩また試してみます。
スムーズな線がゴツゴツになってしまう例として、X軸系列
の増分が一定でないことが考えられます。
確かに、祝日、土日のデータが抜けているので、それが
原因かも知れません。

お礼日時:2001/05/15 12:55

誤解ですか?失礼しました(^^;)。

For each - nextステートメントのご指摘ありがとうございます。早速以下の通り訂補してみましたがいかがでしょう?
Sub Macro1()
With ActiveWorkbook
Set stTime = Sheets("Sheet1").Cells(50, 1) 'x軸の最小値
Set edTime = Sheets("Sheet1").Cells(150, 1) 'x軸の最大値
n = edTime.Value - stTime.Value 'x軸の幅n
For Each Chart In .Charts
With Chart.Axes(xlCategory)
.MinimumScale = stTime.Value
.MaximumScale = edTime.Value
.MajorUnit = n / 10 '目盛りにnの10分割を入れる
End With
Next Chart
End With
Set stTime = Nothing
Set edTime = Nothing
End Sub
    • good
    • 0
この回答へのお礼

TTakさん、
昨日ご回答頂いたサンプルコードをコピーして試したところ、
.MinimumScale = stTime.Value のところでエラーが発生してしまいます。
.MaximumScale = edTime.Value のところでもエラーが発生すると考えられます。最初は変数もしくはコーディングの間違えと思い色々と検討してみましたが結局駄目でした。デバッグで変数の値をチェックしてみるとstTime,edTimeともにcells(50,1), cells(150,1)の値が入っていることは確認しました。エラーメッセージは次のようなダイアログが表示されました。
「AxisクラスのMinimumScaleプロパティを設定できません」
何か心当たりはありますか?
MajorUnit = n / 10 は、なかなかわかりやすかったです。

お礼日時:2001/05/15 09:28

> チャートシートでも同様に設定可能でしょうか


チャートシートとはグラフシートのことと察しますが、同様に設定可能です
また、完全に処理を自動化するならば、速度を考慮して、activateメソッド
を使わない方がいいでしょう。

> 目盛り間隔(例えば10個)を同時に設定するにはどのようなコードを入れれば良いのでしょうか?

これはグラフシートが複数あって、X軸を一気に同じ設定にしたいということ
ですね。私が思いつくのは、Chartsオブジェクト(グラフシート)の個数を
数えて、Chartsコレクションオブジェクトのインデクスに順々に値を入れて、
X軸を設定していく方法です。

Sub Macro1()
With ActiveWorkbook
For I = 1 To .Charts.Count
With .Charts(I).Axes(xlCategory)
.MinimumScale = Sheets("Sheet1").Cells(50, 1).Value
.MaximumScale = Sheets("Sheet1").Cells(150, 1).Value
End With
Next I
End With
End Sub

-EXCEL2000にて動作確認済み-

この回答への補足

私の質問の仕方が悪い様で、誤解されたと思います。
X軸の最小値(例えば0)、最大値(例えば100)の設定に加え、目盛り間隔を10にして10個の目盛りラベルをふるということです。目盛り間隔を5にした時は20個の目盛りラベルをふることになります。この様な設定を軸の設定と同様にコーディングしたいということです。
PS、Activate methodは遅いのですか?、今後、極力使用しない様に心がけます。
参考になりました。今回の回答頂いたFor - nextのループ処理をFor each - nextステートメントに変えると処理時間の短縮につながると思います(全ての対象オブジェクトに対してループ処理を行う場合)。

補足日時:2001/05/14 18:02
    • good
    • 0

mygskさんこんにちは


グラフの名前を"グラフ 1"とすると次のコードになります。

With ActiveSheet.ChartObjects("グラフ 1").Chart.Axes(xlCategory)
.MinimumScale = Cells(50, 1).Value
.MaximumScale = Cells(150, 1).Value
End With

グラフの名前は、グラフをオブジェクトとして選択した際に、名前ボックスに表示されます。デフォルトでは、作った順番に"グラフ 1",2,3...となります。
-EXCEL2000にて動作確認済み-
    • good
    • 0
この回答へのお礼

TTakさん、ありがとうございます。
とりあえず試してみます。
埋め込みグラフではなく、チャートシートでも同様に設定可能でしょうか
例えば、アクティブなチャートを指定してからです。
Charts(str_sheet_Name(i)).activate
With ActiveChats(1)
.chart.Axes(xlcategory).minimumScale=cells(50,1).value
.chart.Axes(xlcategory).maximumScale=cells(150,1).value
End with
この場合、TTakさんの例で言うとstr_sheet_Name(i) = "グラフ1"になります
また、目盛り間隔(例えば10個)を同時に設定するにはどのようなコードを入れれば良いのでしょうか?

お礼日時:2001/05/14 16:14

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