[[20150722164128]] 『オートシェイプのコピペにおけるSelectについて』(さいき) ページの最後に飛ぶ

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

 

『オートシェイプのコピペにおけるSelectについて』(さいき)

 いつもとりとめのない質問でお世話になっております

 設定シートにある図形の四角とグラフを、グラフ2シートのL135に貼り付けたいです
 マクロの記録をとると以下ですが、

 Sub Test1()
    Sheets("選択").Select
    ActiveSheet.Shapes.Range(Array("Rectangle 1", "Chart 1")).Select
    Selection.Copy
    Sheets("グラフ2").Select
    Range("L135").Select
    ActiveSheet.Paste
 End Sub

 いろいろやってエラーがでまくった結果、
 ShapesにはCopyが使えない? PasteはSelectしてから?
 ということは、このコードはこれ以上いじれない?
 図形をグループ化してCopyを1行にしても、
 結局Pasteするのに Sheets("グラフ2").Selectが必須?
 という風に推移していき、何に疑問をもっているのかわからなくなってきました

 このコードは無駄にSelectをしていないのでしょうか??

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


ん〜、こういうことがしたいのですかね?

 Sub Test1()
    Sheets("選択").Shapes.Range(Array("Rectangle 1", "Chart 1")).Select
    Selection.Copy
    Sheets("グラフ2").Range("L135").PasteSpecial
 End Sub
(???) 2015/07/22(水) 17:53

 >> いろいろやってエラーがでまくった結果、

 Selectが必要かどうかは別にして、アップされたコード、このまま、こちらで動かしましたら
 ちゃんと、選択シートの四角形とチャートが、グラフ2シートのL135を起点に、選択シートにあるそれぞれの
 位置関係を保ってペーストされますが??

 質問のポイントは、このコードでエラーになるということではなく、無駄なSelectをしない書き方を知りたいということですか?

 ちなみに、(???)さんのコードでは、両方がグループ化されて貼りつきますね。
 (というか、対象シェープの領域が図として貼りつき)

(β) 2015/07/23(木) 11:02


 ???さん
 貼付けは画像としてではなく、そのまま四角とグラフとして貼り付けたいのです
 でも画像としてならこれだけわかりやすいコードになるんですね
 ありがとうございます!!

(さいき) 2015/07/23(木) 14:02


 βさん
 また混乱のままややこしいことを書いてしまいました
 >無駄なSelectをしない書き方を知りたいということですか?
 そうです
 色々やって = このコードをいじりまくった結果 です

(さいき) 2015/07/23(木) 14:05


 以下のように2つのシェープを、それぞれわければSelectなしでペーストすることはできると思います。

    With Sheets("選択").Shapes.Range(Array("Rectangle 1", "Chart 1"))
        .Item(1).DrawingObject.Copy
        Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")
        .Item(2).DrawingObject.Copy
        Sheets("グラフ2").Paste Sheets("グラフ2").Range("L150")
    End With

(β) 2015/07/23(木) 14:33


 やりたいことを簡潔に申し上げますと、
 >設定シートにある図形の四角とグラフを、グラフ2シートのL135に貼り付けたいです
 になります

 全体的な作業としましては、
 1.データファイルから必要なデータをVLOOKUPにて表示させている元ファイルがあります
 2.そこから特定のフォルダに、検索値をかえて転記ファイルを15個作成します
 3.特定のフォルダ内のすべての転記ファイルに対して値貼付を行います
 4.ファイル名にて分岐させてこの貼付け処理を行います
 5.不要シートを削除し、必要シートのみを印刷させます

 *転記ファイルは10系列のグラフを1シートに40個以上表示させています
 *一番時間のかかっているのは、計測した結果、印刷だとわかっております
 *私が異動になった後も、条件変更、及びレイアウト変更を手作業にてできるように元ファイルをVLOOKUPにて作成できるようにしております
 (すべて、だいたい、これのせい)
 *データファイル6MB、元ファイル及び、処理前の転記ファイル5.5MB、処理済転記ファイル500KB

 その過程で、Shapesの扱いにいつも困っているので質問させていただきました
 複数のShapesを選択するには、Shapes.Range(Array())しかないのか?
 別のシートに貼り付ける際にはSelectせずにはいられないのか?
 等、手探りで進んでおります

 現在は、最初に記載したマクロの記録コードのままで実行しております

