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 de résultats dans un onglet de sauvegarde / plages distinct


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Copie de résultats dans un onglet de sauvegarde / plages distinct
    Bonjour à tous,

    Je débute en VBA et j'aurais besoin de vos lumières pour le cas suivant :

    Je souhaite créer une macro permettant de copier les valeurs de quelques cellules d'un premier onglet vers un onglet de "SAUVEGARDE". Petite difficulté les plages contenant les valeurs à copier ne sont pas forcément adjacentes ou continues...

    La macro doit plus exactement :
    - copier le contenu de certaines cellules du premier onglet
    - formater les valeur disséminée sur une ligne
    - incrémenter le numéro de ligne de l'onglet "sauvegarde"
    - coller les valeurs sous la dernière ligne sauvegardée.

    J'ai bricolé un code avec l'enregistreur de macro ainsi que de mes micros connaissances en VBA !

    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
     
    Sub copie2()
     
    Static Compteur As Integer
    Dim numligne As Integer
     
        Compteur = Compteur + 1
        numligne = Compteur + 1
        Range("B7:C7").Select
        Selection.Copy
        Sheets("SAUVERGARDE").Select
        Range("A1").Offset(Compteur, 1).Select
        Cells(numligne, 1).Value = Compteur
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
    End Sub
    Par contre j'ai l'impression que les copier coller ne sont plus synchro avec la valeur de mon ID lorsque je ferme et ré ouvre le fichier... avez-vous une solution pour palier à cela ? Par ailleurs je ne vois pas comment résoudre le problème de la conversion en ligne des plages non contigues.

    A toute fin utile ci-joint le fichier
    Merci d'avance pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Pas sûr d'avoir compris donc, testes ce code et reviens si ce n'est pas ça :
    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
     
    Sub copie2()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim Lig As Long
        Dim I As Long
     
        'argument "L" à 2 pour ne pas prendre en compte la première ligne
        Set Plage = DefPlage(Worksheets("resultat"), 2, 1)
     
        With Worksheets("SAUVERGARDE")
     
            'recherche la première ligne vide
            Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
     
            'inscrit la valeur servant d'ID (si c'est ce qu'il faut ?)
            .Cells(Lig, 1) = Lig - 1
     
            'pour éviter la colonne ID (A)
            I = 1
     
            'le parcour de la plage se fait de haut en bas et de droite à gauche
            For Each Cel In Plage.SpecialCells(xlCellTypeConstants)
     
                I = I + 1
                .Cells(Lig, I).Value = Cel.Value
     
            Next Cel
     
        End With
     
    End Sub
     
    Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range
     
        On Error GoTo Fin
     
        With Fe
     
            Set DefPlage = .Range(.Cells(L, C), _
                           .Cells(.Cells.Find("*", .[A1], -4123, , _
                           1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                           2, 2).Column))
     
        End With
     
        Exit Function
     
    Fin:
     
        Set DefPlage = Nothing
     
    End Function

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour Theze,

    merci pour ton retour ! On voit l'expert à l'œuvre. Vivement le moment où j'y arriverai par moi-même....

    Le code remplit à merveille son rôle. En réalité il le remplit même trop bien
    Je m'explique : ici sauf erreur de ma part, chaque cellule renseignée dans l'onglet "rsultat" est copiée.

    En fait, je souhaite intégrer ce code dans un classeur à plusieurs onglets de type "résultat" pour effectuer la recopie de cellules préalablement identifiées (cf cellules grisées dans mon fichier joint)

    Quelqu'un aurait-il la solution ?

    Bien cordialement

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Je me permets juste de remonter ma dernière question... il se trouve que j'aimerais intégrer cette macro dans un classeur excel que je serai amené à présenter à d'autres personnes d'ici quelques jours...

    Merci d'avance !

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Ma manière personnelle de répondre :
    - on constitue la plage des cellules concernées (utilisation au besoin de la méthode Union)
    - on copie d'un seul bloc cette plage vers la destination de son choix (méthode Range.Copy à lire dans ton aide VBA interne).

    Merci d'avance de commencer à t'y mettre sur la base de ces indications et lectures.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour !

    Après avoir commencé un cours VBA, j'arrive en version simplifiée au code suivant :
    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
     
    Sub copiercollercellules()
     
        Dim Shto As Worksheet
        Dim ShtTo As Worksheet
        Dim Vartab As Variant
     
        Set shfrom = Worksheets("F1")
     
        Set Shto = Worksheets("F2")
     
        'on cherche à copier les cases A1-C3-C6 présent dans l'onglet F1 vers l'onglet F2. Les données seront coller à partir de A2 sur une seule ligne
     
        Vartab = shfrom.Range("A1, C3, C6")
        Debug.Print Vartab
     
        Shto.Range("A2").Resize(UBound(Vartab, 1), UBound(Vartab, 3)) = Vartab
     
     
    End Sub
    pb : j'ai une erreur d'exécution type 13 "incompatibilité de type"
    Une idée de ce qui coince ?
    Merci



    nb : Pour l'emploi de la méthode union, il semblerait que je ne puisse pas déverser le contenu des cellules dans une variable de type tableau

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Comment peux-tu espérer afficher ce qui n'est pas du texte, mais un objet (un objet Range) ?
    Affiche donc sa propriété Value

    Pour l'emploi de la méthode union, il semblerait que je ne puisse pas déverser le contenu des cellules dans une variable de type tableau
    Bien évidemment que non ! On ne peut "déverser" dans un tableau dynamique que des plages de cellules continues.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    rebonjour,

    et merci de t'intéresser à mon cas.

    Est-ce que tu pourrais m'indiquer plus précisément de de quelle manière je suis censé afficher les values de mon RANGE("A1, C3, C6") ?

    désolé pour la question de (gros) débutant.

    cordialement

  9. #9
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Est-ce que tu pourrais m'indiquer plus précisément de de quelle manière je suis censé afficher les values de mon RANGE("A1, C3, C6") ?
    Au hasard : par exemple (et entre autres) en en affichant une concaténation avec un séparateur, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Range("A1").value & " / " & Range("C3").value & " / " & Range("C6").Value
    Mais ne penses-tu pas qu'il serait plus simple d'en afficher l'adresse (propriété address) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.print Vartab.address
    plutôt que forcément le contenu ?
    Si l'adresse est bonne, le contenu l'est forcément également, non ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 9
    Points
    9
    Par défaut MàJ developpement
    Rebonjour,

    Je prends note de la propriété Adresse, je te remercie.

    Entre temps bonne nouvelle, j'ai réussi à valider la première étape de mon projet : copier des cellules désordonnées vers un autre onglet en les mettant sur une ligne.
    L'étape suivante est qu'à chaque exécution de la Macro, j'incrémente un ID et que les transferts (ou sauvegardes) se fassent les un en dessous des autres comme sur l'exemple qui suit :
    Nom : CaptureExcel.JPG
