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 Problème avec .SpecialCells(xlCellTypeLastCell)


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut VBA Problème avec .SpecialCells(xlCellTypeLastCell)
    Bonjour à tous,

    Voici mon problème :

    1 - Dans mon processus je suis amené à réinitialiser une feuille de travail (wsFeuilleSortie) sans effacer la ligne n°1 afin de conserver les titres de colonnes.
    Pour cela je récupère le n° (X) de la dernière ligne de la plage de données figurant dans cette feuille et je supprime les lignes correspondantes de la ligne 2 incluse à la ligne X incluse.
    Voir le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        ....
        wsFeuilleSortie.Activate
        lDerniereLigneWbS =  wsFeuilleSortie.Range("A1").SpecialCells(xlCellTypeLastCell).Row + 1
        MsgBox lDerniereLigneWbS ' --> = 
        wsFeuilleSortie.Rows("2:" & lDerniereLigneWbS).EntireRow.Delete
        ....
    2 - Ensuite dans mon processus, je compile des données venant d'autres feuilles en plaçant les lignes de données les unes à la suite des autres.
    Voir le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For Each vfichier In stLstfichiers
        Set wbEntree = Workbooks.Open(vfichier, ReadOnly:=True)
        ' Pour chacune des feuilles du fichier d'entrée
            For Each wsFeuilleEntree In wbEntree.Worksheets
                ' On récupère l'adresse de la dernière ligne du fichier de compilation _
                  que l'on incrémente pour se positionner sur la ligne suivante (libre)
                lDerniereLigneWbS = wsFeuilleSortie.Range("A1").SpecialCells(xlCellTypeLastCell).Row + 1
                ....
                ET c'est là que cela "coince" !!!
    Cela "coince" car lors de la première passe dans la 1ère boucle FOR et la suivante, le n° de dernière ligne (lDerniereLigneWbS) récupéré est le même que celui récupéré à l'étape 1 soit 'X' alors qu'après la suppression des lignes de données il aurait du être égal à '2' puisqu'il n'existe plus de données dans la feuille.

    J'ai bien essayé de modifier ma méthode de suppression de lignes en utilisant d'autres méthodes de sélection de lignes mais rien y fait, lors de l'appel à '.SpecialCells(xlCellTypeLastCell)' au premier passage dans l'étape 2 je récupère toujours le n° de la dernière ligne de données présentes avant l'effacement. Pour les passages suivants, pas de problèmes, tout est OK, ma recopie de lignes de données s'effectue bien à la suite des précédentes.

    Si avec ces quelques explications, qq'un peut SVP m'aider à corriger ce problème, il sera le bienvenu.
    D'avance MERCI de vos réponses.

    Cordialement
    oracle7

  2. #2
    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 : 70
    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,
    essayes comme ça étant donné que toutes les entrées sont supprimmées à partir de la ligne 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    lDerniereLigneWbS = 2
    For Each vfichier In stLstfichiers
        Set wbEntree = Workbooks.Open(vfichier, ReadOnly:=True)
        ' Pour chacune des feuilles du fichier d'entrée
            For Each wsFeuilleEntree In wbEntree.Worksheets
                ' On récupère l'adresse de la dernière ligne du fichier de compilation _
                  que l'on incrémente pour se positionner sur la ligne suivante (libre)
                lDerniereLigneWbS = lDerniereLigneWbS + 1
    ....
    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...)

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonsoir casefayere

    1 - Merci de ta réponse qui marche aussi.

    2 - En fait j'ai trouvé entre temps par hasard la solution dans le guide de JM RABILLOUD "VB-VBA Programmer efficacement Microsoft Excel" disponible sur le présent site.

    Je l'indique ici pour qu'elle profite à d'autres qui rencontreront ce problème.

    En fait, selon JM RABILLOU, je l"ecite : "Excel ne remet pas à jour automatiquement l'adresse de la dernière cellule lors d'un effacement. Pour forcer la mise à jour, il faut faire appel explicitement à la propriété UsedRange."

    Donc dans mon cas le code correct est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lDerniereLigneWbS = wsFeuilleSortie.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
    Ainsi je récupère le bon numéro de ligne après effacement.

    Au final je considère mon post comme résolu.

    Merci encore de ton aimable aide.
    Cordialement
    oracle7

  4. #4
    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 : 70
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    re bonsoir,
    fais ce test sur fichier vierge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim l
    l = Sheets("feuil1").UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
    MsgBox l
    End Sub
    sur ta feuille 1 tu te contentes de mettre ce que tu veux, ex. A en a1, b en b1, C en c1, D en d1
    lance la procédure", le résultat sera bien sur 2. Maintenant, donnes un format de cellules à "A1:d8" sans entrer de données (ex. date) et regardes le résultat de cette macro, pourtant tu n'as pas d'autres données. C'était juste pour dire que je me méfie de Usedrange

    Bonne nuit
    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...)

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. [VBA]problème avec SaveAs
    Par porki dans le forum Access
    Réponses: 3
    Dernier message: 29/05/2006, 14h52
  3. [VBA]problème avec le debogage
    Par norkius dans le forum Access
    Réponses: 1
    Dernier message: 22/05/2006, 14h15
  4. [VBA] Problème avec composant VB6
    Par Diablo_22 dans le forum Général VBA
    Réponses: 8
    Dernier message: 16/03/2006, 20h41
  5. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24

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