[[20170519160503]] 『必要なデータだけコピーしてグラフを変更したい』(Q田) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『必要なデータだけコピーしてグラフを変更したい』(Q田)

 以下のマクロを作成したいのです、ご指導ください。

 ■現在作成されているシート
・コード(集計) <グラフがある
・コード(AAA) <データがある
・計算用     <グラフを作るために手動操作内で使用

 ■毎回やっている手動操作内容
コード(AAA)にあるデータをコピー
計算用にペースト
計算用シートでグラフで使わない不要なデータを削除
できたデータをコピー
コード(集計)の規定位置に張りつけ
作成済みのグラフ(6つ)の範囲を変更する

 ■不明点
 マクロ記録で上記やりました。
 
1:データ範囲が固定になっていますが、これを自動でデータ範囲を選択するようにするにはどうしたらいいでしょうか?
  縦(行)の範囲は固定ですが横(列)の範囲は毎回変わります。
  どこかの行に「今回はここまで」みたいにマークでもつけた方がいいのでしょうか?

2:グラフの範囲も固定になっていますが、ペーストしてきた範囲(列)に変更するにはどうしたらよいでしょうか?
  縦(行)の範囲は固定なのですが、横(列)がやはり変わります。

 データ範囲は右にあるのが古いもので左(c列)から追加(挿入)されていきます。
 ですので、必要範囲の終わりが空白列ということがありません。
 今はセルが灰色に塗られていると選択しない、という目視で判断しています。
 グラフの方は必要なデータだけ持ってきたので、持ってきたデータ全部を使用するのですが、判断がわかりません。

 Sub Macro5()
'
' Macro5 Macro
'

'

    Range("A3:AJ56").Select
    Selection.Copy
    Sheets("計算用").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("C2:AH2").Select
    Selection.SpecialCells(xlCellTypeBlanks).Select
    Application.CutCopyMode = False
    Selection.EntireColumn.Delete
    Rows("5:10").Select
    Selection.Delete Shift:=xlUp
    Rows("6:6").Select
    Selection.Delete Shift:=xlUp
    Rows("7:10").Select
    Selection.Delete Shift:=xlUp
    Rows("10:27").Select
    Selection.Delete Shift:=xlUp
    Range("C2:M26").Select
    Selection.Copy
    Sheets("コード(集計)").Select
    Range("C17").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    ActiveSheet.ChartObjects("グラフ 5").Activate
    Application.CutCopyMode = False
    ActiveChart.SetSourceData Source:=Range("'コード(集計)'!$A$17:$M$20")
    ActiveSheet.ChartObjects("グラフ 6").Activate
    ActiveChart.SetSourceData Source:=Range( _
        "'コード(集計)'!$B$17:$L$18,'コード(集計)'!$B$26:$M$42")
End Sub

 グラフは仮に2つだけ変更かけてます。
 ご指導よろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


データを貼り付けている範囲と、グラフに指定している範囲が違うので、貼り付けに応じた範囲指定までは教えられませんが、グラフのデータ範囲を変える基本的なコードは、以下になります。

    ActiveSheet.ChartObjects("グラフ 5").Activate
    ActiveChart.SetSourceData Source:=Sheets("コード(集計)").Range("$A$17:$M$20")
(???) 2017/05/19(金) 17:52

 ???様

 ご指導ありがとうございます。
 この$A$17:$M$20のMがかわるのです。
20は変わらないのですが、このMだけ実際貼りつけてきたデータのある列まで、と
指定することはできるのでしょうか?
(Q田) 2017/05/22(月) 17:15

周辺のセルにどんな入力があるのか次第ですが、こんなのとか?
    With Sheets("コード(集計)")
        .ChartObjects("グラフ 5").Activate
        ActiveChart.SetSourceData Source:=.Range("A17", .Cells(20, .Columns.Count).End(xlToLeft))
    End With
(???) 2017/05/22(月) 17:26

 ???様

 ありがとうございます。
Rangeの中にこうやって入れるのですね。
「コード(集計)」シートに余計なデータはないので、ばっちりできました。

 今確認してグラフ6の範囲が間違っていることに気が付きました。

  "'コード(集計)'!$B$17:$L$18,'コード(集計)'!$B$26:$M$42")
LじゃなくてMでした…マクロ記録するときに間違ったと思われます。

 さらによろしければお教えください。
        ActiveChart.SetSourceData Source:=Range( _
        "'コード(集計)'!$B$17:$M$18,'コード(集計)'!$B$26:$M$42")
 上記のようにRangeに2つ範囲がある場合はどのようにしたらよろしいのでしょうか?