(さいき) 2015/07/23(木) 14:55


 βさん
 長々と書いている間にありがとうございます
 最後は分けて貼り付けようとは思っていました(実行せず)

 さっき思いつきで、ファイル名にて分岐させてこの貼付け処理を行うのか、
 それとも逆にはじめからグラフ2シートにおいておき、分岐で削除した方がいいのか検証しようとしたところで、他の仕事が入りました
 後程、この方法でやってみます

 ちょっと嫌いなSQLと格闘してきます…… 

(さいき) 2015/07/23(木) 14:56


 >>別のシートに貼り付ける際にはSelectせずにはいられないのか?

 別シートへの貼り付けだけは Selectなしで可能です。
 ただ、それに至るまでは、Selectが必要ですねぇ。

 しかも

    Sheets("選択").Shapes.Range(Array("Oval 1", "Rectangle 2")).Select
    Selection.Copy
    Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")

 こう書くと、2行目の Selection これが、実行にアクティブなシートで選択されたものになってしまいますので
 選択シート以外がアクティブの場合、選んだシェープではないものを参照してしまいます。

 なので、やむなしで

  Sheets("選択").Select

    ActiveSheet.Shapes.Range(Array("Oval 1", "Rectangle 2")).Select
    Selection.Copy
    Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")

 にならざるを得ないのでしょうねぇ・・・

 Copy対象はシェープではなく DrawingObject なので、それを Copyメソッドに与えることができればいいのですが
 複数シェープの場合、その複数シェープのDrawingObjectというものを取得できそうにありません。
 (ローカルウィンドウ等で、調べまくっても、それらしいものはでてきませんので不可能?)

(β) 2015/07/23(木) 15:13


 自分で、DrawingObjectと書いて、ふと。

    Sheets("選択").DrawingObjects(Array("Oval 1", "Rectangle 2")).Copy
    Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")

 これでOKですね。

 もし、これとこれという限定ではなく、そのシート上の図形をすべてコピーしていいなら

    Sheets("選択").DrawingObjects.Copy
    Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")

 これでもいけますが。

(β) 2015/07/23(木) 15:28


 βさん
 すみません、まだACCESSファイル(440MB)と格闘中ですが、息抜きにのぞきにきました

 > Copy対象はシェープではなく DrawingObject なので、それを Copyメソッドに与えることができればいいのですが
 以前、単品コピペ時にDrawingObjectを使用したことがありましたが、DrawingObjects(Array())とできるんですね…

 「Array()で複数入れれる」くらいのふんわり理解度なもので、積極的に使用できません…
 ACCESSファイルとの格闘(ああ、日付データが邪魔をする…)が終わり次第、頑張って勉強しようと思います

 >Sheets("選択").DrawingObjects(Array("Oval 1", "Rectangle 2")).Copy
 >Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")
 ありがとうございます!!!! あとでこれ、試します……

(さいき) 2015/07/23(木) 16:18


 あげてしまってすみません(TдT)

 >Sheets("選択").DrawingObjects(Array("Oval 1", "Rectangle 2")).Copy
 >Sheets("グラフ2").Paste Sheets("グラフ2").Range("L135")
 こちらでうまくいきました!

 DrawingObjectもそうですが、シートとセル以外の取り扱いについてもう少し勉強しなければと思います
 (が、社内のデータ取得アプリ(?)が一新された為、それの対応におわれております
 ファイル名を.xlsで固定しなきゃよかった……)

 これで作業がはかどります
 βさん、本当にありがとうございました!
(さいき) 2015/08/05(水) 15:55

コメント返信:

[ 一覧(最新更新順) ]


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