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 :

Une macro sur tous les onglets


Sujet :

Macros et VBA Excel

  1. #21
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 934
    Points : 28 930
    Points
    28 930
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Parce-que dans le bloc With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With ThisWorkbook.Sheets("IP%1014")
    Dans le code du bas, le code copie bien la cellule M3 de la feuille ThisWorkbook.Sheets("IP%1014")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("M3").Copy Range("M4:M662")
    Mais ensuite il le colle dans la plage M4:M662 de la feuille active.
    Donc si tu lances ta procédure en étant dans cette feuille que tu copies pas de problème mais si tu le lances d'une autre feuille c'est là qu'il va coller la copie.
    Il te manque un point (indiqué en rouge) devant le Range afin de le relier à la bonne feuille et au bon classeur et cela dans toute ta procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("M3").Copy .Range("M4:M662")
    [EDIT] Au temps pour moi.
    Je viens de voir que je t'ai donné la mauvaise syntaxe (voilà ce que c'est de ne pas faire assez de tests.
    Je n'ai plus accès à cette réponse, voici
    l'exemple corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ThisWorkbook.Sheets("Feuil1")
    .Range("A2").Copy .Range("A3:A100")
    .Range("D2").Copy .Range("D3:D100")
    End With
    Bonjour,
    En relisant une des lignes de ton code, je réalise l'aberration.
    Si tu écris une formule en A3 et ensuite tu copies cette même cellule vers la plage A4:A50, il suffit d'écrire cette formule directement sur l'ensemble de la plage en une seule fois.
    Mauvaise façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With ThisWorkbook.Sheets("Feuil1")
     .Range("A3").FormulaR1C1 = "=VLOOKUP(RC4,Feuil2!R13C7:R5312C31,4,0)"
     .Range("A3").Copy .Range("A4:A50")
     End With
    La bonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With ThisWorkbook.Sheets("Feuil1")
     .Range("A3:A50").FormulaR1C1 = "=VLOOKUP(RC4,Feuil2!R13C7:R5312C31,4,0)"
     End With

  2. #22
    Candidat au Club
    Homme Profil pro
    Support qualité logistique
    Inscrit en
    Novembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Support qualité logistique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci ! Mon code est propre et marche !

    Seulement j'ai encore deux problèmes :

    - Faire que la macro se lance sur tous les onglets, sauf CSMS (voir macro mais ça ne marche pas, il bloque sur le "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
        With ThisWorkbook.Worksheets("Feuil1").Cells
            .Orientation = 0
            .AddIndent = False
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
     
        For Each ws In ThisWorkbook.Worksheets
        With ws.Range("G13:G5312")
                .NumberFormat = "0"
                .Value = .Value
        End With
        Next
     
        ThisWorkbook.Sheets("Feuil1").Name = "CSMS"
     
        If sheet_.Name <> "CSMS" Then
        With ThisWorkbook.Sheets("IP%1014")
        .Range("M3:M999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,4,0)"
     
        .Range("N3:N999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,5,0)"
     
        .Range("O3:O999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,6,0)"
     
        .Range("P3:P999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,7,0)"
        .Range("P3:P999").NumberFormat = "m/d/yyyy"
     
        .Range("V3:V999").FormulaR1C1 = "=IF(AND(VLOOKUP(RC4,CSMS!R13C7:R5312C31,11,0)=""N/A"",AND(VLOOKUP(RC4,CSMS!R13C7:R5312C31,20,0)=""yes"")),""Destroyed on site"",VLOOKUP(RC4,CSMS!R13C7:R5312C31,11,0))"
     
        .Range("Y3:Y999").FormulaR1C1 = "=IF(VLOOKUP(RC4,CSMS!R13C7:R5312C31,12,0)=""N/A"",VLOOKUP(RC4,CSMS!R13C7:R5312C31,22,0),VLOOKUP(RC4,CSMS!R13C7:R5312C31,12,0))"
     
        .Range("M3:Y999").Copy
        .Range("M3:Y999").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        End With
        End If
     
    End Sub
    - La seconde chose me parait encore plus complexe, l'idée serait que si l'utilisateur lance la macro, mais que sur un des onglet il y a déjà une valeur (saisie préalablement à la main), la macro demande : "Voulez-vous remplacer la valeur ou pas ?" ; puis continue de se dérouler.. Est-ce possible ?

  3. #23
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Peux--tu me dire où tu as trouvé cette syntaxe

  4. #24
    Candidat au Club
    Homme Profil pro
    Support qualité logistique
    Inscrit en
    Novembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Support qualité logistique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Ici :

    Citation Envoyé par CodeFacile Voir le message
    [code]
    For Each sheet_ In activeworkbook.Worksheets
    If sheet_.Name <> "CSMS" Then
    Et vous aviez dit qu'on pouvait s'en passer, sur la ligne suivante, mais vous n'avez pas remis cette ligne en question.

    Citation Envoyé par AlainTech Voir le message
    Bonjour,

    Deux aberrations dans cette ligne:
    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(sheet_.Name).Range
    alors que suffit?

    Le Select est à proscrire.

  5. #25
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Dans l'exemple de CodeFacile, il y avait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each sheet_ In ActiveWorkbook.Worksheets
    Dans ton code, tu piques une ligne de cet exemple en la sortant du contexte.

    Ca ne peut, bien sûr, pas marcher.

  6. #26
    Candidat au Club
    Homme Profil pro
    Support qualité logistique
    Inscrit en
    Novembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Support qualité logistique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Bien sûr, je cherche, mais ne trouve pas la bonne synthaxe. Quant à la deuxième chose, je ne sais même pas si c'est possible, je ne trouve pas d'exemple équivalent sur le fofo.

  7. #27
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 934
    Points : 28 930
    Points
    28 930
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une discussion ouverte le 25 novembre et qui est riche de réponses diverses qui devraient t'aider ce qui ne semble pas être le cas.
    Ne serait-il pas intéressant que tu expliques clairement en français en quelques lignes ce que tu cherches à faire.
    Organisation de ton classeur, que veux-tu faire sur les feuilles ou plutôt ce que tu ne voudrais pas faire avec certaines feuilles, etc...

  8. #28
    Candidat au Club
    Homme Profil pro
    Support qualité logistique
    Inscrit en
    Novembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Support qualité logistique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Maksym Voir le message
    Bonjour,

    Merci ! Mon code est propre et marche !

    Seulement j'ai encore deux problèmes :

    - Faire que la macro se lance sur tous les onglets, sauf CSMS (la Feuil1 de départ)

    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
     Sub IPTT()
    '
    ' IPTT Macro
    ' Macro enregistrée le 23/11/2012 par i0155970
    '
     
    '
        With ThisWorkbook.Worksheets("Feuil1").Cells
            .Orientation = 0
            .AddIndent = False
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
     
        For Each ws In ThisWorkbook.Worksheets
        With ws.Range("G13:G5312")
                .NumberFormat = "0"
                .Value = .Value
        End With
        Next
     
        ThisWorkbook.Sheets("Feuil1").Name = "CSMS"
     
        With ThisWorkbook.Sheets("IP%1014")
        .Range("M3:M999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,4,0)"
     
        .Range("N3:N999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,5,0)"
     
        .Range("O3:O999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,6,0)"
     
        .Range("P3:P999").FormulaR1C1 = "=VLOOKUP(RC4,CSMS!R13C7:R5312C31,7,0)"
        .Range("P3:P999").NumberFormat = "m/d/yyyy"
     
        .Range("V3:V999").FormulaR1C1 = "=IF(AND(VLOOKUP(RC4,CSMS!R13C7:R5312C31,11,0)=""N/A"",AND(VLOOKUP(RC4,CSMS!R13C7:R5312C31,20,0)=""yes"")),""Destroyed on site"",VLOOKUP(RC4,CSMS!R13C7:R5312C31,11,0))"
     
        .Range("Y3:Y999").FormulaR1C1 = "=IF(VLOOKUP(RC4,CSMS!R13C7:R5312C31,12,0)=""N/A"",VLOOKUP(RC4,CSMS!R13C7:R5312C31,22,0),VLOOKUP(RC4,CSMS!R13C7:R5312C31,12,0))"
     
        .Range("M3:Y999").Copy
        .Range("M3:Y999").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        End With
     
    End Sub
    - La seconde chose me parait encore plus complexe, l'idée serait que l'utilisateur lance la macro, mais que si sur un des onglet il y a déjà une valeur (saisie préalablement à la main), la macro demande : "Voulez-vous remplacer la valeur ou pas ?" ; puis continue de se dérouler.. Est-ce possible ?

    Donc : Je lance ma macro (si dessus, et qui marche), en partant de la Feuil1, qui deviend CSMS et qui renseigne à partir des données de CSMS tous les autres onglets (dont les noms ne seront jamais les mêmes).

    Mais si au préalable certains onglets contiennent des données, il faudrait que la macro ne saisisse pas par dessus, mais propose à l'utilisateur de garder l'ancienne dans le cas ou elle serait différente.

Discussions similaires

  1. [XL-2007] Optimisation d'une macro + Application à tous les onglets
    Par Identifiant75 dans le forum Excel
    Réponses: 53
    Dernier message: 05/05/2015, 19h23
  2. [LibreOffice] Executer une macro sur TOUS les documents ouvert
    Par Gomoz dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 23/01/2015, 21h00
  3. Exécuter une macro sur tous les onglets d'un fichier sauf un
    Par Marsama dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2011, 17h38
  4. Macro sur tous les onglets
    Par yann3131 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/01/2010, 17h35
  5. [XL-2003] Exécuter une macro sur tous les fichiers d'un dossier.
    Par ahmet dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/10/2009, 09h49

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