Page 548 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼グラフ表示について Yoshie 02/12/25(水) 10:54 ┗Re:グラフ表示について Jaka 02/12/26(木) 15:30 ┗グラフ表示範囲を変えてグラフを書き続けるには? Yoshie 02/12/26(木) 17:11 ┗Re:グラフ表示範囲を変えてグラフを書き続けるには? Jaka 02/12/27(金) 10:43 ┗エラーがとれないです。 Yoshie 02/12/27(金) 14:53 ┗Re:エラーがとれないです。 Jaka 03/1/6(月) 10:43 ┗まだエラーが出ます。 Yoshie 03/1/7(火) 11:50 ┗原因が、わかりました。 Jaka 03/1/8(水) 14:35 ┗エラーがなくなりました。 Yoshie 03/1/8(水) 16:04 ┗Shapes 教えてください。Jakaさ〜ん!! Yoshie 03/1/15(水) 9:12 ┗Re:Shapes 教えてください。 Jaka 03/1/15(水) 13:44 ┗ありがとうございました Yoshie 03/1/15(水) 14:58 ─────────────────────────────────────── ■題名 : グラフ表示について ■名前 : Yoshie ■日付 : 02/12/25(水) 10:54 -------------------------------------------------------------------------
みなさま、こんにちは。グラフ表示についていろいろ試したのですが、 うまくいかないので教えてください。 Sheet1に以下のようなデータがあるとします。データが測定毎に1行ずつ増えます。 凡例は1行目のCH1 CH2 CH3 CH4固定です。 グラフの表示範囲は20データずつにし、20行を越えたら表示範囲を1行下にずらして、データ範囲を設定し折れ線グラフを表示します。 CH1 CH2 CH3 CH4 100 200 300 400 110 150 280 380 80 100 140 300 ActiveChart.SetSourceDataでデータ範囲を指定 ActiveChart.SeriesCollection().Name で凡例を指定 最初の20行は凡例が期待通りなのですが、データ範囲をずらし始めると、 凡例が系列1,系列2,系列3,系列4がちらっと見えてからCH1,CH2,CH3,CH4の表示になります。凡例部分は固定なので一回だけ設定すればいいと思いますが、どうしても系列になってしまうので現状毎回凡例を書き換える必要があり、 凡例表示部分が大きくなったり小さくなったり、ちらちらします。 SetSourceDataで凡例が変わらなくするにはどうしたらいいか教えてください。 開発環境はWin2000+ Excel2000です。 よろしくお願いします。 |
こんにちは。 グラフの勉強がてらに作ってみたけれど...。 これで合ってますか? Sub 改momo() Application.ScreenUpdating = False LastRow = Cells(Rows.Count, "A").End(xlUp).Row Charts.Add ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D2"), PlotBy:= _ xlRows ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False .ChartType = xlLineMarkers If LastRow <= 21 Then LoopFast = 2 LoopCnt = LastRow - 1 Else LoopFast = LastRow - 21 + 2 LoopCnt = 20 End If SCN = 0 For i = LoopFast To LoopFast + LoopCnt SCN = SCN + 1 .SeriesCollection.NewSeries .SeriesCollection(SCN).Values = "=Sheet1!R" & i & "C1:R" & i & "C4" Next End With ActiveChart.HasLegend = False Application.ScreenUpdating = False DoEvents End End Sub |
Jakaさん、レスありがとうございました。 みなさまこんにちは。 Jakaさんのソースを打ち込んで確認しましたが、内容が難しいです。 SeriesCollection.NewSeriesのあたりとか、ScreenUpdatingとか 調べてみます。 よかったら私のソースも見てください。 フォームをロードした1度だけ呼ぶグラフの設定関数とグラフ表示関数があります。 グラフ表示関数はデータを受信したら呼びます。凡例は常に1行目を指定します。 例えば、1秒ごとにグラフ表示範囲を変えてグラフを書く場合でも、SetSourceDataを使えばいいのでしょうか?よろしくお願いします。 Sub Set_Graph() Dim i As Integer Dim Myws As Object Set Myws = Worksheets("Sheet1") Myws.Activate Myws.Range(Myws.Cells(CellY, 1), Myws.Cells(20, CellY)).Select Charts.Add With ActiveChart .ChartType = xlLineMarkers .PlotArea.Select .SetSourceData Source:=Sheets("Sheet1").Range(Myws.Cells(1 + CellY, 1), Myws.Cells(20 + CellY, 4)), PlotBy _ :=xlColumns End With ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" ActiveChart.HasTitle = True ActiveChart.ChartTitle.Characters.Text = "サンプルソフト" ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = False ActiveChart.Axes(xlValue, xlPrimary).HasTitle = False ActiveChart.HasDataTable = False Set Myws = Nothing End Sub Sub Disp_Graph() Dim Myws As Object Dim i As Integer Set Myws = Worksheets("Sheet1") Myws.Activate With ActiveChart .PlotArea.Select If CellY > 21 Then GY = GY + 1 .SetSourceData Source:=Sheets("Sheet1").Range(Myws.Cells(1 + GY, 1), Myws.Cells(21 + GY, 4)), PlotBy :=xlColumns For i = 1 To 4 ActiveChart.SeriesCollection(i).Name = Myws.Cells(1,i).Value Next i Else .SetSourceData Source:=Sheets("Sheet1").Range(Myws.Cells(1, 1), Myws.Cells(21, 4)), PlotBy :=xlColumns End If End With ActiveChart.HasTitle = True ActiveChart.ChartTitle.Characters.Text = "サンプルソフト" ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = False ActiveChart.Axes(xlValue, xlPrimary).HasTitle = False ActiveChart.HasDataTable = False ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic Set Myws = Nothing End Sub |
おはようございます。 本当は、グラフの事はほとんど全くわからないんで、Yoshieさんの作ったものに自分成りに手を加えてみたけれど..。 また間違っていると思いますけど、 できたら、グラフが1つも無い状態で試して見て下さい。 新規作成から変更まで、これでできるようにしてあります。 また、変更時にグラフのチラつきを止める事が出来ませんでした。 >1秒ごとにグラフ表示範囲を変えてグラフを書く場合 下記コードを Application.Wait Now + TimeValue("00:00:01") を使ってループするように改良すれば何とかできると思いますが、めちゃくちゃチラつくと思います。 色々勉強させてもらいました。 それと、今日が最後となってしまいますのでごめんなさい。 Sub 改Set_Graph() Dim i As Integer Dim Myws As Object Dim myGf As Object Dim ActC As Range Dim Flg As Boolean Set Myws = Worksheets("Sheet1") Myws.Activate Set ActC = ActiveCell CellY = Cells(Rows.Count, "A").End(xlUp).Row Application.ScreenUpdating = False On Error Resume Next Set myGf = ActiveSheet.Shapes("サンプルグラフ") If Err <> 0 Then Charts.Add Flg = True Else myGf.Select End If On Error GoTo 0 With ActiveChart .ChartType = xlLineMarkers .SetSourceData Source:=Sheets("Sheet1").Range(Myws.Cells(1 + CellY - 20, 1), Myws.Cells(CellY, 4)), PlotBy _ :=xlColumns .Location Where:=xlLocationAsObject, Name:="Sheet1" End With With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With With ActiveChart .Location Where:=xlLocationAsObject, Name:="Sheet1" .HasTitle = True .ChartTitle.Characters.Text = "サンプルソフト" .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False .HasDataTable = False .SeriesCollection(1).Name = "=" & """" & Range("A1").Value & """" .SeriesCollection(2).Name = "=" & """" & Range("B1").Value & """" .SeriesCollection(3).Name = "=" & """" & Range("C1").Value & """" .SeriesCollection(4).Name = "=" & """" & Range("D1").Value & """" End With If Flg = True Then ActiveSheet.Shapes(Mid(ActiveChart.Name, InStr(1, ActiveChart.Name, " ") + 1)).Name = "サンプルグラフ" End If ActC.Activate Set Myws = Nothing Set myGf = Nothing Set ActC = Nothing Application.ScreenUpdating = True End Sub |
Jakaさん、お世話になっております。 いろいろ考えてくださって本当にありがとうございます。 試してみました。 > If Flg = True Then > ActiveSheet.Shapes(Mid(ActiveChart.Name, InStr(1, ActiveChart.Name, " ") + 1)).Name = "サンプルグラフ" が、どうしてもエラーになってしまいます。 エラー内容は”指定した名前のアイテムが見つかりませんでした。”です。 その行をコメントにしてもグラフは書いてくれます。 グラフは最初の一回のみ生成したいんです。 Chart.Addを行うと必ずグラフが生成されますよね。 なのでFlgをグローバルにしてaddは一度だけ呼ぶようにしているのですが、 今度は2回目にwith ActiveChart部分を通ろうとすると、With またはオブジェクト変数がないというようなエラーになります。 なんとか試行錯誤してみます。 よいお年をお迎えください。 |
おはようございます。 >> If Flg = True Then >> ActiveSheet.Shapes(Mid(ActiveChart.Name, InStr(1, ActiveChart.Name, " ") + 1)).Name = "サンプルグラフ" >が、どうしてもエラーになってしまいます。 >エラー内容は”指定した名前のアイテムが見つかりませんでした。”です。 >その行をコメントにしてもグラフは書いてくれます。 >グラフは最初の一回のみ生成したいんです。 >Chart.Addを行うと必ずグラフが生成されますよね。 >なのでFlgをグローバルにしてaddは一度だけ呼ぶようにしているのですが、 >今度は2回目にwith ActiveChart部分を通ろうとすると、With またはオブジェクト変数がない>というようなエラーになります。 どう言った状況で、実行されたのか解らないのでなんとも言えないんですが、グラフを選択(グラフ隅が黒の四角状態)したまま実行するとエラーになるのを直しました。 "サンプルグラフ"と言う名前のグラフが無ければ、グラフを作るようにしてありますから、名前付けのコードをコメントにしちゃうと、"サンプルグラフ"をセットするのに毎回エラーになるので、当然毎回グラフは作られるでしょうね。 グラフが1つも無い状態で、カスタマイズせずに試して見て下さい。 私は、標準モジュールに書いてシート上にフォームの方のボタンにマクロ登録してテストしました。(Win98 & Exc97 と Win98 & Exc2000 にて) Sub 改Set_Graph() Dim Myws As Object, myGf As Object, ActC As Range Dim CellY As Long, CYF As Long Dim Flg As Boolean ActiveCell.Select Set ActC = ActiveCell Set Myws = Worksheets("Sheet1") Myws.Activate CellY = Cells(Rows.Count, "A").End(xlUp).Row Application.ScreenUpdating = False On Error Resume Next Set myGf = ActiveSheet.Shapes("サンプルグラフ") If Err <> 0 Then Charts.Add Flg = True Else myGf.Select End If On Error GoTo 0 If CellY < 20 Then CYF = 2 Else CYF = 1 + CellY - 20 End If With ActiveChart .ChartType = xlLineMarkers .SetSourceData Source:=Sheets("Sheet1").Range(Myws.Cells(CYF, 1), Myws.Cells(CellY, 4)), PlotBy _ :=xlColumns .Location Where:=xlLocationAsObject, Name:="Sheet1" End With With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With With ActiveChart .Location Where:=xlLocationAsObject, Name:="Sheet1" .HasTitle = True .ChartTitle.Characters.Text = "サンプルソフト" .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False .HasDataTable = False .SeriesCollection(1).Name = "=" & """" & Range("A1").Value & """" .SeriesCollection(2).Name = "=" & """" & Range("B1").Value & """" .SeriesCollection(3).Name = "=" & """" & Range("C1").Value & """" .SeriesCollection(4).Name = "=" & """" & Range("D1").Value & """" End With If Flg = True Then ActiveSheet.Shapes(Mid(ActiveChart.Name, InStr(1, ActiveChart.Name, " ") + 1)).Name = "サンプルグラフ" End If ActC.Activate Set Myws = Nothing Set myGf = Nothing Set ActC = Nothing Application.ScreenUpdating = True End Sub |
Jakaさん、お世話になっています。 お返事ありがとうございます。 昨日も言われたとおり標準モジュールにその通り書いて試したのですが、 エラーが出てしまいます。 何が違うのでしょう。根気強くやってみます。 また書き込みしますのでよろしくお願いします! 環境はWin2000(SP2)+Excel2000です。 |
こんにちは。 エラーになる原因が、わかりました。 .Location Where:=xlLocationAsObject, Name:="Sheet1" 上でのような所でシート名を固定していたからでした。 私のテスト環境では、エラーにならなかったんで解りませんでした。つまり私のチョンボなんですけど。 修正とともにつまらない物を加えて遊んでみました。 新規ブックで試して見て下さい。簡単なデータを自分で作っていますので、データは無くてもかまいません。結構チラつきます。 Sub これを実行() データ Application.Wait Now + TimeValue("00:00:02") TTTT AA = 100 For i = 1 To 7 Select Case i Case 1, 3, 5 AA = AA + 20 Case 2, 4, 6 AA = AA - 20 Case Else AA = AA + 50 End Select RRo = Cells(Rows.Count, "A").End(xlUp).Row + 1 Cells(RRo, 1).Value = AA Cells(RRo, 2).Value = AA + 10 Cells(RRo, 3).Value = AA + 20 Cells(RRo, 4).Value = AA + 30 AA = AA + 10 Application.Wait Now + TimeValue("00:00:02") TTTT Next End Sub Sub データ() Range("A1").Value = "CH1": Range("B1").Value = "CH2" Range("C1").Value = "CH3": Range("D1").Value = "CH4" Range("A2").Value = 100: Range("B2").Value = 200 Range("C2").Value = 300: Range("D2").Value = 400 Range("A3").Value = 110: Range("B3").Value = 150 Range("C3").Value = 280: Range("D3").Value = 380 Range("A4").Value = 80: Range("B4").Value = 100 Range("C4").Value = 140: Range("D4").Value = 300 Range("A5").Value = 50: Range("B5").Value = 50 Range("C5").Value = 50: Range("D5").Value = 50 Range("A6").Value = 100: Range("B6").Value = 200 Range("C6").Value = 300: Range("D6").Value = 400 AA = 100 For i = 7 To 21 Cells(i, 1).Value = AA Cells(i, 2).Value = AA + 10 Cells(i, 3).Value = AA + 20 Cells(i, 4).Value = AA + 30 AA = AA + 10 Next End Sub Sub TTTT() Dim Myws As Object, myGf As Object, ActC As Range Dim CellY As Long, CYF As Long Dim Flg As Boolean, GrafName As String GrafName = "サンプルグラフ2" ActiveCell.Select Set ActC = ActiveCell Set Myws = ActiveSheet Myws.Activate CellY = Cells(Rows.Count, "A").End(xlUp).Row Application.ScreenUpdating = False On Error Resume Next Set myGf = ActiveSheet.Shapes(GrafName) If Err <> 0 Then Charts.Add Flg = True Else myGf.Select End If On Error GoTo 0 If CellY < 20 Then CYF = 2 Else CYF = 1 + CellY - 20 End If With ActiveChart .ChartType = xlLineMarkers .SetSourceData Source:=Myws.Range(Myws.Cells(CYF, 1), Myws.Cells(CellY, 4)), PlotBy _ :=xlColumns .Location Where:=xlLocationAsObject, Name:=Myws.Name End With With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With With ActiveChart .Location Where:=xlLocationAsObject, Name:=Myws.Name .HasTitle = True .ChartTitle.Characters.Text = "サンプルソフト" .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False .HasDataTable = False .SeriesCollection(1).Name = "=" & """" & Range("A1").Value & """" .SeriesCollection(2).Name = "=" & """" & Range("B1").Value & """" .SeriesCollection(3).Name = "=" & """" & Range("C1").Value & """" .SeriesCollection(4).Name = "=" & """" & Range("D1").Value & """" End With If Flg = True Then ActiveSheet.Shapes(Mid(ActiveChart.Name, InStr(1, ActiveChart.Name, " ") + 1)).Name = GrafName End If ActC.Activate Set Myws = Nothing Set myGf = Nothing Set ActC = Nothing Application.ScreenUpdating = True End Sub |
Jakaさん、ありがとうございます。 動作確認してみましたら、エラーがなくなりました。 それに、グラフ表示もVery Goodです! Jakaさんを手本にお勉強していきたいのですが、 最近PCの調子が悪くて、今日はマザーボードを取り替えたり PCを組み立てている最中で。 明日からごそごそプログラムを1行づつ追ってみます。 わからないところがあったら教えてください。 よろしくお願いします。 |
Jakaさん、皆様おはようございます。 グラフ表示の件動作するようになったのですが、ヘルプで調べてもコードが理解できないので4項目について教えてください。 TTTT関数の中です。 1.CellY = Cells(Rows.Count,"A").End(xlUp).Row Rows.Countには65536が入っているようです。End(xlUp).Rowが何をしているかわからないです。 2.Set myGf = ActiveSheet.Shapes(GrafName) Shapesは何をしているのでしょうか? 3..SeriesCollection(1).Name = "=" & """" & Range("A1").Value & """" これは.SeriesCollection(1).Name = Range("A1").Valueでも同じ表示になるような気がしますが、何か意味があるのでしょうか? 4.ActiveSheet.Shapes(Mid(ActiveChart.Name,Instr(1,ActiveChart.Name," ") +1)).Name = GrafName この行Shapesがわかりません。ActiveChart.Nameからスペースのある場所までを取得してShapesの名前に"サンプルグラフ2"を渡していますが、わからないです。 以上です。よろしくお願いします。 |
こんにちは。 >1.CellY = Cells(Rows.Count,"A").End(xlUp).Row > Rows.Countには65536が入っているようです。End(xlUp).Rowが何をしているかわからないです。 A列1番下の行から上に向かって空白で無いセルの行。 下と同じ意味ですが、A列1番下の行からと行番号を指定ないのがミソ。 MsgBox Range("A65536").End(xlUp).Row >2.Set myGf = ActiveSheet.Shapes(GrafName) > Shapesは何をしているのでしょうか? グラフも図形等の一種ですから、グラフ図形をmyGfにセットしてグラフがあるかないかのエラートラップです。あればそのまま使えるので。(更新時にグラフ名で更新するとうまく行かなかったんで、図形オブジェクトとして更新してみたらうまくいっんで図形オブジェクトとして扱う様にしました。) >3..SeriesCollection(1).Name = "=" & """" & Range("A1").Value & """" > これは.SeriesCollection(1).Name = Range("A1").Valueでも同じ表示になるような気がしますが、何か意味があるのでしょうか? 特別な意味はありません。マクロ記録した時に ActiveChart.SeriesCollection(1).Name = "=""ううう""" こんな感じだったんで、忠実に書いただけです。 >4.ActiveSheet.Shapes(Mid(ActiveChart.Name,Instr(1,ActiveChart.Name," ") +1)).Name = GrafName >この行Shapesがわかりません。ActiveChart.Nameからスペースのある場所までを取得してShapesの名>前に"サンプルグラフ2"を渡していますが、わからないです。 グラフを新規に作った場合は、グラフがアクティブになりますが、そのままだと後々更新する時にグラフ名が解らないと、更新時にどのグラフを指定できない為、グラフを図形オブジェクトとして名前を付けるんですが、グラフ番号は、出来た準にExcelが勝手に付けるので作った時に、自分で名前を付けておけばいちいち調べずに済みます。 単純に MsgBox ActiveChart.Name とすると「Sheet1 グラフ 1」と返ってきます。 ですが、更新時に ActiveSheet.Shapes("Sheet1 グラフ 1").Select と、するとエラーになってしまいます。 グラフを選択するには、 ActiveSheet.Shapes("グラフ 1").Select と、書かないとダメなわけで..。(名前付けも同じです。) 2と4の説明がごちゃ混ぜになっている所もありますが、マクロ記録をしてみたり色々思考錯誤してたら何となく出来ちゃったレベルなんで、こんなもんでゆるしてね! 最初は、こんな感じでグラフ名を取得してみたんですが、ダイレクト方式の方が効率がよさそうなんで...。 For Each shp In ActiveSheet.Shapes If shp.Type = 3 Then MsgBox shp.Name End If Next |
Jakaさん、お世話になりました。 親切に教えていただきましてありがとうございました。 とても勉強になります。グラフ表示は無事できあがりました。 まだまだExcelVBAの気持ちがわからず、やりたいことができない身です。 また何かあったらよろしくお願いします! |