IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copie d'un groupe d'image vers un autre classeur [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 22
    Points
    22
    Par défaut Copie d'un groupe d'image vers un autre classeur
    Bonjour,

    Voici mon problème :
    J'ai deux classeurs.
    Dans le premier, on va l'appeler source, j'ai un onglet avec une image (ou un groupe d'image ou des images groupée).
    Je voudrais copier les images uniquement si elles sont comprises dans un ensemble de lignes, dans un classeur cible.
    Je ne connais pas le nombre d'images à copier, ni leur nom.
    Le code VBA est dans le classeur cible.

    voilà ce que j'ai pu coder...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    ' xlsheet est déjà renseigné et correspond à une feuille de mon classeur cible
    ' LigneImportIMG est le numéro de la ligne où insérer mon  (mes) image(s)
     
    Sub ImporterPagesIC(strFichier As String)
     
     
        'ouvre le classeur et la feuille de présentation
        Dim Wbk As Workbook
        Dim WbS As Worksheet
        Dim onglet As String
        Dim nbSel As Integer
     
        On Error GoTo ERR
     
            Set Wbk = Workbooks.Open(FileName:=strFichier, ReadOnly:=True)
            If Not Existe(Wbk, "Pages présentation") Then
                Do
                    onglet = InputBox("Veuillez indiquer le nom de l'onglet contenant les pages de présentation.", "Nom de l'onglet", "Nom de l'onglet")
                Loop Until Existe(Wbk, onglet) = False
                Set WbS = Wbk.Worksheets(onglet)
            Else
                Set WbS = Wbk.Worksheets("Pages présentation")
            End If
     
     
     
            'Recherche si elle contient des pages d'Identification de composants        
            Dim i As Integer, IMG As Integer
            Dim HPB As HPageBreak
            Dim ADR As Long, row As Long, RowIMG As Long
     
            'Commence page 4 => on va chercher la ligne du 3eme saut de page
            For i = 3 To WbS.HPageBreaks.Count
                'Mémorise la ligne du saut de page
                ADR = WbS.HPageBreaks(i).Location.row
                For row = 4 To 7
                    RowIMG = row + ADR
                    'Le titre de la page se trouve dans une cellule fusionnée de A à O
                    If WbS.Range("A" & RowIMG).MergeArea.Address = "$A$" & RowIMG & ":$O$" & RowIMG Then
                        If WbS.Range("A" & row + ADR) = "IDENTIFICATION DES COMPOSANTS" Or WbS.Range("A" & row + ADR).value = "DESIGNATION OF COMPONENTS" Then
                            'On est bien sur une page d'identification des composants
                            'Il faut maintenant créer une page d'identification des composants et insérer l'image trouvée
                            CreerIdentificationComposants
                            PageComposants = PageComposants + 1
                            nbSel = 0
                            'On selectionne toutes les images contenues entre ADR+4 et wbs.hpagebreaks(I+1).location.row recherche l'image
                            For IMG = 1 To WbS.Shapes.Count
                                'récupère la ligne de la première cellule occupée par l'image
                                Debug.Print "Limite de la page : lignes " & ADR & " à " & WbS.HPageBreaks(i + 1).Location.row
                                RowIMG = Right(WbS.Shapes(IMG).TopLeftCell.Address, Len(WbS.Shapes(IMG).TopLeftCell.Address) - InStr(2, WbS.Shapes(IMG).TopLeftCell.Address, "$"))
                                Debug.Print "Image : " & RowIMG
                                If RowIMG > ADR And RowIMG < WbS.HPageBreaks(i + 1).Location.row Then
                                    WbS.Shapes(IMG).Select False
                                    Debug.Print WbS.Shapes(IMG).Name
                                    nbSel = nbSel + 1
                                End If
                            Next IMG
     
                            ' *********ERREUR A PARTIR DE LA*********
                            'On groupe la sélection si ce n'est pas un groupe afin de garder l'agencement des images 
                            '
                            'If nbSel > 1 Then
                            '    On Error Resume Next
                                Selection.Group.Select
                            '    If ERR > 0 Then
                            '        Debug.Print "Images séléctionnées : " & nbSel & " - Erreur lors du group"
                            '        'MsgBox "pb"
                            '    End If
                            'End If
                            Selection.Copy
                            xlsheet.Range("A" & LigneImportIMG).Select
                            xlsheet.Paste
                            xlsheet.Range("A" & LigneImportIMG).PasteSpecial
                            'Selection.Ungroup
                            ' *********** Comment ne plus  sélectionner les images ? *************
                            'Selection.Clear
                            'Shape.Ungroup
                            Exit For
                        End If
                    End If
                Next row
            Next i
     
            Wbk.Close False
        Exit Sub
     
    ERR:
        Dim alog As New log
        alog.Enregistrer "Classe ITP - ImporterPagesIC() - Erreur n°" & ERR.Number & " - " & ERR.Description
        Debug.Print "Classe ITP - ImporterPagesIC() - Erreur n°" & ERR.Number & " - " & ERR.Description
        MsgBox "Une erreur est survenue lors de l'importation : " & Chr(10) & ERR.Description & Chr(10), vbCritical, "Erreur lors de l'importation"
        ERR.Clear
        Wbk.Close False
     
    End Sub
    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 22
    Points
    22
    Par défaut
    Salut,

    J'ai trouvé ma solution, et je la partage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    ' xlsheet est déjà renseigné et correspond à une feuille de mon classeur cible
    ' LigneImportIMG est le numéro de la ligne où insérer mon  (mes) image(s)
     
    Sub ImporterPagesIC(strFichier As String)
     
     
        'ouvre le classeur et la feuille de présentation
        Dim Wbk As Workbook
        Dim WbS As Worksheet
        Dim onglet As String
        Dim nbSel As Integer
        Dim TabIMG() As Variant 'Tableau qui contiendra le nom des images à importer
     
     
        On Error GoTo ERR
     
            Set Wbk = Workbooks.Open(FileName:=strFichier, ReadOnly:=True)
            If Not Existe(Wbk, "Pages présentation") Then
                Do
                    onglet = InputBox("Veuillez indiquer le nom de l'onglet contenant les pages de présentation.", "Nom de l'onglet", "Nom de l'onglet")
                Loop Until Existe(Wbk, onglet) = False
                Set WbS = Wbk.Worksheets(onglet)
            Else
                Set WbS = Wbk.Worksheets("Pages présentation")
            End If
     
     
     
            'Recherche si elle contient des pages d'Identification de composants        
            Dim i As Integer, IMG As Integer
            Dim HPB As HPageBreak
            Dim ADR As Long, row As Long, RowIMG As Long
     
            'Commence page 4 => on va chercher la ligne du 3eme saut de page
            For i = 3 To WbS.HPageBreaks.Count
                'Mémorise la ligne du saut de page
                ADR = WbS.HPageBreaks(i).Location.row
                For row = 4 To 7
                    RowIMG = row + ADR
                    'Le titre de la page se trouve dans une cellule fusionnée de A à O
                    If WbS.Range("A" & RowIMG).MergeArea.Address = "$A$" & RowIMG & ":$O$" & RowIMG Then
                        If WbS.Range("A" & row + ADR) = "IDENTIFICATION DES COMPOSANTS" Or WbS.Range("A" & row + ADR).value = "DESIGNATION OF COMPONENTS" Then
                            'On est bien sur une page d'identification des composants
                            'Il faut maintenant créer une page d'identification des composants et insérer l'image trouvée
                            CreerIdentificationComposants
                            PageComposants = PageComposants + 1
                            nbSel = 0
                            'On selectionne toutes les images contenues entre ADR+4 et wbs.hpagebreaks(I+1).location.row recherche l'image
                            For IMG = 1 To WbS.Shapes.Count
                                'récupère la ligne de la première cellule occupée par l'image
                                Debug.Print "Limite de la page : lignes " & ADR & " à " & WbS.HPageBreaks(i + 1).Location.row
                                RowIMG = Right(WbS.Shapes(IMG).TopLeftCell.Address, Len(WbS.Shapes(IMG).TopLeftCell.Address) - InStr(2, WbS.Shapes(IMG).TopLeftCell.Address, "$"))
                                Debug.Print "Image : " & RowIMG
                                If RowIMG > ADR And RowIMG < WbS.HPageBreaks(i + 1).Location.row Then
                                    ReDim Preserve TabIMG(nbSel)
                                    TabIMG(nbSel) = WbS.Shapes(IMG).Name
                                    nbSel = nbSel + 1                           
                                End If
                            Next IMG
     
                           If nbSel > 1 Then
                                WbS.Shapes.Range(TabIMG).Group.Copy
                            Else
                                WbS.Shapes(TabIMG(0)).Copy
                            End If
     
                            pSommaire.Range("A" & LigneImportIMG).Select
                            pSommaire.Paste
                            Exit For
                        End If
                    End If
                Next row
            Next i
     
            Wbk.Close False
        Exit Sub
     
    ERR:
        Dim alog As New log
        alog.Enregistrer "Classe ITP - ImporterPagesIC() - Erreur n°" & ERR.Number & " - " & ERR.Description
        Debug.Print "Classe ITP - ImporterPagesIC() - Erreur n°" & ERR.Number & " - " & ERR.Description
        MsgBox "Une erreur est survenue lors de l'importation : " & Chr(10) & ERR.Description & Chr(10), vbCritical, "Erreur lors de l'importation"
        ERR.Clear
        Wbk.Close False
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. copie des données d'un champ vers un autre
    Par cvlpj dans le forum IHM
    Réponses: 10
    Dernier message: 26/12/2006, 22h15
  2. Réponses: 1
    Dernier message: 26/12/2006, 16h23
  3. copie d'une zone de texte vers une autre zone de texte
    Par db48752b dans le forum Access
    Réponses: 7
    Dernier message: 23/08/2006, 08h41
  4. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39
  5. Copie du contenu d'un répertoire vers un autre
    Par IG88 dans le forum Windows
    Réponses: 4
    Dernier message: 30/07/2004, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo