• 締切済み

エクセルにてマクロで図形を複写

Windows2000でEXCEL2002を使用しています。 Sheet1の特定の位置へSheet2にある図形をコピーするマクロを作ったのですが、 クリップボードを使わないで同じ事が出来ないでしょうか。 マクロは初心者なので、よろしくお願いします。 Sub cmd画像A_Click() Sheets("Sheet2").Shapes("pic001").Copy Sheets("sheet1").Paste _ Destination:=Worksheets("Sheet1").Range("C3") End Sub

みんなの回答

  • 2002pon
  • ベストアンサー率48% (42/87)
回答No.2

#1の方が言われるとおり、カット&ペーストでないとすれば、 やはり、改めて同じものを描画する、って感じでしょうか。 そのためには「最低でも」、コピー元の5つのプロパティを取得しておく必要があります。 コピー元の図形がすでにセレクトされた状態で、 myType = Selection.ShapeRange.AutoShapeType myLeft = Selection.ShapeRange.Left myTop = Selection.ShapeRange.Top myWidth = Selection.ShapeRange.Width myHeight = Selection.ShapeRange.Height と、5つのプロパティの値を取得し任意の変数に格納します。 で、 Sheets("sheet1").Activate ActiveSheet.Shapes.AddShape(myType, myLeft, myTop, myWidth, myHeight).Select ってとこですか。 これで、sheet2とまったく同じ位置に同じ形状の図形が描画されます。 myLeft, myTopの変数をいじれば、 (例:myLeft = myLeft + 10.0 等) 違う位置になりますね。 ただし、プロパティはもっといろいろあるので、 線の太さや色、塗りつぶしなどなど、全部一緒にするのには、 もっとコピー元のプロらティを取得し、新しい図形にセットする必要があります。

ebis
質問者

お礼

アドバイスをありがとうございます。 ただ、グループ化したオートシェイプやビットマップ画像ですと、「指定された値は境界を超えています」とエラーが出てしまいます。 No1の方にも書いた通り、説明不足ですみません。 今のマクロでも一応動いてはいるのですが、 クリップボード=A B=クリップボード となっているものを B=A と表す方法があればいいなと思っています。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

下記参考になりますでしょうか。 (コピーするオブジェクト内容・中身) VBAでコピーする背後には、コピー元が何であっても(場合によって変わっても)それを自動的に貼りつける事を行うことが予期されている。 逆にコピー元の図形が決まって(固定して)いるならSheet1にもその図形を加えれば(Add)よい。コピーと考えなくて良いのでは。Sheet2.図形1---(コピー)-->Sheet1.図形1 でなくて、図形1--(Add)--->Sheet2、そして 図形1--(Add)--->Sheet1のイメージです。 (位置) 図形がAdd(貼りつけ)されるシート上の位置は、(オブジェクト).Add(x,y,z,u)や(オブジェクト).Add Left:=100,..のように指定します。明示的に記入しない場合の順序はLeft:= ,Top:= ,Width:= ,Height:=の順序です。 <一例>  ActiveSheet.Shapes.AddShape(msoShapeRectangle, 71.25, 31.5, 45.75, 21.75). Select 上の()内の4個の数値がそれです。 (図形以外のセルへのコピー) 私がVBAを使い始めて以来のCopyの悩ましい点は下記の点です。 ●ActiveなSheetとは、ActiveなCellがあるSheetです。 あるセルをActiveにするには、 Sheets("sheet2").Range("c3").Activateまたは Sheets("sheet2").Range("c3").Selectで出来る。 ●CopyをVBAでコーディングして実行されても、Activeセルは変わらない。したがって貼りつけしたいセル位置を Activeにして、Copyしその後Pasteする。 Active-Copy-ActiveSheet.Pasteのステップ順序です。 ●Copyの貼りつけは、「Activeなシートに対して行う」もので、指定したRange位置(セル)を始点として行うもので無い。少なくともVBAコーディングの上では。 ただ現在Activeになっているセルの位置は尊重されて、Activeセルからコピーされるが、基本はシートへのコピーのようである。(この点明確に説明した本がほとんどお目にかからないが私は随分失敗した。)貴方も今後この点ウオッチしてみてください。質問例でもこの点やや甘いのではないでしょうか。(Destination:=の部分)  Sub Macro1() ' Sheets("sheet2").Range("c3").Activate Sheets("sheet2").Range("c3").Select Sheets("sheet1").Range("a1:s2").Copy ActiveSheet.Paste End Sub

ebis
質問者

お礼

素早い解答ありがとうございます。 画像の貼り付け位置指定の方法は、自分でもこんなのでいいのかなと、付けたのですが、一応セルの指定位置を変えると、それなりに貼りつけ位置も変わったので、しっくりこないまま納得してました。 座標指定の方がやはりいいですね。 あと、なぜわざわざSheet2からSheet1に貼りつけたいかというと、Sheet1は印刷用の雛型レイアウトがあり、その中の決まった場所に図面を入れたいのです。 Sheet2はその図面が何十種類か置いてあり、簡単な図面はオートシェイプを組み合わせグループ化して名前を付け、複雑な図面はビットマップで置いてあります。 必要に応じてコピー&ペーストしていたのですが、図面の数が増えてきたのでheet1の欄外にボタンを並べ、クリックするだけで図面が入るようにしました。 説明が不充分ですみません。

関連するQ&A