Excel2013にて個人毎に項目A(金額)、B(金額)、C(率:パーセント表示)を列Aに個人名、列Bに項目A、B、Cを入力して、1行目に4月から3月までの表を作成し、個人名で特定できる様オートフィルターをかけて複合グラフを作成しています。グラフはA、Bを主軸、Cを第2軸としていますが、A、Bの数値に対して、Cは余りに小さいため、一旦、3項目を棒グラフにて作成した後、主軸を対数グラフにしてCの棒グラフが可視できるようにした上でCの棒グラフを選択し、折れ線グラフに変更して、主軸を元に戻しています。
ざっくり言うとこの手順で複合グラフを作成していますが、個人名に対して3項目楯列にデータが存在するため個人名部分のセルは結合しているいます。そのため通常のフィルターでは思うように機能しないため下記URLの裏技を使用してフィルターをかけています。
http://officetanaka.net/excel/function/tips/tips …
これをマクロとして
1.オートフィルターを設定し、コンボボックスにて個人名を指定してフィルターをかける。
2.絞り込んだ表を参照範囲として指定して、上記のような複合グラフを作成する。
3.表をグラフを印刷する。
4.グラフを削除し、オートフィルターを解除する。
の順に登録し、にわかなVBAの知識で加工しています。
この方法で2人目まえではうまくグラフ表示されるのですが3人目から同じ構文で参照範囲だけ変更したマクロを呼び出しグラフを作成するという手順をとっているにも関わらずうまく複合グラフが作成できません。
※VBA初心者のため、個人毎にフィルターをかけたあと個々に複合グラフを作成するマクロを作って呼び出しています・・・
やっていることに無理があるのか、もっと良い方法があるのか分かり兼ねています。よかったらアドバイスをお願いします。
ちなみにグラフを作成しているVBAの構文を以下の通りです。
Sub グラフの作成01()
'
' グラフの作成01 Macro
'
Range("B1:N4").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Range("'2016'!$B$1:$N$4")
ActiveChart.Axes(xlValue).Select
ActiveChart.Axes(xlValue).ScaleType = xlLogarithmic
ActiveChart.Axes(xlCategory).Select
ActiveChart.SeriesCollection(3).Select
ActiveChart.SeriesCollection(3).ChartType = xlLineMarkers
ActiveChart.Axes(xlCategory).Select
ActiveChart.SeriesCollection(3).Select
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).Select
ActiveChart.SeriesCollection(3).Select
ActiveChart.SeriesCollection(3).AxisGroup = 2
ActiveChart.Axes(xlValue).Select
ActiveChart.Axes(xlValue).ScaleType = xlLinear
'グラフの移動
Dim GName As String
GName = Mid(ActiveChart.Name, Len(ActiveSheet.Name) + 2)
With ActiveSheet.Shapes(GName)
.Left = 100
.Top = 150
.Width = 1000
End With
End Sub
これが1人目の複合グラフを作成するマクロで2人目以降は参照範囲を変更しています。
No.1ベストアンサー
- 回答日時:
1)オートフィルター機能を使わない方法です。
2)(氏名を選んだら)その人物のデータを別シートにVBAで転記してしまうことにして、
その別シートの該当範囲をソースデータにして、必要なグラフを手動でつくっておくと、
(氏名を選んで)その人物のデータを別シートにVBAで転記したら、
グラフに自動反映されると思います。
その別シートを印刷すれば、データとグラフが印刷できます。
毎回グラフをVBAで作る必要はないと思います。
グラフを削除する操作も無用だと思います。
別シートには、該当範囲のデータと連動するグラフを手動でつくっておくので、
かなり複雑な操作を要するグラフでも、VBAの面倒くささを気にしなくて済み楽です。
3)2)の方法が一番簡単だと思いますが、データは関係なく、複合グラフだけならば
次のようなVBAでも、グラフを作ることは出来ます。
① B1にグラフ化する個人名を選ぶ入力規制を作っておく。
Sub Macro1()
' 《名前を、' B1で選択できるリストにセットし直す》
Dim r As Range: Dim nl
For Each r In Range("A2:A1000")
If r.Value <> "" Then nl = nl & "," & r.Value
Next r
With Range("B1").Validation
.Delete
.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=nl
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
End With
End Sub
② B1に表示されている名前の人のデータを元に、
新たにグラフを作成する。
Sub Macro2()
' B1のセルに表示されている個人名の12ヶ月データを元にして
' 主軸対数メモリの棒グラフ(A金額、B金額)を
' 副軸最高値130の折れ線グラフ(C率)を作成し
' グラフのタイトルに、B1のセルに表示されている文字列を書く
Dim rr
rr = WorksheetFunction.Match(Range("B1"), Range("A1:A10000"), 0)
ActiveSheet.Shapes.AddChart.Select
With ActiveChart
.SetSourceData (ActiveSheet.Range( _
"$B$1:$N$1,$B$" & rr & ":$N$" & rr + 2)), xlRows
.ChartType = xlColumnClustered
.Axes(xlValue).ScaleType = xlLogarithmic
.SeriesCollection(3).AxisGroup = 2
.SeriesCollection(3).ChartType = xlLineMarkers
.Axes(xlValue, xlSecondary).MaximumScale = 130
.SetElement (msoElementChartTitleAboveChart)
.ChartTitle.Text = Range("B1")
End With
ActiveSheet.Activate
Range("B1").Select
Application.ScreenUpdating = True
End Sub
moto_koukousei 様
丁寧な回答ありがとうございました。
別シート作成した方が簡単かな?と思っていたのですが、やはりそのやり方が簡単なようですね。
試してみようと思います。
ありがとうございました。
No.2
- 回答日時:
私も発想を変えて、グラフを自動で作成するマクロではなく
必要なデータを抽出するマクロや関数を考えて方が良いと思います。
別途、一枚シートを準備して
名前を入れると(選択すると)グラフに必要なデータが抽出されるようにする。
複合グラフを配置しておく。
名前を変えるだけで、必要なグラフに変わると思うのですが、如何でしょうか。
一例ですが
これをマクロとして
1.別シートにコンボボックスにて個人名を指定してフィルターオプションでデータを抽出する。
2.そのシートには上記のような複合グラフが準備してある。
3.表をグラフを印刷する。
4.グラフを削除し、オートフィルターを解除する必要もありません。
hallo-2007 様
回答ありがとうございます。
moto_koukouseiさんの回答と同様、やはり別シートを作りコピーの方が簡単のようですね。
今から試してみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Excel(エクセル) エクセルの大きなシートでグラフを見つける 4 2022/07/28 10:07
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- Excel(エクセル) <スプレッドシート>採用進捗 グラフ作成について 3 2022/10/23 15:52
- Excel(エクセル) excel ピポットテーブルの更新について 1 2022/05/13 16:12
- その他(Microsoft Office) 2019エクセル折れ線グラフで、Y軸を3つ作成したいのですがやり方が分かりません。 例 A 1.2. 1 2022/04/27 12:25
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Excel(エクセル) Excel 散布図グラフ 外れ値 セル番地参照方法 4 2022/04/19 18:56
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの作業計算方法について
-
Microsoft1Officeの互換ソフト...
-
【マクロ】その時、その時で変...
-
はがきについて。
-
【マクロ】読取専用のファイル...
-
エクセル初心者です 関数の入れ...
-
【関数】適切な文字数の数字を...
-
LOOKUP関数を使えばいいのでし...
-
【関数】先頭だけにある、半角...
-
Excel ピボットテーブルで日付...
-
Excelのpivotについて質問です
-
時間によってファイル名が変わ...
-
エクセル 白黒印刷で白線を印刷...
-
Aというブックの1というシート...
-
エクセル関数を教えてください
-
WPS OFFICEでの縦書きについて
-
Excelのチェックボックスの使い...
-
エクセルの条件付き書式につい...
-
エクセルのセルに同じ大きさの...
-
エクセルの関数について教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報