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 :

Demande l'aide d'experts pour amélioration de mes macro.


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Demande l'aide d'experts pour amélioration de mes macro.
    Bonjours,

    Contexte :

    1 document Excel pour chaque utilisateur. Dans ces documents, on trouve leurs congés, rendez-vous et d'autres données diverses.

    De la, j'ai un document Excel(que je dirais le principal), qui récupère les données des fichiers de chaque utilisateur. Le tout formant ainsi un récapitulatif pour le chef de service. Pour cela j'ai utilisé les macros.

    J'ai eu un code de base, généré par l'enregistrement de macro d'excel, que j'ai quelque peu bidouillé par rapport à mon besoin. Pour l'instant tout marche bien.

    Je cherche maintenant à améliorer ce que j'ai fait.

    Voici une partie du code (la totalité n'étant pas utile du fait d'une grande similitude du début...)

    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
     
     
    Sub Complete()
     
    ' Macro de sauvegarde de tous les fichiers des contrôleurs. Pour les congés
    ' Chaque nom de fichier ouvert correspond au tri gramme d'un contrôleur
     
    ' Ouverture du fichier ou récupérer les informations
    ' Partie de récupération pour le contrôleur "CASSAGNE"
     
        ChDir "C:\Documents and Settings\vsuppa\Bureau\congé\CAS"
        Workbooks.Open Filename:= _
            "C:\Documents and Settings\vsuppa\Bureau\congé\CAS\CAS.xls"
     
    ' Sélection de la feuille ou récupérer les informations
     
        Sheets("Janvier à Août 2008").Activate
     
    ' Sélection des lignes à sauvegarder
     
        Range("B7:DS8").Select
     
    ' Utilisation de la fonction copié
     
        Selection.Copy
     
    ' retour sur le document principal
     
        Windows("Congés ICNA 2008 à 2009.xls").Activate
     
    ' Sélection de la feuille ou récupérer les informations
     
        Sheets("Janvier à Août 2008").Activate
     
    ' Sélection des lignes à sauvegarder
     
        Range("B7").Select
     
    ' Copie des données par un collage spécial
     
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
    End Sub
    Ce que je souhaiterais :

    1ere demande :

    En exécutant ce code, il m'ouvre tous les fichiers 1 par 1, logique, mais ne les fermes pas. J'ai testé la fonction "ActiveWorkbook.Close" qui me fait un plantage par rapport à la fonction "Selection.SasteSpecial..." du coup les fichiers ne se ferme que lors de la fermeture manuel du fichier principal. J'aurais souhaité, si possible, fermer les fichiers (sauf le principal) des utilisateurs une fois les données récupéré...

    2eme demande :

    Pensez vous que je pourrais optimiser ce code, de manière à le rendre peut être plus dans la logique programmation? Je ne suis pas spécialiste en programmation, donc vos lumières, proposition d'amélioration sont les bien venue.

    Voila, je vous remercie par avance.


    ps : Je vie en calédonie, donc je ne verrais vos réponse que demain matin pour moi... 9h de décalage. Donc no stress si je répond pas dessuite . Mais vos avis seront finement étudié.

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 57
    Points
    57
    Par défaut
    Bonjour silennnce,

    Premierement, pour optimiser t'as macro je n'ai pas vraiment de conseil a te donner. Mais j'ai pour habitude de dire, pourquoi chercher a faire compliquer lorsque l'on peut faire simple.

    Deuxiemement, il est tres etrange que tu n'arrive pas a fermer tes fenetre. Les selectionne tu avec la fonction .Activate juste apres ton collage special. Si c'est le cas, peut tu nous mettre le VBA qui ne marche pas. Ce sera plus facile pour comprendre le probleme.

    A+

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut silennnce et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Complete()
    ChDir "C:\Documents and Settings\vsuppa\Bureau\congé\CAS"
    Workbooks.Open Filename:= _
        "C:\Documents and Settings\vsuppa\Bureau\congé\CAS\CAS.xls"
    Sheets("Janvier à Août 2008").Range("B7:DS8").Copy _
    Workbooks("Congés ICNA 2008 à 2009").Sheets("Janvier à Août 2008").Range("B7")
    ActiveWorkbook.Close
    End Sub
    Si c'est paur to cpier en PasteSpecial, autant faire une copie directe.
    Je n'utilise pratiquement jamais l'instruction Windows, je préfère travailler sur le classeur. Mais dans les 2 cas, l'extension ".xls" ne fait pas partie du nom.

    Tu parles de plusieurs classeurs, mais vu les données que tu fournis, on ne peut l'appliquer qu'à un classeur : si on copie toujours au même endroit des données différentes, elles vont s'écraser et tu n'auras que les données du dernier classeur copié. Il faudrait plus d'infos.
    Je vie en calédonie, donc je ne verrais vos réponse que demain matin pour moi... 9h de décalage. Donc no stress si je répond pas dessuite . Mais vos avis seront finement étudié.
    c'est gentil (et poli ?) de nous prévenir. Mais l'essentiel c'est de répondre.

    Juste une chose : tu as une section orientée VBA. Il y passe plus de macotistes (c'est français ça ) qu'ici. Donc, quand ton problème est orienté VBA, pense à le mettre dans la section VBA Excel, la réponse n'en sera que plus rapide.
    A+
    Edit : je viens de relire la macro : tu utilises deux choses qui font doublons.
    ChDir est complêtement inutile ici, ou en le gardant (si tout tes fichiers existent dans le même répertoire), essaies:
    Workbooks.Open Filename:= "CAS.xls"
    J'ai oublié de préciser que j'ai corrigé la macro sans la testée

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci de vos réponses.

    Donc pour éclaircir un peu.

    Mais j'ai pour habitude de dire, pourquoi chercher a faire compliquer lorsque l'on peut faire simple.
    Eheh je suis d'accord avec toi, mais le désire de vouloir m'appliquer a pris le dessus

    Deuxièmement, il est très étrange que tu n'arrive pas a fermer tes fenêtres. Les sélectionnes tu avec la fonction .Activate juste après ton collage spécial. Si c'est le cas, peut tu nous mettre le VBA qui ne marche pas. Ce sera plus facile pour comprendre le problème.
    J'ai trouvé ou été mon erreur. Je montrerais le code plus bas, mais maintenant il ferme bien la fenêtre que je souhaite. C'était un manque d'information, et une mauvaise position...

    Si c'est pour tout copier en PasteSpecial, autant faire une copie directe.
    Ce fut ma première orientation, un simple copié. Mais j'ai remarqué qu'en faisant cela, il ne me copié pas la totalité du contenu. A savoir que j'ai des couleurs, des mises en formes, du texte... De ce fait, après tentative et recherche j'ai utilisé la fonction PasteSpecial qui elle me copiait la totalité du contenu. Peut être était ce de la mauvaise manipulation de ma part. Quoi qu'il en soit ça marche

    Je n'utilise pratiquement jamais l'instruction Windows, je préfère travailler sur le classeur. Mais dans les 2 cas, l'extension ".xls" ne fait pas partie du nom.
    Tu pourrais m'éclaircir un peu plus la dessus? J'ai pas trop compris...
    La différence entre workbook et windows...

    Tu parles de plusieurs classeurs, mais vu les données que tu fournis, on ne peut l'appliquer qu'à un classeur : si on copie toujours au même endroit des données différentes, elles vont s'écraser et tu n'auras que les données du dernier classeur copié. Il faudrait plus d'infos.
    J'ai pas mis la totalité du code pour pas surcharger le poste, mais je vais t'en montrer un peu plus. Ça aidera à comprendre... Mais vu que je ne copie pas au même endroit, je n'ai pas de souci la dessus.

    je viens de relire la macro : tu utilises deux choses qui font doublons.
    ChDir est complètement inutile ici, ou en le gardant (si tout tes fichiers existent dans le même répertoire), essaies:
    Workbooks.Open Filename:= "CAS.xls"
    Merci pour ce conseil. J'ai apporté quelques modifications. Par contre les fichiers sont dans d'autre répertoire dans le répertoire racine.
    détail :

    ..\congé\fichier_principal.xls [dans mon cas c'est "Congés ICNA 2008 à 2009.xls"]
    ..\congé\CAS\CAS.xls
    ..\Congé\CLT\CLT.xls
    et ainsi de suite pour tous les utilisateurs. Pourquoi autant de répertoire? On m'a demandé d'appliquer une sécurité user. C'est à dire de n'autoriser que le propriétaire à ouvrir son fichier. Je travail sur un domaine (serveur 2000) donc j'en ai conclu qu'il me serait plus simple d'avoir un dossier ou je pourrait restreindre les droits par utilisateur. Car je crois que les autorisations sur un fichier même ne fonctionne pas... ou un truc dans le genre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'Ca ok, je l'ai reproduit, testé, ca marche.
        Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
     
    ' La par contre ça ne marche pas. Code erreur 9, debogage, il m'amène sur cette ligne mais m'en dit pas plus... Donc retour à la méthode moins simplifié ;)
        Workbooks("Congés ICNA 2008 à 2009").Sheets("Janvier à Août   2008").Range("B7")
    Dernier souci qui n'en est pas un bien gros mais bon...
    Au moment de la fermeture du fichier autre que le principal (donc CAS.xls ou CAT.xls...) il me demande si je veux enregistrer le presse papier(qui comporte une grosse quantité de données). Donc j'ai le choix Oui, Non, annuler. Peut importe la réponse. Ce qui me gène c'est qu'il y ai besoin d'une intervention de l'utilisateur. J'aimerais trouver une fonction qui validera automatiquement la réponse Oui ou Non. Est ce possible ou existant?

    Mon code, en plus complet pour une vision plus globale

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    Sub Complete()
     
    ' Macro de sauvegarde de tous les fichiers des controleurs. Pour les congés
    ' Chaque nom de fichier ouvert correspond au trigramme d'un controleur
     
    ' Ouverture du fichier ou recuperer les informations
    ' Partie de récuperation pour le controleur "CASSAGNE"
     
        Workbooks.Open Filename:= _
            "C:\Documents and Settings\vsuppa\Bureau\congé\CAS\CAS.xls"
     
    ' Selection de la feuille ou recuperer les informations
    ' Selection des lignes à sauvegarder
    ' Utilisation de la fonction copié
     
        Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
     
    ' retour sur le document principal
     
        Windows("Congés ICNA 2008 à 2009.xls").Activate
     
    ' Selection de la feuille ou recuperer les informations
     
        Sheets("Janvier à Août 2008").Activate
     
    ' Selection des lignes à sauvegarder
     
        Range("B7").Select
     
    ' Copie des données par un collage spécial
     
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
    ' meme demarche pour les autres feuillés
     
        Windows("CAS.xls").Activate
        Sheets("Sept à déc 2008").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Sept à déc 2008").Activate
        Range("B7").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CAS.xls").Activate
        Sheets("Janvier à Août 2009").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Janvier à Août 2009").Activate
        Range("B7").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CAS.xls").Activate
        Sheets("Sept à déc 2009").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Sept à déc 2009").Activate
        Range("B7").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
    ' Fermeture de la feuille CAS.xls
     
        Windows("CAS.xls").Activate
        ActiveWorkbook.Close
     
    ' Partie de récuperation pour le controleur "CORDIER"
     
        Workbooks.Open Filename:= _
            "C:\Documents and Settings\vsuppa\Bureau\congé\CDR\CDR.xls"
        Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Janvier à Août 2008").Activate
        Range("B15").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CDR.xls").Activate
        Sheets("Sept à déc 2008").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Sept à déc 2008").Activate
        Range("B15").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CDR.xls").Activate
        Sheets("Janvier à Août 2009").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Janvier à Août 2009").Activate
        Range("B15").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CDR.xls").Activate
        Sheets("Sept à déc 2009").Range("B7:DS8").Copy
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Sept à déc 2009").Activate
        Range("B15").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
     
        Windows("CDR.xls").Activate
        ActiveWorkbook.Close
     
    End Sub
    Actuellement tout marche bien, ce que je demande c'est peut être du pur chipotage, mais si c'est possible, c'est pour un bien personnel. Et un coté pratique pour l'utilisateur.

    Bon week end a vous. Je reviens lundi(dimanche pour vous ). Je répondrais donc après le week end. Mais toujours pareil, j'examinerais attentivement vos avis.

    Merci

  5. #5
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut,pour le pb du contenu du presse papier utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    Salut,pour le pb du contenu du presse papier utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    Hum, oki je vais regarder comment ca fonctionne. Merci de l'info.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut silennnce et le forum
    Tu pourrais m'éclaircir un peu plus la dessus? J'ai pas trop compris...
    La différence entre workbook et windows...
    La fenêtre contient le classeur. Ne travaillant pas (où peu) avec des select, je n'utilise, en macro que WorkBooks. Mais tu peux ouvrir 2 fenêtre l'une contenant lA feuille 1 du classeur 1 et la seconde la feuille 3 du classeur 12. en changeant de fenêtre, tu peux travailler sur tes 2 feuilles en utilisant activesheet, activeCell alors qu'elles font référence à des données différentes.
    Ce qui me gêne dans Windows(), c'est que les index evoluent à chaque sélection de fenétre. Et une erreur est déjà tellement facile avec ActiveCell...
    ça pourrait devenir interessant sur les nome de feuille très long, mais... bof.
    C'est toujours pareil, chacun utilise telle ou telle instruction, en fonction de ses préférences, qu'elles soient justifiées par une raison réelle ou non.


    Dans ta macro, certaines choses me semblent nébuleuses
    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
    ...........
        Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
    ...........
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Janvier à Août 2008").Activate
        Range("B7").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
    ...........
        Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
    ...........
        Windows("Congés ICNA 2008 à 2009.xls").Activate
        Sheets("Janvier à Août 2008").Activate
        Range("B15").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
    Tu copies la plage de B7 à D58, pour chacun de tes personnels.
    Quand tu colles, la première fois, tu vas remplacer la plage B758 par tes données CAS. ça, je le trouve normal.
    Quand tu travailles avec le Classseur CDR, tu copies la même plage => Ok. Mais quand tu la colles ? la plage B1558 de ta feuille contenant les données de CAS va être écrasée par les données de CDR (SkipBlanks:=False) ??? j'aurais compris, si tu mettais "SkipBlanks:=true" ou que tu ne copies que de B7 à B14, mais là, je suis largué.

    Ce que je comprends de ta macro :
    Tu fais 4 opérations de copier/coller d'un classeur différent sur une même feuille en partant de B7 et en sautant 7 lignes par personnel (jusqu'a 58, je présume ?). Si c'est bien ça, on peut travailler en boucle
    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
    Sub Complete()
    Dim Chem As String
    Dim X As Integer
    Dim F As Workbook
    '-------------------
    Chem = "C:\Documents and Settings\vsuppa\Bureau\congé\"
    For X = 0 To 5
        'choix du classeur de travail ---------------------
        Select Case X
            Case 0
                Workbooks.Open Filename:=Chem & "CAS\CAS.xls"
            Case 1
                Workbooks.Open Filename:=Chem & "CDR\CDR.xls"
            Case 2
                'Workbooks.Open Filename:=fichier suivant
            Case 3
                'Workbooks.Open Filename:=fichier suivant
            Case 4
                'Workbooks.Open Filename:=fichier suivant
            Case 5
                'Workbooks.Open Filename:=fichier suivant
        End Select
     
        Set F = ActiveWorkbook
        With Workbooks("Congés ICNA 2008 à 2009")
            '2008 -------------------------
            F.Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2008").Range("B" & 7 + (X * 8)).PasteSpecial _
                               Paste:=xlPasteAll, SkipBlanks:=True
     
            F.Sheets("Sept à déc 2008").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2008").Range("B" & 7 + (X * 8)).PasteSpecial _
                               Paste:=xlPasteAll, SkipBlanks:=True
            '2009 -------------------------
            F.Sheets("Janvier à Août 2009").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2009").Range("B" & 7 + (X * 8)).PasteSpecial _
                               Paste:=xlPasteAll, SkipBlanks:=True
     
            F.Sheets("Sept à déc 2009").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2009").Range("B" & 7 + (X * 8)).PasteSpecial _
                               Paste:=xlPasteAll, SkipBlanks:=True
            'on ferne --------------------
            Application.CutCopyMode False
            F.Close
        End With
    Next X
    End Sub
    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci pour l'explication de windows et workbook. C'est un peu plus clair. Me reste à me pencher la dessus.

    Citation Envoyé par Gorfael Voir le message

    Tu copies la plage de B7 à D58, pour chacun de tes personnels.
    Quand tu colles, la première fois, tu vas remplacer la plage B758 par tes données CAS. ça, je le trouve normal.
    Quand tu travailles avec le Classseur CDR, tu copies la même plage => Ok. Mais quand tu la colles ? la plage B1558 de ta feuille contenant les données de CAS va être écrasée par les données de CDR (SkipBlanks:=False) ??? j'aurais compris, si tu mettais "SkipBlanks:=true" ou que tu ne copies que de B7 à B14, mais là, je suis largué.
    Hum est ce que ça t'éclaircirait si je disais que c'est pas D58 mais plutôt DS8.

    Le rôle de ma macro :
    Je récupère dans les documents des employés (CAS, CRD...) toujours les même lignes-colonnes. Soit de B7 à DS8. Ça fait 2lignes par employés qui vont jusqu'à la colonne DS

    Ensuite, sur mon document principal, je ne recopie pas les données de CAS sur CRD. Pour le cas de CAS, je colle les données à partir de case B7, tandis que pour le cas de CRD, je colle les infos que à partir de la ligne B15.
    Sachant que entre le B7 et le B15 j'ai des données d'autre employé mais toujours pareil, j'ai défini la première case de collage des données. B9 - B11 - B13 ...

    Citation Envoyé par Gorfael Voir le message

    Ce que je comprends de ta macro :
    Tu fais 4 opérations de copier/coller d'un classeur différent sur une même feuille en partant de B7 et en sautant 7 lignes par personnel (jusqu'a 58, je présume ?). Si c'est bien ça, on peut travailler en boucle
    Hum oui et non, vu que tu es parti sur l'idée que c'était 58 et non S8 ça doit t'enduire en erreur

    Donc oui je fais 4 opérations de copier/coller pour chaque employé.
    Sauter 7 lignes non.
    Sur mon document employé(tout comme le principal) j'ai 2lignes par utilisateurs qui vont jusqu'à la colonne DS
    B7 et B8 pour L'utilisateur 'lambda'
    B9 et B10 pour l'utilisateur 'Alpha'
    B11 et B12 pour l'utilisateur 'delta'
    Et ainsi de suite jusqu'à B31 et B32 soit 13 employés.

    Hum je vais me pencher sur la solution de boucle que tu m'as montré. Mais en corrigeant la confusion voir ce que ça donne...

    Merci

    ps 1 : Sur la fonction SkipBlanks, je n'ai pas trouvé beaucoup d'aide la dessus, peut être que mon erreur vient du fait de ne pas tout comprendre sur son fonctionnement...

    PS 2 : Application.CutCopyMode = False j'ai pas trop compris... J'ai testé, ca n'a pas marché, maintenant je passe à l'étape comprendre pour mieux utiliser...

  9. #9
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    bonjour,


    essai aussi d'enlever de ton code tous ces Select, activeWorkbook,ActiveSheet,selection ... des sources d'erreurs... tu n'as pas besoin d'activer ou sélectionner quoi que ce soit dans un classeur excel pour y travailler dessus..!

    par exemple les :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Workbooks.Open Filename:=Chem & "CAS\CAS.xls"
     set wk = activeworkbook
    peuvent s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     dim wk as workbook
    set wk = Workbooks.Open (Chem & "CAS\CAS.xls")
    et ensuite tu accéde à ton classeur par la variable wk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     wk.sheets("feuil1").range("A1") = "J'ecris dans la cellule A1")
     wk.close True'Fermeture et sauvegarde du classeur
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut silennnce et le forum
    Je comprends mieus Ah, vieillesse quand tu nous tiends...
    D5 ou DS, effectivement, ça fait une petite différence.
    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
    Sub Complete()
    Dim Chem As String
    Dim X As Integer
    Dim F As Workbook
    '-------------------
    Chem = "C:\Documents and Settings\vsuppa\Bureau\congé\"
    For X = 0 To 12
        'choix du classeur de travail ---------------------
        Select Case X
            Case 0
                Workbooks.Open Filename:=Chem & "CAS\CAS.xls"
            Case 1
                Workbooks.Open Filename:=Chem & "CDR\CDR.xls"
            Case 2
                'Workbooks.Open Filename:=fichier suivant
            Case 3
                'Workbooks.Open Filename:=fichier suivant
            Case 4
                'Workbooks.Open Filename:=fichier suivant
            Case 5
                'Workbooks.Open Filename:=fichier suivant
            '........................... etc
            Case 13
                'Workbooks.Open Filename:=dernier fichier
        End Select
     
        Set F = ActiveWorkbook
        With Workbooks("Congés ICNA 2008 à 2009")
            '2008 -------------------------
            F.Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2008").Range("B" & 7 + (X *2)).PasteSpecial Paste:=xlPasteAll
     
            F.Sheets("Sept à déc 2008").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2008").Range("B" & 7 + (X *2)).PasteSpecial Paste:=xlPasteAll
            '2009 -------------------------
            F.Sheets("Janvier à Août 2009").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2009").Range("B" & 7 + (X *2)).PasteSpecial Paste:=xlPasteAll
     
            F.Sheets("Sept à déc 2009").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2009").Range("B" & 7 + (X *2)).PasteSpecial Paste:=xlPasteAll
            'on ferne --------------------
            F.Close
        End With
    Next X
    End Sub
    Devrait être plus mieux bien
    Sur la fonction SkipBlanks, je n'ai pas trouvé beaucoup d'aide la dessus, peut être que mon erreur vient du fait de ne pas tout comprendre sur son fonctionnement...
    par défaut elle es à faux, mais quand elle est à True, elle permet de ne coller que les cellules non-vides
    Sur une feuille(F1), tu mets en jaune A1: D10 que tu remplis avec des 1
    sur une 2ème feuille (F2) tu remplis en rouge A1: D10 puis tu mets 2, uniquement sur quelques cellules : A1, B2, C3 et D4, par exemple, les autres cellules restent vides (mais en rouge) tu appliques la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    Sheets("F2").Range("A1:D10").Copy
    Sheets("F1").Range("A1:D10").PasteSpecial Paste:=xlPasteAll, skipblanks:=True
    End Sub
    et tu regardes ce qui se passe sur F1. tu peux faire le même test avec skipblanks:=false
    Application.CutCopyMode = False j'ai pas trop compris...
    Tu repasses sur F2 : A1: D10 est sélectionné et encadré par des tirets. Tu appliques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test1()
    Application.CutCopyMode = False
    End Sub
    et tu regardes ce qui s'est passé
    A+

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Juste une indication qui pourrait te servir : Tu peux identifier les Users avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom = Application.Environ("USERNAME")
    et au lieu d'utiliser X dans le select case de Gorfael, utiliser Nom. Non ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ok,

    Ça m'aura pris un peu de temps, mais au moins j'ai compris la totalité du code.
    Merci gorfael. J'ai changé quelques nom pour une meilleur compréhension pour mes prédécesseurs...
    Donc voila ce que j'ai :
    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
     
    Sub CompleteTest()
     
    ' Déclaration des variables
     
    Dim Dossier As String
    Dim Selection As Integer
    Dim Fenetre As Workbook
     
    '-------------------
     
    Dossier = "C:\Documents and Settings\vsuppa\Bureau\congé\"
    For Selection = 0 To 12
        'choix du classeur de travail ---------------------
        Select Case Selection
            Case 0
                Workbooks.Open Filename:=Dossier & "CAS\CAS.xls"
            Case 1
                Workbooks.Open Filename:=Dossier & "CDR\CDR.xls"
            Case 2
                Workbooks.Open Filename:=Dossier & "CLT\CLT.xls"
            Case 3
                Workbooks.Open Filename:=Dossier & "CNG\CNG.xls"
            Case 4
                Workbooks.Open Filename:=Dossier & "HDA\HDA.xls"
            Case 5
                Workbooks.Open Filename:=Dossier & "CTT\CTT.xls"
            Case 6
                Workbooks.Open Filename:=Dossier & "JNT\JNT.xls"
            Case 7
                Workbooks.Open Filename:=Dossier & "LAT\LAT.xls"
            Case 8
                Workbooks.Open Filename:=Dossier & "PAP\PAP.xls"
            Case 9
                Workbooks.Open Filename:=Dossier & "PYE\PYE.xls"
            Case 10
                Workbooks.Open Filename:=Dossier & "SVE\SVE.xls"
            Case 11
                Workbooks.Open Filename:=Dossier & "TMR\TMR.xls"
            Case 12
                Workbooks.Open Filename:=Dossier & "WEI\WEI.xls"
        End Select
     
    Set Fenetre = ActiveWorkbook
        With Workbooks("Congés ICNA 2008 à 2009.xls")
            '2008 -------------------------
            Fenetre.Sheets("Janvier à Août 2008").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2008").Range("B" & 7 + (Selection * 2)).PasteSpecial Paste:=xlPasteAll
     
            Fenetre.Sheets("Sept à déc 2008").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2008").Range("B" & 7 + (Selection * 2)).PasteSpecial Paste:=xlPasteAll
            '2009 -------------------------
            Fenetre.Sheets("Janvier à Août 2009").Range("B7:DS8").Copy
            .Sheets("Janvier à Août 2009").Range("B" & 7 + (Selection * 2)).PasteSpecial Paste:=xlPasteAll
     
            Fenetre.Sheets("Sept à déc 2009").Range("B7:DS8").Copy
            .Sheets("Sept à déc 2009").Range("B" & 7 + (Selection * 2)).PasteSpecial Paste:=xlPasteAll
            'on ferne --------------------
            Fenetre.Close
        End With
     
     
     
    Next Selection
    End Sub
    Vu que ca marche et que c'est beaucoup moins barbare par rapport au début, je passe maintenant sur l'étude de la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.CutCopyMode = False
    Mon but étant d'éviter de devoir appuyer sur 'oui' 'non' ou 'annuler' dû à une grande quantité de données dans le presse-papier.

    Juste une indication qui pourrait te servir : Tu peux identifier les Users avec
    Code :

    Nom = Application.Environ("USERNAME")

    et au lieu d'utiliser X dans le select case de Gorfael, utiliser Nom. Non ?
    Hum je me suis pas encore penché la dessus, mais je vais y passer. Le temps de faire étape par étape. Mais merci du conseil.

    PS : Gorfael j'ai pas encore testé les exemples pour la fonction SkipBlanks mais demain je m'en charge.

    Bonne journée a vous, la mienne se termine.

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

Discussions similaires

  1. [XL-2010] Amélioration de mes macros
    Par chouchouboy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/10/2010, 11h34
  2. Demande pour améliorer XMLGram Explorer
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 29/03/2005, 10h26
  3. Demande d'aide pour query difficile
    Par ericjean514 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/02/2005, 19h52
  4. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 03h40
  5. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 19h10

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