ダメもとで
ActiveChart.SetSourceData Source:=.Range("B17", .Cells(18, .Columns.Count).End(xlToLeft), "B26", .Cells(42, .Columns.Count).End(xlToLeft))
としてみましたがやっぱり駄目でした。
(Q田) 2017/05/22(月) 18:00

複数分かれているならば、Range指定は文字列化してしまうとか。

    With Sheets("コード(集計)")
        .ChartObjects("グラフ 6").Activate
        ActiveChart.SetSourceData Source:= _
            .Range(.Range("B17", .Cells(18, .Columns.Count).End(xlToLeft)).Address & "," & _
                   .Range("B26", .Cells(42, .Columns.Count).End(xlToLeft)).Address)
    End With
(???) 2017/05/22(月) 18:41

>2つ範囲がある場合

Unionがわかりやすいです。
こんな感じです。

 Sub test()
    Dim r1 As Range
    Dim r2 As Range

    With Sheets("コード(集計)")
        Set r1 = .Range("B17", .Cells(18, .Columns.Count).End(xlToLeft))
        Set r2 = .Range("B26", .Cells(42, .Columns.Count).End(xlToLeft))

        .ChartObjects("グラフ 6").Chart.SetSourceData Union(r1, r2)
    End With

 End Sub

ところで、

>コード(AAA)にあるデータをコピー

この段階で、データ数は算出できないのですか。
そこから、グラフ範囲も決まりませんか。

>計算用シートでグラフで使わない不要なデータを削除

削除の基準がきまっているのですか。
この部分も含めて一連の作業をマクロ化したいのですよね。

(マナ) 2017/05/22(月) 20:55


 ???様

 ご指導ありがとうございます。
Rangeの中にRange入れていいんだ!とびっくりしました。

 いただいたコードを入れてみたのですが、グラフが違うものになってしまいます。
        ActiveChart.SetSourceData Source:=Range( _
        "'コード(集計)'!$B$17:$M$18,'コード(集計)'!$B$26:$M$42")
の場合は複数系列のあるグラフ(散布図)になるのですが、いただいたコードを入れると系列が一つになってしまいます。

 グラフ5はうまくいっているのに、何が違うのか…今のところさっぱりわかりません。
 
 
 マナ様

 ご指導ありがとうございます。
これは前もってr1、r2として値を定義しておくということなのですね。こういうやり方もあるんですね(こっちのが主流なのでしたら失礼しました)

 しかしこちらも???様のコードと同じくなぜかグラフの系列が減ってしまいました。
 グラフの作りが悪いのでしょうか…
 
 
>この段階で、データ数は算出できないのですか。 

 算出、をマクロ記録でどうやるのかがわかりませんでした。
人間がやるときは目で見て範囲を理解します。

 表は一覧性を重視したため、1列に1件のデータが入っております。
ただし、余計なコメント欄(担当やその上司が書く)があるため、1件に使用する列は3列毎になっております。
マクロ記録を取った時点では
A〜C列=タイトル
D列=1件目のデータ
E〜F列=1件目のコメント
G列=2件目のデータ
H〜I列=2件目のコメント
  :
とAJ列まで続いておりました。AJ列以降は空白(未入力)です
この中で必要なのは
D,G,J,M…と3列毎のデータ列で、
行はグラフに使用するデータのある4,5行、12,14行、19,20,21行、40〜56行となります。

 上記でお分かりいただけるかわからないくらいわかりにくい説明で申し訳ありません。
つまり飛び飛びになっているデータをグラフ用に転用しております。
 
 
>削除の基準がきまっているのですか。 

 基準というより使う列と行が決まっているのです。
ただ列の方はデータが追加または削除される可能性があるため、最終列がどこかわかりません。

 コード(AAA)シートはまだある程度の変更を私がすることは可能ですので、どこかの行に必要列だけマークを付けておこうか、思案中です。
(Q田) 2017/05/23(火) 15:43

Rangeの中にRangeが…、というのは、少し違うかもです。よくみて頂くと、内側のRangeは最後にAddressプロパティを指定していますね。つまり、Rangeの範囲文字列を得ているのです。"$B$17:$M$18" と、"$B$26:$M$42" ですね。これをカンマを加えて連結すると、"$B$17:$M$18,$B$26:$M$42" こうなるという訳です。

グラフが変わってしまうのは、範囲を間違えていませんかね? グラフ5と6で、開始がA列B列のように、微妙に違うのが気になります。また、2つのグラフで一部範囲が重なっていますし。

