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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QZedGraphのグラフ作成時のX軸日付

VB.NET 2008、ZedGraphを使って、
グラフを作成しています。
普通の折れ線グラフを作成しているのですが、
X軸の日付 例えば10月8日が8.10と表示されてしまいます。
希望としては10/8としたいのですが。

データタイプは
myPane.XAxis.Type = AxisType.DateAsOrdinal

Xのデータは下記のような感じで書いています。
for i=0 to 10
 aaa(i)=日付情報
 X=aaa(i).ToOADate
 Y=・・・
 list.Add( X, Y );
Next i

わかる方がおられましたら、助言をお願いします。

Aベストアンサー

myPane.XAxis.Scale.Format = "M/d"
を加えてみてはどうでしょうか?

詳しくは下のURLを参照してみて下さい。

参考URL:http://www.zedgraph.org/wiki/index.php?title=Customize_the_scale_format

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

Q「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現在のセル( n , "A" )より14行上に数値がないことを確認するために
'14行上のセルを全て足し算しています。
For m = n - 14 To n - 1
s = s + Worksheets("Sheet1").Cells(m, "A").Value
Next

'足し算結果がゼロならば何も記入していないと判断し、
'数字の「1」を記入します。
If s >= 1 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 0
ElseIf s = 0 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 1
End If
End Sub

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現...続きを読む

Aベストアンサー

はいはい了解。

今着目しているセルが (n,1)であるとする。

条件: 今いるところから上に14行サーチして、一度でも1か2の値が見つかったら
     回答を0とする。14行すべてに1・2の値がひとつも含まれていなければ1とする。



Ans = 1

for i = 1 to 14

x = cells ( n - i , 1 ).value

if x = 1 or x = 2
then
Ans = 0
endif
next i


cells ( n , 1 ) = Ans


デフォルトの回答値=1としておき、一回でも条件にヒットしたら回答値=0にする。
ヒットしたらfor~nextを強制的に閉じてもいいけど、面倒なのでそのまま14回検索する。

QExcelマクロでRange("A1:A5,C1:C5")をCellsで書きたいのですが

マクロ初心者です。
Excelマクロでグラフを作成するときに、元データを指定する所で、
Source:=Range("A1:A5,C1:C5")とするような場合、
「A1」とかアルファベットでの番地指定ではなく、
Cellsを用いて書きたいのです。

Source:=Range("A1:A5")であれば、
Source:=Range(Cells(1, 1), Cells(5, 1))と書けばいいことは分かるのですが、範囲指定を複数にする場合が分からないのです。

よろしくお願いします。

Aベストアンサー

Unionを使用したらできると思います。

Source:=Union(Range(Cells(1, 1), Cells(5, 1)), Range(Cells(1, 3), Cells(5, 3)))

今Excelがインストールされてないパソコンで作業していないので確認はしていないのですが・・・。

よかったら参考にして下さい

QExcel VBAでグラフ作成。A,C列をx値, B,D列をy値にした複数プロット

ExcelのVBAでグラフをChartType = xlXYScatterLinesでグラフを作っています。仮に各列10行でAからF列までデータがあるとします。
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
.ChartType = xlXYScatterLines
.SetSourceData Worksheets(1).Range("A1:F10"), _
PlotBy:=xlColumns
.HasLegend = False
End With

上記のようにしてしまうと、x値がA1:A10で、y値がB1:B10,C1:C10・・・・のプロットが5本作成されてしまいます。

以下のようにするにはどうすればよろしいでしょうか。
第一のプロットはx値をA1:A10, y値をB1:B10としてグラフを作成します。次にこのグラフにx値をC1:C10, y値をD1:D10とした第二のプロットを追加、同様に第三はx値をE1:E10, y値をF1:F10としてプロットを追加したグラフを作成したいのですが、このようなグラフはVBAで作成可能でしょうか。

本番のグラフは行数と列数はいろいろな場合があるので、行数と列数のパラメータに任意の値を代入し、Forループで様々な形態に対応できるものを作りたいと考えています。

ExcelのVBAでグラフをChartType = xlXYScatterLinesでグラフを作っています。仮に各列10行でAからF列までデータがあるとします。
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
.ChartType = xlXYScatterLines
.SetSourceData Worksheets(1).Range("A1:F10"), _
PlotBy:=xlColumns
.HasLegend = False
End With

上記のようにしてしまうと、x値がA1:A10で、y値がB1:B10,C1:C10・・・・のプロットが5本作成されてしまいます。

以下のようにするにはどうすれ...続きを読む

Aベストアンサー

Dim chartObj As ChartObject
Dim r As Range
Dim i As Long

Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
Set r = Worksheets(1).Range("A1:F10")
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 1 To 5 Step 2
    With .SeriesCollection.NewSeries
      .XValues = r.Columns(i)
      .Values = r.Columns(i + 1)
    End With
  Next
End With

Set r = Nothing
Set chartObj = Nothing

...こんな感じ。
普通に手作業で作成するものをマクロ記録すればヒントになるでしょう。
後から系列を追加すればいいわけです。

>本番のグラフは行数と列数はいろいろな場合があるので...
...に対応させる一例としては以下。

Const MN = 1 'データ開始行
Const MX = 10 'データ個数
Dim chartObj As ChartObject
Dim x, y
Dim z As Long
Dim i As Long

x = VBA.Array(1, 3, 5) 'x値の列
y = VBA.Array(2, 4, 6) 'y値の列
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 0 To UBound(x)
    With .SeriesCollection.NewSeries
      .XValues = Cells(MN, x(i)).Resize(MX)
      .Values = Cells(MN, y(i)).Resize(MX)
    End With
  Next
End With

Set chartObj = Nothing

Dim chartObj As ChartObject
Dim r As Range
Dim i As Long

Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
Set r = Worksheets(1).Range("A1:F10")
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 1 To 5 Step 2
    With .SeriesCollection.NewSeries
      .XValues = r.Columns(i)
      .Values = r.Columns(i + 1)
    End With
  Next
End With

Set r = Nothing
Set chartObj = Nothing

.....続きを読む


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報