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 :

[VBA-E] Copier une feuille et trier la feuille résultante


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut [VBA-E] Copier une feuille et trier la feuille résultante
    Bonjour,

    Le pb auquel je me heurte est le suivant.

    Je suis positionné sur une feuille. Je désire en appuyant sur un bouton placé sur cette feuille lancer sa copie, puis trier un tableau placé dans cette feuille.

    La procédure associé au boton est la suivante. Tout fonctionne jusqu'à la ligne tableau.sort ... ou une erreur est remontée.

    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
    Private Sub CommandButton1_Click()
     
        ' Fonction d'initialisation des variables, en particulier l_f_plan feuille a copier ici
        Initialisation
     
        ' Copie de la feuille l_f_plan sur laquelle je veux travailler
        Worksheets(l_f_Plan.Name).Copy Before:=Worksheets(l_f_Plan.Name)
        ActiveSheet.Name = "Planning_Trie"
     
        ' Creation d'un objet feuille correspondant a la feuille qui vien d'etre copiee
        Dim l_f_Temp As Worksheet
        Set l_f_Temp = ThisWorkbook.Sheets("Planning_Trie")
     
        ' Insertion d'une colonne
        l_f_Temp.Columns("A:A").Insert Shift:=xlToRight
     
        ' Comptage du nombre de lignes de la feuille
        Dim nb_doc As Variant
        nb_doc = l_f_Temp.Range("B65536").End(xlUp).Row
     
        ' Remplissage de la colonne crée avec le numero de ligne
        For num_doc = 1 To nb_doc
          l_f_Temp.Cells(num_doc, 1) = num_doc
        Next
     
        ' Creation du tableau à trier
        Dim tableau As Range
        Set tableau = l_f_Temp.Rows("5:" & nb_doc)
     
        ' Tri de ce tableau
        tableau.Sort Key1:=Range("F5"), Order1:=xlAscending, Key2:=Range("D5") _
            , Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False _
            , Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
            xlSortNormal
     
    End Sub
    Ce que je ne comprends pas c'est qu'en reprenant quasiment le même code placé dans la feuille copiée associé au même bouton que la feuille initiale, j'arrive trier les données désirées:

    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
    Private Sub CommandButton1_Click()
     
        Dim l_f_Temp As Worksheet
        Set l_f_Temp = ThisWorkbook.Sheets("Planning_Trie")
     
        ' Comptage du nombre de lignes de la feuille
        Dim nb_doc As Variant
        nb_doc = l_f_Temp.Range("B65536").End(xlUp).Row
     
        ' Creation du tableau à trier
        Dim tableau As Range
        Set tableau = l_f_Temp.Rows("5:" & nb_doc)
     
        ' Tri de ce tableau
        tableau.Sort Key1:=Range("F5"), Order1:=xlAscending, Key2:=Range("D5") _
            , Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False _
            , Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
            xlSortNormal
    End Sub
    C'est comme si la fonction de tri ne fonctionnait qu'à partir du moment ou elle est lancée dans une procédure ou fonction dont le code est placé dans la feuille ou sont situés les données à trier, et non pas dans une autre feuille.

    Quelqu'un a-t-il déjà rencontré ce problême ???

    Merci d'avance pour vos réponses,
    "Ne soyez rien, devenez sans cesse"

  2. #2
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Heu d'une thanks pour le deplacement de topic

    Ensuite ma colonne est bien insérée avant la colonne A avec ce code, ou alors je suis bigleu vu le nombre de fois ou j'ai testé mon code... Pour moi l_f_Temp.Columns("A:A").Insert Shift:=xlToRight signifie que les colonnes existantes sont décalées vers la droite, et non que la colonne créée est insérée à droite de la colonne spécifiée...

    Ma colonne A devient donc ma colonne B, et c'est la nouvelle colonne A qui est effectivement vide d'ou ensuite ma recherche du nombre de lignes à partir de la colonne B et non de la colonne A.

    Bref là n'est pas le pb, cette partie du code marche comme évoqué dans mon premier post.

    C'est bien la seule ligne tableau.sort... qui plante avec la spécificité que si elle est placée à postériori dans la feuille copiée directement, cela fonctionne. Mais bien sûr, la feuille n'existant pas au départ le code ne peut être placé dedans au départ...

    D'autres idées ???

    merci à tous d'avance,
    "Ne soyez rien, devenez sans cesse"

  3. #3
    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
    Tu as raison, j'ai encore lu trop vite
    Désolé... ça paraissait tellement une bonne raison

  4. #4
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par ouskel'n'or
    Tu as raison, j'ai encore lu trop vite
    Désolé... ça paraissait tellement une bonne raison
    Et oui si j'ai posté cette discussion, c'est que si la solution est sûrement très simple, le pb est bien tordu
    "Ne soyez rien, devenez sans cesse"

  5. #5
    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
    Deux choses à vérifier :
    Ajoute un DoEvents après l'insert de la colonne (ça mange pas de pain)
    Tu peux aussi en ajouter un après copie de la page. Regarde la raison de ce conseil dans l'aide si tu ne connais pas.
    Si c'est toujours pareil, mets un point d'arrêt après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_doc = l_f_Temp.Range("B65536").End(xlUp).Row
    et vérifie la valeur de nb_doc. Il arrive que cette syntaxe ne donne pas toujours ce qu'on attend d'elle (!)
    Pour connaître la dernière ligne, j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        nb_doc = _f_Temp.Range("A1").SpecialCells(xlCellTypeLastCell).Row
    d'autant que dans ton cas, tu ne supprimes pas de ligne entre la copie et le tri.
    Tu peux au moins le tester

    Mais j'incline vers le DoEvents après copie

  6. #6
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    - Pour le nombre de lignes, je vais voir ta syntaxe mais ma ligne de code me donne bien le nombre attendu (déja testé, et la colonne créée est bien remplie correctement comme je le désire).
    Au passage c'est pour garder en mémoire la position de chaque ligne avant le tri du tableau de données que je veux comparer par la suite à un autre tableau lui déjà trié. Le tableau trié sur la feuille copié et mis à jour par comparaison avec un autre tableau sera par la suite "détrié" pour mettre à jour cette fois le tableau placé sur la feuille initialement copié... (pourquoi ne pas trier directement le tableau sur la feuille initiale, ben l'utilisateur veux pas, il veut simplement sa maj...)

    - Sinon je vais essayer le DoEvents qui m'apparaît une bonne idée, vu que j'ai déjà tenté des .activate et .select sur ma feuille copiée et sur mon tableau avant le tri sans succès

    Je vous tiens au courant, et vais me documenter sur le DoEvents donc...
    "Ne soyez rien, devenez sans cesse"

  7. #7
    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
    Pour ma part, j'ai une règle d'or.

    Ne mettre dans le code d'une feuille que les procédures événementielles liées à cette feuille.

    Tout le reste du code (et surtout les manipulations d'une feuille à l'autre), dans un ou des modules.

    Fais-en l'expérience et dis-moi ce que tu en penses.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par AlainTech
    Pour ma part, j'ai une règle d'or.

    Ne mettre dans le code d'une feuille que les procédures événementielles liées à cette feuille.

    Tout le reste du code (et surtout les manipulations d'une feuille à l'autre), dans un ou des modules.

    Fais-en l'expérience et dis-moi ce que tu en penses.
    J'en dis que t'es pas modérateur pour rien

    Et oui je me doutais bien que la solution était toute con. Donc oui ça marche en mettant le code précédent dans une fonction placée dans un MODULE et en ne faisant que l'appel de fonction à l'appui du bouton placé sur la feuille initiale à copier.

    Ca n'explique pas pourquoi le code ne marche pas dans la feuille de départ, mais bon on va pas se poser plus de questions...

    Sur le code dans les feuilles, d'habitude je n'en mets jamais et passe toujours par des formulaires et des modules, mais pour cette appli précisément, n'ayant pas besoin de formulaire, j'avais un peu zappé les modules, ne pensant pas que coder dans les feuilles allait faire planter mon programme...

    Au bilan, c'est bon Alain Tech, je te pique ta règle d'or

    Merci à vous,

    PS : Pour Ouskel, le DoEvents s'est avéré inneficace... Tout comme tableau.activate, tableau.select, application.screenupdating = true ...
    "Ne soyez rien, devenez sans cesse"

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

Discussions similaires

  1. [VBA][Excel]Copier une feuille dans un nouveau classeur
    Par illight dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2020, 12h51
  2. [VBA-E] Copier une feuille excel d'un fichier A vers un fichier B
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 22/03/2007, 10h49
  3. [VBA-E] Copier une feuille d'un fichier 1 sur un fichier 2
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/03/2007, 16h47
  4. [VBA-E]Copier une serie de cellules dans une autre feuille
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/03/2006, 17h23
  5. [VBA-E] Copier une formule de calcul dans toute la ligne
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2005, 18h18

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