Affichages : 117
Taille : 16,7 Ko

    J'ai actuellement le code suivant :

    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
     
    Sub copiercollercellules2()
     
        Dim A, B, C As Long
        Dim D As Date
        Dim NbLignes As Integer
        Dim NumLigne As Integer
        Dim Vartab As Variant
     
     
        A = Sheets("F1").Range("A4")
        B = Sheets("F1").Range("C4")
        C = Sheets("F1").Range("C7")
        D = Now
     
        'on cherche à copier les cases A1-C3-C6 présent dans l'onglet F1 vers l'onglet F2. Les données seront collées à partir de A2 sur forme d'une seule ligne
        'intégration d'un ID et de la date d'excécution de la macro
     
        Sheets("F2").Select
        NbLignes = Selection.Rows.Count
        Vartab = Array(NbLignes, D, A, B, C)
        NumLigne = NbLignes + 1
        Range("A" & NumLigne).Resize(1, UBound(Vartab) + 1) = Vartab
     
        NumLigne = NumLigne + 1
     
    End Sub
    En réalité le code ne copie qu'une occurrence... mais je n'ai pas d'erreur
    Quelqu'un verrait-il ce qui coince ?

    Merci pour votre patience...!

Discussions similaires

  1. [XL-2010] Recherche multicritères et copie des résultats dans une autre feuille
    Par chacha49 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/08/2011, 22h25
  2. [XL-2003] Problème copie dans un onglet
    Par zarktoune dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/03/2011, 11h24
  3. Copie de cellules d'un onglet dans un autre
    Par sebicool dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/01/2009, 11h23
  4. Sauvegarde de résultats dans une boucle FOR-END
    Par laroche1 dans le forum MATLAB
    Réponses: 4
    Dernier message: 19/12/2007, 16h51
  5. Réponses: 2
    Dernier message: 23/08/2007, 20h45

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