別案として、飛び飛びに範囲指定している理由が、使いたくないデータ行のせいならば、範囲は1つにして、不要な行を非表示にしておくとか?
(???) 2017/05/23(火) 16:39


 ???様

 さっそくありがとうございます。

 >Rangeの中にRangeが…、というのは、少し違うかもです。

 Addressプロパティでそういうことになるのですか!
調べ方が甘かった&発想できていません(思い込み)でした。
もうちょっと調べてみます。
(昨日から調べるのが遅くてレスポンス悪くてすみません)

 グラフの範囲が間違っているかは…わかりません。
正直に申し上げますと、マクロ記録でとった範囲をそのまま出しているのですが、
なぜその範囲なのかがよくわかりません。

 グラフ6(散布図)の範囲は
C17〜M18がX軸データ部分
B26〜B42が凡例部分
C26〜M42がY軸データ部分
になっており、M18とM42部分を変化させた記録のはずです。
(もともとK列までだったのをM列までに直した記録です)

 私は変更部分だけの範囲をこう("'コード(集計)'!$B$17:$M$18,'コード(集計)'!$B$26:$M$42")書くのかと思ったのですが、違うのでしょうか?
 
 
 >グラフ5と6で、開始がA列B列のように

 グラフ5と6で使用範囲が違うので、上司がわかりやすくするために項目をずらして書いていました。
もともと人間が見て作っているものをそのままマクロ記録したため、おかしいことが多々ありますね。
グラフ5の項目はB列に直してしまおうと思います。
そうすると全部の項目がB列からになります。
 
 
 >飛び飛びに範囲指定している理由が、使いたくないデータ行のせいならば

 1つの表から6つのグラフを作っているため、各グラフはみんな範囲が飛び飛びです。
マクロ的にはよろしくない状態でしょうか?

(Q田) 2017/05/23(火) 17:30


>C17〜M18がX軸データ部分

なぜ、2行なのでしょうか?

まだ、どんなグラフか、よく理解できていませんが
系列数は決まっていて、各系列のポイント数のみ変動ということですか?

ならば、予め多めに設定しておけば、
データ数に応じて自動でグラフの表示が変化しそうな気がしますが。

マクロでするなら、

1)コード(AAA)から、直接、必要なデータをコード(集計)に転記
2)転記したデータ数に基づき、グラフ範囲をリサイズ

変動するのが、系列の数だとすれば、

1)コード(AAA)から、直接、必要なデータをコード(集計)に転記
2)転記したデータ数に基づき、系列を表示・非表示させる

(マナ) 2017/05/23(火) 21:28


 >なぜ、2行なのでしょうか? 

 なぜでしょうか…渡された時からこうなっていたのでそのままでした。
グラフも作り直した方がいいかもしれません…

 >系列数は決まっていて、各系列のポイント数のみ変動ということですか? 

 そのとおりです。

 >ならば、予め多めに設定しておけば、

 そんなことができるのですね!
あらかじめ50列くらい登録しておけばグラフ範囲を変更しなくてよさそうですね。
グラフ作りなおして上司と相談します。

 >1)コード(AAA)から、直接、必要なデータをコード(集計)に転記 
 >2)転記したデータ数に基づき、グラフ範囲をリサイズ 

 これがしたかったのですが、できていません。
1)の必要なデータをもってくる、のマクロ記録が取れなくて計算用シートをかましています。
2)のグラフ範囲をリサイズは失敗しまくっています。

(Q田) 2017/05/24(水) 15:31


動作確認できていませんが、試してみてください。

 Option Explicit

 Sub test()
    Dim wsD As Worksheet, wsG As Worksheet
    Dim r As Range
    Dim i As Long, n As Long
    Dim cho As ChartObject, cht As Chart, ser As Series

    Set wsD = Worksheets("コード(AAA)")
    Set wsG = Worksheets("コード(集計)")

    With wsD.Range("A1").CurrentRegion

        For i = 4 To .Columns.Count Step 3
            n = n + 1
            If n = 1 Then
                Set r = .Columns(i)
            Else
                Set r = Union(r, .Columns(i))
            End If
        Next

        Set r = Intersect(.Range("4:5,12:14,19:21,40:56"), r)

    End With

    r.Copy
    wsG.Range("C17").PasteSpecial xlValues

    For Each cho In wsG.ChartObjects
        For Each ser In cho.Chart.SeriesCollection
            ser.XValues = Range(Split(ser.Formula, ",")(1)).Resize(, n)
            ser.Values = Range(Split(ser.Formula, ",")(2)).Resize(, n)
        Next
    Next

 End Sub

(マナ) 2017/05/24(水) 19:04


↑転記前に、元のデータをクリアするコードがあったほうがよかったです。
グラフには影響しないはずですが。

(マナ) 2017/05/24(水) 23:02


ごめんなさい。13行目は転記してはいけなかったです。
 >4,5行、12,14行、19,20,21行、40〜56行

 >Set r = Intersect(.Range("4:5,12:14,19:21,40:56"), r)

(マナ) 2017/05/24(水) 23:16


 マナ様

 コードをありがとうございます!
早速やってみたのですが、「実行時エラー5 プロシージャの呼び出し、または引数が不正です」というのが出て

 Set r = Intersect(.Range("4:5,12:14,19:21,40:56"), r)

 が黄色くなります。
これ、.Range("4:5,12:14,19:21,40:56") か r が間違いということですよね?

 今rに何が入っているか解読しているのですが、理解が追い付かないうちに時間が来てしまいました。
今日一晩家で調べてきますので、しばらくお待ちください。
 
 
 
コード(AAA)シートのA1から4つ右(列)にいったところを起点にして3が加算される???
nが1だったら4列目をrにして、それ以外ならrと加算された列番号を選択する????

(Q田) 2017/05/25(木) 17:58


 あ、今気が付いた。
rの上にカーソル乗せると「r=Notning」て出ます。
 
If n = 1 Then
のnは「 n = 0 」でした。
 
nは1になるんじゃないんですかね・・・?+1してますよね?
(Q田) 2017/05/25(木) 18:06

Worksheets("コード(AAA)")の1,2行目は空白セルが多い?
であれば、
 >With wsD.Range("A1").CurrentRegion
   ↓
 With wsD.Range("A1", wsD.UsedRange)

これで、エラーはでないと思います。
ついでに、他にも少し修正。

 Option Explicit

 Sub test2()
    Dim wsD As Worksheet, wsG As Worksheet
    Dim r As Range
    Dim i As Long, n As Long
    Dim cho As ChartObject, cht As Chart, ser As Series

    Set wsD = Worksheets("コード(AAA)")
    Set wsG = Worksheets("コード(集計)")

    With wsD.Range("A1", wsD.UsedRange)
        '転記するデータは、4,7,10,…最終列まで、3列毎
        For i = 4 To .Columns.Count Step 3
            n = n + 1    'この値で、最後にグラフ範囲をリサイズ
            If r Is Nothing Then
                Set r = .Columns(i)
            Else
                Set r = Union(r, .Columns(i))
            End If
        Next
        '転記するデータは飛び飛びの特定行のみ
        Set r = Intersect(.Range("4:5,12:12,14:14,19:21,40:56"), r)

    End With

    With wsG.Range("C17")
        'C17を起点に、24行・100列分がグラフデータ領域(転記先)
        .Resize(24, 100).ClearContents
        r.Copy
        .PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With

    'グラフ範囲をリサイズ
    'すべての系列のポイント数をn個に変更
    For Each cho In wsG.ChartObjects
        For Each ser In cho.Chart.SeriesCollection
            ser.XValues = Range(Split(ser.Formula, ",")(1)).Resize(, n)
            ser.Values = Range(Split(ser.Formula, ",")(2)).Resize(, n)
        Next
    Next

 End Sub

(マナ) 2017/05/25(木) 20:02


 マナ様

 >With wsD.Range("A1").CurrentRegion
 >  ↓
 >With wsD.Range("A1", wsD.UsedRange)

 CurrentRegionを「A1から始まるデータ一塊」と説明してあるページを読んでましたが
これは空白等がなく連続したデータ範囲でなくてはいけないのですね…
勘違いしてました。

 ご推測の通り1行目は空白が多い(入力の説明行なのです)です。
UsedRangeは最後のセル、ジャンプで探す「最後のセル」ですね。なるほどです。
 
 
 新しいマクロをありがとうございます!
無事に動きました!!!感動です。

 途中のコメントもありがとうございます。大変助かりました。
こういう風にできるんだと、自分の発想外で驚きの連続です。
まだグラフ変更部分の書いていただいた構文に不明点がたくさん(調べれば調べるほどいろいろ出てきますね)なのですが、
きちんと理解して、いつか自分で組めるようになりたいです。

 マナ様、ありがとうございました。
 ???様もありがとうございました。
(Q田) 2017/05/26(金) 17:25

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.