简体   繁体   中英

excel Copy shapes from one worksheet to another

I am trying to use a macro to copy all the shapes (images) from a worksheet to another. I used the record macro to do it, but it always gives an aleatory name to the shape making it impossible to reproduce it when we don't know the name of shapes.

This will copy all the shapes from Sheet1 to Sheet2 :

Sub CopyShape()
    Dim s As Shape
    For Each s In Sheets("Sheet1").Shapes
        s.Copy
        Sheets("Sheet2").Paste
    Next s
End Sub

Once the copy is complete, you can position them as you like or rename them as you like.
(An alternative is just to make a copy of the entire worksheet.)

EDIT#1:

This code will also automatically assign Names and positions to the copied Shapes:

Sub CopyShape()
    Dim shp1 As Shape, nombre As String
    Dim s1 As Worksheet, s2 As Worksheet
    Dim shp2 As Shape

    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")

    For Each shp1 In s1.Shapes
            nombre = shp1.Name
            shp1.Copy
            s2.Paste
            Set shp2 = s2.Shapes(s2.Shapes.Count)
            shp2.Name = nombre
            shp2.Top = shp1.Top
            shp2.Left = shp1.Left
    Next shp1
End Sub

Be careful to avoid name conflicts if you perform re-copies.

I've added the means to place the Shape in the target Sheet at about the same location. Below is how I use it.

    Private Sub CopyShape(ByVal shp_source As Shape, _
                          ByVal wsh_target As Worksheet, _
                          ByRef shp_target As Shape)
    ' -------------------------------------------------------------------
    ' Copies the Shape (shp_source) to Worksheet (wsh_target) and returns
    ' the target Shape (shp_target). Places the  Shape on the target
    ' sheet at the same cell (row/column) as the source Shape.
    ' -------------------------------------------------------------------
        Dim rng As Range

        Set rng = wsh_target.Cells(shp_source.TopLeftCell.Row, shp_source.TopLeftCell.Column)
        shp_source.Copy
        wsh_target.Paste rng
        Set shp_target = wsh_target.Shapes(wsh_target.Shapes.Count)
        With shp_target
           .Name = shp_source.Name
           .Top = shp_source.Top
           .Left = shp_source.Left
        End With

    End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM