Page 459 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼グラフができません・・・ muu 02/12/4(水) 17:35 ┗Re:グラフができません・・・ こうちゃん 02/12/5(木) 9:14 ┗Re:グラフができません・・・ muu 02/12/5(木) 9:34 ┗Re:グラフができません・・・ muu 02/12/5(木) 10:24 ┗今ひとつはっきりしませんが・・ こうちゃん 02/12/5(木) 11:57 ┣Re:今ひとつはっきりしませんが・・ muu 02/12/5(木) 12:56 ┗Re:今ひとつはっきりしませんが・・ muu 02/12/5(木) 14:52 ┗こんどは月集計(ピボットテーブル使います) こうちゃん 02/12/5(木) 16:14 ┣Re:こんどは月集計(ピボットテーブル使います) muu 02/12/5(木) 16:44 ┗Re:こんどは月集計(ピボットテーブル使います) muu 02/12/5(木) 16:45 ┗Re:こんどは月集計(ピボットテーブル使います) muu 02/12/6(金) 11:37 ┗Re:こんどは月集計(ピボットテーブル使います) こうちゃん 02/12/6(金) 13:18 ┣Re:こんどは月集計(ピボットテーブル使います) Jaka 02/12/6(金) 14:00 ┃ ┣Re:こんどは月集計(ピボットテーブル使います) muu 02/12/6(金) 16:10 ┃ ┗Re:グラフはあらかじめ作っていないとダメですか? muu 02/12/6(金) 16:36 ┃ ┗Jakaさんのコードの貼り付け場所 こうちゃん 02/12/6(金) 16:50 ┃ ┗Re:こうちゃんさん muu 02/12/6(金) 16:55 ┣Re:こんどは月集計(ピボットテーブル使います) muu 02/12/6(金) 16:09 ┗Re:こんどは月集計(ピボットテーブル使います) muu 02/12/6(金) 16:48 ┗どっちのコード? こうちゃん 02/12/6(金) 17:03 ┗Re: muu 02/12/6(金) 17:09 ┗Re: こうちゃん 02/12/6(金) 17:20 ┗Re: muu 02/12/10(火) 16:31 ┗ここまでは理解してますか? こうちゃん 02/12/10(火) 17:42 ┗次は、違うグラフを・・・ muu 02/12/16(月) 13:28 ─────────────────────────────────────── ■題名 : グラフができません・・・ ■名前 : muu ■日付 : 02/12/4(水) 17:35 -------------------------------------------------------------------------
今、卒業研究で「農作物入出荷管理システム」というシステムを作っています。 アクセスとエクセルとVBAを使っています。 今回質問したいのは、エクセルで指定日(月)のグラフを作成することについてです。 エクセルのデータは↓ 日付 出荷量 2002年1月1日 12860 2002年1月2日 16730 ・ ・ ・ ・ 2002年2月1日 17620 2002年2月2日 12380 ・ ・ ・ ・ このような形で、一つのシートに追加されていきます。 どのようなグラフを作成したいかというと、日付を指定して、見たい日のグラフを表示 させたいのです。 もうひとつは、月を指定して、見たい月の総出荷量を表示させたいのです。 データは、毎日追加されていくのでコードを変えなくてもグラフが追加されるように したいのですが・・・ どなたかこの文章を理解できた方、よろしくお願いします☆ |
muuさん、こんにちは 条件が今ひとつわかりませんので教えてください。 >今、卒業研究で「農作物入出荷管理システム」というシステムを作っています。 >アクセスとエクセルとVBAを使っています。 >今回質問したいのは、エクセルで指定日(月)のグラフを作成することについてです。 >エクセルのデータは↓ > 日付 出荷量 >2002年1月1日 12860 >2002年1月2日 16730 > ・ ・ > ・ ・ > >2002年2月1日 17620 >2002年2月2日 12380 > ・ ・ > ・ ・ > >このような形で、一つのシートに追加されていきます。 >どのようなグラフを作成したいかというと、日付を指定して、見たい日のグラフを表示 >させたいのです。 日付に対して出荷量が複数あるんですか? それとも複数の農作物が同一日付にあるんですか?で、日付を指定して、その農作物ごとの出荷数のグラフ・・・ってこと? VBAでなく、エクセルのピボットグラフではいけませんか? ピボットテーブルのページに「日付」を指定してピボットテーブル、ピボットグラフを作成します。 ピボットテーブル(ピボットグラフ)のページで見たい日付を選択すれば、その日付のグラフがみれます。 >もうひとつは、月を指定して、見たい月の総出荷量を表示させたいのです。 こちらもピボットテーブルでいけそうですね。 Month関数等で月を計算する列を作っておいて、ピボットテーブルを作成すればいいとおもいますが・・ >データは、毎日追加されていくのでコードを変えなくてもグラフが追加されるように >したいのですが・・・ データ範囲を十分に広くしとくといいです。ピボットテーブルには「(空白)」行が1つ追加されますが、表示しないようにしておけばいいですよね。 #muuさんの考えと違っていたら、ごめんなさい。 |
説明が下手でごめんなさい。 >日付に対して出荷量が複数あるんですか? >それとも複数の農作物が同一日付にあるんですか?で、日付を指定して、その農作物ご >との出荷数のグラフ・・・ってこと? 日付に対しては出荷量は一つだけです。その日の出荷量の合計です。 >VBAでなく、エクセルのピボットグラフではいけませんか? ピボットグラフも試してみたのですがいまいち良くできなかったのです。 >Month関数等で月を計算する列を作っておいて、ピボットテーブルを作成すればいいとお>もいますが・・ 今後、参考にさせていただきます。 今、なんとかがんばってます。また、分からないことがあったときは よろしくお願いしますm(_ _)mありがとうございました。 |
昨日の質問は私の説明が悪くてすいませんでした(*o*) また、分からなくなってので聞いてください。説明もいっしょに。 エクセルのデータには、1行目に項目が入っています。(A1→日付、B1→出荷量) A2からは日付が入っています。その日付はどんどん増えていきます。 A3から出荷量が入っています。その出荷量は、1日の合計の総出荷量が1行ごとに。 今は、1ヶ月のグラフを表示できましたが、私が作成したいのは指定した期間のグラフ です。(日と月の。) 例えば、インプットボックスに1月3日から1月28日と入力して出荷量のグラフを 表示させたいのです。もうひとつは、2002年4月から2002年8月の出荷量を グラフ化して表示させたいのです。 もし、分かりましたらよろしくお願いします。 |
muuさん、こんにちは >エクセルのデータには、1行目に項目が入っています。(A1→日付、B1→出荷量) >A2からは日付が入っています。その日付はどんどん増えていきます。 >A3から出荷量が入っています。その出荷量は、1日の合計の総出荷量が1行ごとに。 A3からですか?表のフォーマットは最初の質問と違うのでしょうか? >今は、1ヶ月のグラフを表示できましたが、私が作成したいのは指定した期間のグラフ >です。(日と月の。) >例えば、インプットボックスに1月3日から1月28日と入力して出荷量のグラフを >表示させたいのです。もうひとつは、2002年4月から2002年8月の出荷量を >グラフ化して表示させたいのです。 > >もし、分かりましたらよろしくお願いします。 とりあえず表のフォーマットが最初の質問と同じとして、インプットボックスで日付を入力してその範囲のグラフを作ります。 #"Sheet1"シートのA列に日付、B列に出荷量(1行目はタイトル)として、他の列にはデータがないものとしています。 D列とE列にインプットボックスに入力された日付に該当するデータを抽出して、それを元にしてグラフを作成します。 (今回は条件がまだ把握しきれていないので、日付指定の例だけUPしときますね。) Sub test() Dim MaxRow As Long Dim i As Long Dim S_Day As String Dim E_Day As String Dim j As Long '抽出データ範囲を削除します Range(Cells(1, 4), Cells(Range("D1").End(xlDown).Row, 5)).ClearContents 'データ範囲を取得します MaxRow = Range("A65536").End(xlUp).Row '開始日と終了日入力 S_Day = InputBox("開始日を入力してね") E_Day = InputBox("こんどは終了日だよ") If Not IsDate(S_Day) Or Not IsDate(E_Day) Then MsgBox "日付をいれなくちゃダメ!!" Exit Sub End If 'データ抽出 Cells(1, 4).Value = Cells(1, 1).Value Cells(1, 5).Value = Cells(1, 2).Value j = 2 For i = 2 To MaxRow If Cells(i, 1).Value >= CDate(S_Day) And _ Cells(i, 1).Value <= CDate(E_Day) Then Cells(j, 4).Value = Cells(i, 1).Value Cells(j, 5).Value = Cells(i, 2).Value j = j + 1 End If Next 'グラフの追加 'グラフの種類やフォーマットはマクロ記録で好みのグラフを追加してみて 'それにあわせて変更してください。 Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData _ Source:=Sheets("Sheet1").Range("D1:E" & CStr(j - 1)), PlotBy:= _ xlRows ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" End Sub |
ありがとうございます。早速試してみます。 |
>A3からですか?表のフォーマットは最初の質問と違うのでしょうか? 間違えました*最初のでいいのです。 だいたいできてきたのですが、一つのシートに入っているデータを月の合計でグラフにする事はできないのでしょうか? |
muuさん、こんにちは >だいたいできてきたのですが、一つのシートに入っているデータを月の合計でグラフにする事はできないのでしょうか? どんな形でできたのですか? 前のコードはお役にたっているのですか? 回答しやすいようにそちらの情報はできるだけUPするようにしてくださいね。 見当違いな回答すると、お互い無駄がでますから。(^^;) じゃあ今度は月別の集計の例を・・・ まず、C1に「月」と入力しておきます。 C2以降に次の計算式をセットします。 =YEAR(A2) & "/" & RIGHT("0" & MONTH(A2),2) この表を元に、ピボットテーブルとピボットグラフを作成しておきます。 以下の例はピボットテーブルをデータと同一シートに作成し、名前を"ピボットテーブル1"とした例です。 Sub test2() Dim MaxRow As Long Dim i As Long Dim S_Month As String Dim E_Month As String Dim S_MonthCheck As Boolean Dim E_MonthCheck As Boolean Dim Pitem As Variant '抽出データ範囲を削除します Range(Cells(1, 4), Cells(Range("D1").End(xlDown).Row, 5)).ClearContents 'データ範囲を取得します MaxRow = Range("A65536").End(xlUp).Row '月の計算式設定 For i = 2 To MaxRow If Range("C" & i).Formula = "" Then Range("C" & i).FormulaR1C1 = _ "=YEAR(RC[-2]) & ""/"" & RIGHT(""0"" & MONTH(RC[-2]),2)" End If Next 'ピボットテーブルのデータ範囲更新 Range("H3").Select ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _ "Sheet1!R1C1:R" & MaxRow & "C3" Application.CommandBars("PivotTable").Visible = False '開始月と終了月入力 S_Month = InputBox("開始月を入力してね。2001/02みたいにね") E_Month = InputBox("こんどは終了月だよ") If Not IsDate(S_Month) Or Not IsDate(E_Month) Then MsgBox "月をいれなくちゃダメ!!" Exit Sub End If 'ピボットテーブルのデータチェック S_MonthCheck = False E_MonthCheck = False For Each Pitem In ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("月").PivotItems If S_Month <= Pitem Then S_MonthCheck = True End If If E_Month >= Pitem Then E_MonthCheck = True End If Next If Not (S_MonthCheck And E_MonthCheck) Then MsgBox "そんなデータはないよ!!" Exit Sub End If 'ピボットテーブルの月ごとの表示設定 For Each Pitem In ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("月").PivotItems If S_Month <= Pitem And E_Month >= Pitem Then Pitem.Visible = True Else Pitem.Visible = False End If Next End Sub #「ピボットテーブルじゃやだ!!」ってことなら、そういってくださいね。 |
ピボットテーブルを作って、データが追加されるとピボットテーブルも更新されますよね? あと、シートに項目を追加しないといけないのですか・・? 項目を追加しないでできる方法があったら教えて欲しいのですが・・・ 先ほどのは、今から試してみます!! |
あっすいません! やっぱり項目を追加してやります!! |
やっぱり項目を追加しないやりかたでやります。 ピボットグラフも使わないで作りたいです。 Sub MyChart4() Dim ASh As Worksheet Dim MyD1 As Integer, MyD2 As Integer Dim i As Long, j As Long Dim Ck As Boolean Dim Tp As Single, Hp As Single, NewT As Single Do MyD1 = Application _ .InputBox("グラフのプロット開始の月を入力して下さい", Type:=1) If MyD1 = False Then Exit Sub Loop While MyD1 < 1 Or MyD1 > 12 Do MyD2 = Application _ .InputBox("グラフのプロット終了の月を入力して下さい", Type:=1) If MyD2 = False Then Exit Sub Loop While MyD2 < 1 Or MyD1 > 12 For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If IsDate(Cells(i, 1).Value) Then If Month(Cells(i, 1).Value) = MyD1 Then Ck = True: Exit For End If End If Next i If Ck = False Then MsgBox "日付が見つかりません", 48 Exit Sub End If Ck = False For j = Cells(Rows.Count, 1).End(xlUp).Row To i Step -1 If IsDate(Cells(j, 1).Value) Then If Month(Cells(j, 1).Value) = MyD2 Then Ck = True: Exit For End If End If Next j If Ck = False Then MsgBox "日付が見つかりません", 48 Exit Sub End If Set ASh = ActiveSheet If ASh.ChartObjects.Count > 0 Then Tp = ASh.ChartObjects(ASh.ChartObjects.Count).Top Hp = ASh.ChartObjects(ASh.ChartObjects.Count).Height NewT = Tp + Hp + 10 Else NewT = ASh.Range("A2").Top End If ASh.ChartObjects.Add(ASh.Range("D1").Left, NewT, 350, 250).Select With ActiveChart .ChartWizard Source:=ASh.Range("A" & i & ":B" & j), _ Gallery:=xlLine, CategoryLabels:=1, HasLegend:=2, _ Title:=MyD1 & "月〜" & MyD2 & "月出荷量" .Axes(xlCategory).TickLabels.Font.Size = 9 .Axes(xlValue).TickLabels.Font.Size = 9 End With Set ASh = Nothing End Sub ここから、グラフを月の合計を出して表示することはできるのでしょうか? もう一つ、インプットボックスに入力する形をyyyy/mmにするにはどうしたらよいのでしょうか? さきほどのコードに Dim MySum As Long If Ck = False Then MsgBox "該当する月の最終日付が見つかりません", 4 Exit Sub End If MySum = WorksheetFunction.Sum(ASh.Range("B" & StRow & ":B" & EnRow)) If ASh.ChartObjects.Count > 0 Then を追加したいのですが・・・ どうしたらよいのでしょうか?? どなたか宜しくお願いしますm(_ _)m |
muuさん、こんにちは またまた、こうちゃんですみません。 >もう一つ、インプットボックスに入力する形をyyyy/mmにするにはどうしたらよいのでしょうか? InputBoxのType 1 は数値入力ですから、yyyy/mmで入力すると割り算しちゃいます。 Typeを2(テキスト)にすれば入力できますね。 その場合若干変更が必要になります。 こんな感じ・・ Dim ASh As Worksheet Dim MyD1 As String, MyD2 As String Dim i As Long, j As Long Dim Ck_S As Boolean Dim Ck_E As Boolean Dim Tp As Single, Hp As Single, NewT As Single MyD1 = Application.InputBox("グラフのプロット開始の月を入力して下さい (yyyy/mm 形式)", Type:=2) If Len(MyD1) = 0 Then Exit Sub MyD2 = Application.InputBox("グラフのプロット終了の月を入力して下さい", Type:=2) If Len(MyD2) = 0 Then Exit Sub If Not (IsDate(MyD1) Or IsDate(MyD2)) Then MsgBox ("入力が間違いです") Exit Sub End If Ck_S = False Ck_E = False For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Not Ck_S And Cells(i, 1).Value >= CDate(MyD1) Then Ck_S = True End If If Not Ck_E And Cells(i, 1).Value <= DateAdd("d", -1, DateAdd("m", 1, CDate(MyD2))) Then Ck_E = True End If If Ck_S And Ck_E Then Exit For Next i If Not (Ck_S And Ck_E) Then MsgBox "該当する日付が見つかりません" & vbCrLf & _ "開始月[" & MyD1 & "] 終了月[" & MyD2 & "]", 48 Exit Sub End If >ここから、グラフを月の合計を出して表示することはできるのでしょうか? 月の合計とは、たとえば2002/01〜2002/03を指定して、1月、2月、3月のそれぞれ出荷量を合計してグラフを作る、ってことでいいんですか? MySum =・・・のように変数を使って集計することは以下の手順でできます。 1)月要素と出荷量要素の配列変数を宣言する。 2)指定された開始月と終了月の間隔数えてReDimで配列数を設定する 3)データを順に見ていって、A列がら「月」を取得、同一月の出荷量要素の変数に計上する。 メッセージボックスに表示するとかならそれでいいんでしょうが、これをグラフにするなら、月ごとの合計をセルに格納して表を作成し、その表をグラフにするほうがいいんじゃないでしょうか? #1月のグラフ、2月のグラフのように月ごとに違うグラフを作成するんじゃないですよね?理解力が弱くてよくわかりません(^^;) |
こうちゃんさん、こんにちは。 1回ポッキリですから、横レスお許し下さい。 フォームに開始日用のCombobox1と終了日用のCombobx2を各1個づつ、実行用と終了用のCommndbottonを作って、下記コードを全部フォームモジュールに張りつけてください。 A列の日付は、書式設定にて1月5日の様に表示される様になっているとします。 では。 Dim EndRow As Long Private Sub ComboBox1_Change() CMBS = ComboBox1.ListIndex + 2 ComboBox2.Clear If ComboBox1.Value <> "" Then For i = ComboBox1.ListIndex + 3 To EndRow ComboBox2.AddItem Cells(i, "A").Text Next End If End Sub '実行 Private Sub CommandButton1_Click() Dim Sday As String, EDay As String Sday = ComboBox1.Value EDay = ComboBox2.Value MainPL Sday, EDay End Sub Private Sub CommandButton2_Click() Unload Me End End Sub Private Sub UserForm_Initialize() EndRow = Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.MatchEntry = fmMatchEntryFirstLetter ComboBox2.MatchEntry = fmMatchEntryFirstLetter For i = 2 To EndRow ComboBox1.AddItem Cells(i, "A").Text Next End Sub Sub MainPL(Sday As String, EDay As String) Dim 範囲 As String Application.ScreenUpdating = False ActiveCell.Activate GRow = 2 With ActiveSheet.Range("A" & GRow & ":A" & EndRow + 1) Set セル = .Find(Sday, After:=Range("A" & EndRow + 1), LookIn:=xlValues) GGRow = セル.Row End With With ActiveSheet.Range("A" & GGRow & ":A" & EndRow + 1) Set セル = .Find(EDay, LookIn:=xlValues) GERow = セル.Row End With 範囲 = "A" & GGRow & ":B" & GERow ActiveSheet.ChartObjects(1).Delete Charts.Add ActiveChart.ApplyCustomType ChartType:=xlBuiltIn, TypeName:="2 軸上の折れ線と縦棒" ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range(範囲), PlotBy:= _ xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" With ActiveChart .HasAxis(xlCategory, xlPrimary) = True .HasAxis(xlValue, xlPrimary) = True .HasTitle = True .ChartTitle.Characters.Text = "グラフタイトル名" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "日付" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "出荷量" End With ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlCategoryScale ActiveChart.HasLegend = False ActiveChart.HasDataTable = False ActiveChart.Axes(xlCategory).Select Selection.TickLabels.Orientation = xlUpward ActiveChart.Axes(xlValue).AxisTitle.Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .Orientation = xlVertical End With With ActiveSheet .ChartObjects(1).Left = 140 .ChartObjects(1).Top = 110 End With Range("A1").Activate Application.ScreenUpdating = True End Sub |
こんにちは☆ さっそく試してみます! |
Jakaさん、私の頭ではコードを貼り付けて、どうすればよいのかわかりません。 ごめんなさい。 ボタンを作って、コードを貼り付けたのですが、実行を押すとマクロを作成するダイヤログボックスがでてきます。そこからどうしたらいいのかがわかりません。 |
muuさん、こんにちは >Jakaさん、私の頭ではコードを貼り付けて、どうすればよいのかわかりません。 >ごめんなさい。 > >ボタンを作って、コードを貼り付けたのですが、実行を押すとマクロを作成するダイヤログボックスがでてきます。そこからどうしたらいいのかがわかりません。 フォームの作り方はわかりますか? VBEで「挿入」「ユーザーフォーム」でフォームを作成しておいて、そのフォームにComboBoxを2つ、CommandButtonを2つ追加します。 デフォルトでJakaさんが指定したコントロール名になると思いますが、違ったらあわせておきます。 で、そのフォームのコードを表示(フォームを右クリックで「コードの表示」)させて、そこにJakaさんのコードを貼り付けます。 フォーム名は既定でUserForm1になると思いますので、標準モジュールに以下のコードを書いてそれを実行します。 Sub TestJaka() UserForm1.Show End Sub #Option Explicitを指定していると、宣言なしエラーがいくつかでますので、エラーになった変数を宣言してくださいね。 非常に参考になると思いますので、試してみてね。(^^) |
こうちゃんさんが教えてくれたコードはどこにいれたらよいですか? お願いします☆ |
こんにちは☆ >月の合計とは、たとえば2002/01〜2002/03を指定して、1月、2月、3月のそれぞれ出荷量を合計してグラフを作る、ってことでいいんですか? そうです。1月の合計の棒グラフ、2月の合計の棒グラフ・・・を作りたいのです。 >メッセージボックスに表示するとかならそれでいいんでしょうが、これをグラフにするなら、月ごとの合計をセルに格納して表を作成し、その表をグラフにするほうがいいんじゃないでしょうか? なるべくならコードでやりたいのです。 こうちゃんさんが教えてくれたコード試してみます。 |
試してみたのですが・・・ あのコードをどこにいれたらいいのか良くわかりませんでした。 ほんとにすいません。。。何もわからなくて。。。 |
muuさん: >試してみたのですが・・・ > >あのコードをどこにいれたらいいのか良くわかりませんでした。 >ほんとにすいません。。。何もわからなくて。。。 muuさんの書かれたコードを以下のように直せばyyyy/mm形式で入力できます。 ただし、このまま実行しても月合計のグラフにはなりません。 このコードでは、指定した開始月の1日から終了月の末日までのデータの日毎の出荷量のグラフでしかありません。 エクセルのグラフはデータ範囲にワークシートの範囲しか指定できませんので、集計用の表をエクセル上でつくらないでグラフを作成するためには外部プログラムを使うか、シェープ等を組み合わせて擬似的にグラフをつくるかしかないかも。 そうすると、と〜っても大変だと思います。 別のシートにでも集計表を作って、それでグラフを作るのがお勧めですよ。 見えるのがいやなら、そのシートを非表示にすればいいしね。 #こっちのことでいいんでしょうか? これは標準モジュールですよ。 #ちなみにこのスレッドで私が回答したコードもすべて標準モジュールです。 Sub MyChart4() Dim ASh As Worksheet Dim MyD1 As String, MyD2 As String Dim i As Long, j As Long Dim Ck_S As Boolean Dim Ck_E As Boolean Dim Tp As Single, Hp As Single, NewT As Single MyD1 = Application.InputBox("グラフのプロット開始の月を入力して下さい", Type:=2) If Len(MyD1) = 0 Then Exit Sub MyD2 = Application.InputBox("グラフのプロット終了の月を入力して下さい", Type:=2) If Len(MyD2) = 0 Then Exit Sub If Not (IsDate(MyD1) Or IsDate(MyD2)) Then MsgBox ("入力が間違いです") Exit Sub End If Ck_S = False Ck_E = False For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Not Ck_S And Cells(i, 1).Value >= CDate(MyD1) Then Ck_S = True End If If Not Ck_E And Cells(i, 1).Value <= DateAdd("d", -1, DateAdd("m", 1, CDate(MyD2))) Then Ck_E = True End If If Ck_S And Ck_E Then Exit For Next i If Not (Ck_S And Ck_E) Then MsgBox "該当する日付が見つかりません" & vbCrLf & _ "開始月[" & MyD1 & "] 終了月[" & MyD2 & "]", 48 Exit Sub End If Set ASh = ActiveSheet If ASh.ChartObjects.Count > 0 Then Tp = ASh.ChartObjects(ASh.ChartObjects.Count).Top Hp = ASh.ChartObjects(ASh.ChartObjects.Count).Height NewT = Tp + Hp + 10 Else NewT = ASh.Range("A2").Top End If ASh.ChartObjects.Add(ASh.Range("D1").Left, NewT, 350, 250).Select i = Cells(Rows.Count, 1).End(xlUp).Row With ActiveChart .ChartWizard Source:=ASh.Range("A" & 2 & ":B" & i), _ Gallery:=xlLine, CategoryLabels:=1, HasLegend:=2, _ Title:=MyD1 & "月〜" & MyD2 & "月出荷量" .Axes(xlCategory).TickLabels.Font.Size = 9 .Axes(xlValue).TickLabels.Font.Size = 9 End With Set ASh = Nothing End Sub |
>別のシートにでも集計表を作って、それでグラフを作るのがお勧めですよ。 集計表はデータが追加されても自動で更新されますか? |
muu さん: >>別のシートにでも集計表を作って、それでグラフを作るのがお勧めですよ。 >集計表はデータが追加されても自動で更新されますか? そのように作ればね。 グラフを作成するときに集計表も更新するとか・・ あのね、私はmuuさんが何をしたいのか、まだよくわかってないです。(^^;) 「1月の合計のグラフ、2月の合計のグラフ」って発言がありましたが、それだと棒が1本のグラフになっちゃいませんか? それと、グラフを作成するタイミングはユーザーが指定するんですか?ボタンクリックしてとか・・ どうもmuuさんは質問するだけで、私からの質問にお答えいただけないような気がします。 質問者のしたいことを回答者が把握できないと、回り道になっちゃいますから、聞かれたことには答えたほうが解決はやいですよ。(^^;) |
>「1月の合計のグラフ、2月の合計のグラフ」って発言がありましたが、それだと棒が1本のグラフになっちゃいませんか? 1月のグラフで1本、2月のグラフで1本・・・ですよ。 >それと、グラフを作成するタイミングはユーザーが指定するんですか?ボタンクリックしてとか・・ そうです。ボタンをクリックして期間を指定してグラフを表示させるようにしたいのです。 私は、まだVBAをよくわりません。 |
muuさん、こんにちは >>「1月の合計のグラフ、2月の合計のグラフ」って発言がありましたが、それだと棒が1本のグラフになっちゃいませんか? >1月のグラフで1本、2月のグラフで1本・・・ですよ。 だから、この表現がわからないんです(^^;) 指定した月の集計値の棒グラフを作りたいでいいんですよね。 1月のグラフ、2月のグラフじゃなくて、グラフは1個で、グラフの要素が月ごとの合計ってことですよね。 で、ここまでの例題は試験しましたか? 直前の回答で示した例を実行すると、指定した月の日ごとの出荷量が要素のグラフができたと思います。 それを月の合計を要素のものにするのであれば、やはり月ごとの集計表をVBAで作成して、それをグラフにするのが一番わかりやすいのではないかと思いますが、いかがですか? #VBA初心者なら、なおのこと、エクセルの機能をできるだけ利用したほうがいいと思います。 |
こんにちは。 今現在、このようなコードでできることが分かりました。↓ Sub MyChart3() Dim ASh As Worksheet Dim MyD1 As Date, MyD2 As Date, MyD As Date Dim i As Long, j As Long Dim Ck As Boolean Dim Tp As Single, Hp As Single, NewT As Single Dim 月差 As Integer, 月cnt As Integer Dim Graph_月() As Date Dim Graph_生産量() As Double Do MyD1 = Application.InputBox("何月からですか?(【西暦】年/月)" & _ vbLf & "半角で入力して下さい", Type:=1) If MyD1 = False Then Exit Sub Loop While Not IsDate(MyD1) Do MyD2 = Application.InputBox("何月までですか?(【西暦】年/月)" & _ vbLf & "半角で入力して下さい", Type:=1) If MyD2 = False Then Exit Sub Loop While Not IsDate(MyD2) '開始月と終了月の月差を算出し、データ格納領域を確保 月差 = DateDiff("m", MyD1, MyD2) ReDim Graph_月(月差) As Date '月差分、配列を確保 ReDim Graph_生産量(月差) As Double For 月cnt = 0 To 月差 Graph_月(月cnt) = DateAdd("m", 月cnt, MyD1) Next 月cnt 'データを読込み、月毎に生産量を合計 Ck = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If IsDate(Cells(i, 1).Value) Then 月cnt = DateDiff("m", MyD1, Cells(i,1).Value) If 月cnt >= 0 And 月cnt <= 月差 Then Graph_生産量(月cnt) = Graph_生産量(月cnt) + Cells(i, 13) Ck = True End If End If Next i If Ck = False Then MsgBox "データが有りません", 48 Exit Sub End If 'セルに月毎のデータを出力 Columns("Y:Z").ClearContents '前回出力をクリア Cells(1, 25) = "年月": Cells(1, 26) = "生産量" 'タイトル For 月cnt = 0 To 月差 Cells(月cnt + 2, 25) = Graph_月(月cnt) Cells(月cnt + 2, 26) = Graph_生産量(月cnt) Next 月cnt 'グラフ作成 Set ASh = ActiveSheet Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.Location Where:=xlLocationAsNewSheet With ActiveChart .ChartWizard Source:=ASh.Range("Y2" & ":Z" & 月差 + 2), _ Gallery:=xlColumn, CategoryLabels:=1, HasLegend:=False, _ Title:=Format(MyD1, "yyyy/mm") & "〜" & Format(MyD2, "yyyy/mm" ) & " 出荷量" With .Axes(xlCategory).TickLabels .Font.Size = 9 .Orientation = xlUpward End With .Axes(xlValue).TickLabels.Font.Size = 9 End With Set ASh = Nothing End Sub これで、月を指定して、その期間内のグラフを表示させることができました。 今度は、品目ごとのグラフを期間を指定して作りたいのですが・・・ 以前、データがどのように追加されていくかをこのような形↓といいましたが 、これは、簡単にしてあるもので(不必要なものは省いています。)実際は、 21の項目があります。 日付 出荷量 2002年1月1日 12890 2002年1月2日 16730 2002年1月3日 17680 ・ ・ ・ ・ ・ ・ 今度は、品目ごとにグラフを作りたいので。。。 A L M 1 2002年1月1日 ‖ DPバーバラ 12890 2 2002年1月2日 略 Gバランタイン 16730 3 2002年1月3日 ‖ Wキャンドル 17680 ・ ・ ・ ・ ・ ・ このようにデータが入っているとします。(項目は削除しました。) 指定した期間の中で品目ごとのグラフを作る方法が分かりません。 分かる方いましたらおねがいします。 ※A列が日付、L列が品目、M列が出荷量。 レイアウトは変えないでコードで。 コマンドボタンにマクロを登録させてクリックしただけでグラフが表示されるようにし たい。 |