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 :

Généraliser un code [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 179
    Par défaut Généraliser un code
    Bonjour le forum,

    j'ai besoin de votre aide pour modifier le code ci-dessous qui me permettra d'exécuter une macro pour les quelques 200 lignes concernées sans avoir à écrire autant de fois la condition "If ....End if".

    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
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
     
    If [A1] <> "" Then
                ActiveSheet.Unprotect
        Range("A1").Select
        Selection.Copy
        Range("D1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    End If
     
    If [A2] <> "" Then
                ActiveSheet.Unprotect
        Range("A2").Select
        Selection.Copy
        Range("D2").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    End If
     
    If [A3] <> "" Then
                ActiveSheet.Unprotect
        Range("A3").Select
        Selection.Copy
        Range("D3").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     End If
     
       If [A4] <> "" Then
                ActiveSheet.Unprotect
        Range("A4").Select
        Selection.Copy
        Range("D4").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     End If
     
     
     
     
     
     
        If [A240] <> "" Then
                ActiveSheet.Unprotect
        Range("A240").Select
        Selection.Copy
        Range("D240").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     End If
     
     
     
                ActiveSheet.Protect
    End Sub
    Je vous remercie pour vos réponses et vous souhaite une bonne fin de journée.
    Cordialement.

  2. #2
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut généraliser un code
    Bonjour,

    peut-être ceci logé dans la feuille concernée ou dans un module standard:
    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
     
    Sub copie()
     
    With Sheets("feuil2") ' mettre le nom de feuille concerné
    derlig = Range("a65000").End(xlup).Row
     
    ActiveSheet.Unprotect
     
    For i = 1 to derlig 
    If Range("a" & i) <> "" Then
        Range("A" & i).Copy
        Range("D" & i).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End If
    Next i
    ActiveSheet.Protect
    End With
     
    End Sub
    Je ne vois pas l’intérêt de ce code qui revient à copier en D le contenu de la colonne A. Ce qui peut-être fait directement sans boucle.
    S'il faut dans la copie ne pas reproduire les cellules vide c'est autre chose.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 179
    Par défaut
    Bonjour nibledispo et merci pour votre réponse.

    votre code fonctionne seulement jusqu'à la ligne 4 sans que je comprenne la raison de cet arrêt alors que la liste d'essai continue jusqu'à la ligne 16 !

    AB SCIENCE			AB SCIENCE
    ABC ARBITRAGE			ABC ARBITRAGE
    			
    AEROPORTS DE P			AEROPORTS DE P
    			
    AIR FRANCE -KL			
    AIR LIQUIDE			
    AKKA TECHNOLOG			
    ALCATEL-LUCENT			
    			
    			
    			
    ALTAREA			
    ALTEN			
    ALTRAN TECHN.			
    ANF IMMOBILIER			
    Pouvez-vous m'indiquer la raison de cet arrêt intempestif ?
    Merci.

  4. #4
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut généraliser un code
    regarde à nouveau mon code édité.

    je dois m'absenter.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Bonsoir Nonno,

    je viens de tomber sur ton problème et j'ai également essayé la solution de nibledispo.

    Cette dernière fonctionne chez moi, (office 2007).

    Peux tu nous mettre le code que tu as recopier de Nibledispo, juste pour voir !

    Cdlt,
    PLV.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 179
    Par défaut
    Re,

    je viens de constater que le code s'arrête parce que la liste comporte des cellules vides.
    Est-ce un obstacle insurmontable ?
    La macro à exécuter est une macro "exemple"; celle que je souhaite utiliser devra ouvrir des pages internet et les copier dans un fichier puis comparer les données recueillies avec d'autres précédemment enregistrées.

    Dans l'attente.
    Nonno 94.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Re,

    qu'entends tu par liste avec des cellules vides ?

    Lorsque tu renseignes la colonne A logiquement ça remplit D
    Si une cellule de A est vide ça n'interrompt pas la macro... car dans le code les cellules vides ne sont pas prises en comptes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("a" & i) <> "" Then
    et donc la macro se poursuit jusqu'à la fin du dernier mot trouvé dans la colonne A.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 179
    Par défaut
    je vous joins le fichier qui, je l'espère, sera plus explicite que moi.
    La macro exécutée est la macro copie.

    Remerciements pour votre patience.

  9. #9
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut généraliser un code
    re,

    je t'ai demandé de tenir compte de ma réponse éditée qui marche parfaitement.

    le voila de nouveau ainsi que son code simplifié (copie_2)

    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
     
    Sub copie()
     
    With Sheets("feuil1") ' mettre le nom de feuille concerné
       ActiveSheet.Unprotect
       derlig = Range("a65000").End(xlUp).Row
       For i = 1 To derlig
          If .Range("a" & i) <> "" Then
             .Range("A" & i).Copy
             .Range("D" & i).PasteSpecial Paste:=xlPasteValues    'Range("D" & i)
             Application.CutCopyMode = False
          End If
       Next i
    ActiveSheet.Protect
    End With
     
    End Sub
     
     
     
     
    Sub copie_2()
     
    With Sheets("feuil1") ' mettre le nom de feuille concerné
       derlig = .Range("a65000").End(xlUp).Row
       ActiveSheet.Unprotect
       .Range("d1:d" & derlig) = .Range("a1:a" & derlig)
       ActiveSheet.Protect
    End With
     
    End Sub
    a+

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Salut Paul !



    De toute manière cette discussion est encore un doublon ‼

    Voir [XL-2007] Macro répétitive exécutée sous condition

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Par défaut
    Re,

    Oups... nibledispo t'a donné la solution mais tu ne l'as pas suivi alors que son code fonctionne très bien.

    Tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Range("a2").End(xlDown).Row
    et nibledispo lui a mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Range("a65000").End(xlUp).Row
    Voici toute la différence...

    En gros j'explique les experts me corrigeront :

    Ta variable i par ton code est au minimum (dans ton exemple elle n'est que de 4 lignes) les infos que tu lui donnes sont "je pars du haut et dès que je rencontre une cellule vide je m'arrête et je garde en mémoire la dernière cellule non vide" vu que la ligne 5 est vide le nombre de ta variable s'arrête à 4.

    Alors qu'avec le code de nibledispo, il part du bas, "dès qu'il trouve la première cellule qui n'est pas vide il s'arrête et prend le numéro de la première cellule non vide rencontrée en mémoire" dans ton exemple c'est la 16.

    Voilà à toi de jouer en copiant correctement la code de nibledispo...

    Bonne soirée...

    PLV

  12. #12
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut géné
    Bonsoir Marc,

    J'ai vu l'autre poste et lui en ai fait la remarque à 19h40.

    Quoi que sa demande soit légèrement différente puisqu'il veut dans l'autre post ne copier qu'en D1.

    Qu'il s'arrange avec son interlocuteur !

    Cordialement,

  13. #13
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,
    je viens de répondre la même chose sur l'autre sujet identique, et j'ai même proposé une autre solution, je ne comprends pas ce que Nonno 94 désire et Marc a raison
    De toute manière cette discussion est encore un doublon ‼
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 179
    Par défaut
    J'espère que vous voudrez bien pardonner mes maladresses.
    Merci et bonne soirée à tous.

    Très cordialement.

  15. #15
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut généraliser un code
    Ce n'est pas grave mais supprime le post en doublon qui n'a plus d'intérêt pour toi.

    CORDIALEMENT

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

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. généralisation d'un code pour plusieurs lignes XL
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 20/07/2007, 17h58
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 09h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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