1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| Option Explicit
Sub CopieObjets()
'Const zone1$ = "A44:L63", dest1$ = "A62:L79" 'source théorique si pas de chevauchement
'Const zone2$ = "M44:X63", dest2$ = "M62:X79"
Const zone1$ = "A44:K63", dest1$ = "A62:L79" 'source volontairement réduite pour pallier à un chevauchement
Const zone2$ = "L44:X63", dest2$ = "M62:X79" 'source volontairement agrandie pour pallier à un chevauchement
Const zone3$ = "A66:K87", dest3$ = "A82:L99"
Const zone4$ = "L66:X87", dest4$ = "M82:X99"
Const zone5$ = "A107:K128", dest5$ = "A102:L119"
Const zone6$ = "L107:X128", dest6$ = "M102:X119"
Dim wbk As Workbook, wbkS As Workbook, wbkF As Workbook
Dim shp As Shape
' Définition des fichiers avec uniquement les 2 fichiers ouverts + cette macro
For Each wbk In Workbooks
If wbk.Name <> ThisWorkbook.Name Then
If wbk.Name Like "FicheAppui*" Then
Set wbkF = wbk
Else
Set wbkS = wbk
End If
End If
Next
If wbkS Is Nothing Or wbkF Is Nothing Then
MsgBox "Il faut ouvrir les deux fichiers source et final" & vbCrLf & _
"avant de lancer cette macro", vbCritical
Exit Sub
End If
' Effacer toutes les formes du fichier final, sauf commentaires et zones de texte
If wbkF.Worksheets(1).Shapes.Count > 0 Then
For Each shp In wbkF.Worksheets(1).Shapes
Select Case shp.Type
Case msoComment, msoTextBox
Case Else
shp.Delete
End Select
Next shp
End If
' Copier les formes
Application.ScreenUpdating = False
With wbkS.Worksheets(1)
Call CopierFormesZone(.Shapes, .Range(zone1), wbkF.Worksheets(1).Range(dest1))
Call CopierFormesZone(.Shapes, .Range(zone2), wbkF.Worksheets(1).Range(dest2))
Call CopierFormesZone(.Shapes, .Range(zone3), wbkF.Worksheets(1).Range(dest3))
Call CopierFormesZone(.Shapes, .Range(zone4), wbkF.Worksheets(1).Range(dest4))
Call CopierFormesZone(.Shapes, .Range(zone5), wbkF.Worksheets(1).Range(dest5))
Call CopierFormesZone(.Shapes, .Range(zone6), wbkF.Worksheets(1).Range(dest6))
End With
Application.ScreenUpdating = True
' Voir le résultat
Application.Goto wbkF.Worksheets(1).Range(dest1).Cells(1, 1)
ActiveWindow.ScrollColumn = wbkF.Worksheets(1).Range(dest1).Column
ActiveWindow.ScrollRow = wbkF.Worksheets(1).Range(dest1).Row - 1
End Sub
Private Sub CopierFormesZone(formes As Shapes, zone As Range, cible As Range)
Const nomT$ = "Transfert_Forme", nomA$ = "Ajout_Forme"
Dim forme As Shape, groupe As Shape
Dim coefH As Double, coefW As Double
Dim t() As String, i As Integer
' Chercher les formes situées dans la zone
For Each forme In formes
Select Case forme.Type
Case msoComment, msoTextBox
Case Else
If Not Intersect(forme.TopLeftCell, zone) Is Nothing Then
i = i + 1
ReDim Preserve t(1 To i)
t(i) = forme.Name
End If
End Select
Next
If i = 0 Then Exit Sub
' Définir le groupe des formes
If i = 1 Then
' si il n'y a qu'une forme, en ajouter une pour créer un groupe à l'échelle 100%
With formes(t(1))
Set forme = formes.AddShape(msoShapeRectangle, .Left, .Top, .Width, .Height)
forme.Name = nomA
i = i + 1
ReDim Preserve t(1 To i)
t(i) = forme.Name
End With
End If
Set groupe = formes.Range(t).Group
' Copier le groupe
groupe.Name = nomT
groupe.Copy
cible.Parent.Paste
groupe.Ungroup
If t(2) = nomA Then formes(nomA).Delete
Set forme = cible.Parent.Shapes(nomT)
' Positionner et redimensionner le groupe
forme.Top = cible.Top + 2
forme.Left = cible.Left + 2
coefH = (cible.Height - 4) / forme.Height
coefW = (cible.Width - 4) / forme.Width
If coefH < 1 Or coefW < 1 Then
forme.Height = forme.Height * IIf(coefH < coefW, coefH, coefW)
forme.Width = forme.Width * IIf(coefH < coefW, coefH, coefW)
End If
forme.Ungroup
If t(2) = nomA Then cible.Parent.Shapes(nomA).Delete
End Sub |
Partager