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 :

Dernière cellule non vide


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Points : 53
    Points
    53
    Par défaut Dernière cellule non vide
    J'utilise régulièrement la fonction "End(xlDown)" pour connaître la dernière ligne non vide d'une plage de cellules.

    Aujourd'hui, j'ai remarqué que si une partie des lignes de ma plage est masquée :
    1. Si la première et la dernière ligne sont visibles, la fonction renvoi bien l'index de la dernière
    2. Si cette dernière ligne est masquée, l'index renvoyé est celui de la dernière ligne visible
    3. Si la première ligne est masquée et la dernière visible, la fonction renvoi bien l'index de cette dernière
    4. Si le dernière est aussi masquée, la fonction renvoi "1048576" (index de la dernière ligne de la feuille ?)
    5. Si toute la colonne où j'applique ma fonction est masquée (mais pas les lignes de la feuille qui la traverse !), la fonction renvoi bien la dernière ligne non vide de ma plage !!!

    Si quelqu'un peut m'expliquer la logique de Microsoft ou au moins comment, dans le cas "2" qui me préoccupe principalement, je peut obtenir l'index de ma dernière ligne non vide, je lui en serait très reconnaissant...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 213
    Points : 311
    Points
    311
    Par défaut
    Bonjour,


    ' Sélection de la cellule la plus à droite, la plus basse.
    ActiveCell.SpecialCells(xlLastCell).Select

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour

    1) à SR.SFC : ce que tu proposes là n'est pas exact. La plage SpecialCells(xlLastCell) inclut par exemple et entre autres les cellules vides, mais formatées.

    2) à Benevole V1 !
    a) Il est absolument normal que ne soient pas prises en considération les lignes cachées. Imagine d'ailleurs qu'un "amoureux" des Select, Activate, etc ... s'amuse à utiliser ce genre avec une cellule non visible ...
    b) Attention à l'utilisation adéquate des arguments directionnels de la propriété Range.End. Est retournée la dernière cellule remplie d'une REGION et non de l'ensemble des régions. Il vaut dans ton cas mieux utiliser l'argument xlUp appliqué à la dernière REGION
    c) Bien que je sache extraire ce que tu cherches à extraire, je ne souhaite pas t'en montrer la manière sans que tu ne me dises d'abord à quelles fins tu veux faire cela.
    Une chose doit être claire : ce n'est pas pour t'embêter, mais dans le seul souci d'éviter un plantage éventuel de ton appli.
    J'attends ta réponse.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Points : 53
    Points
    53
    Par défaut
    Réponse à unparia

    Merci pour ta réponse rapide. Voici la mienne...

    Sur une même feuille Excel, j'affiche dans les 13 lignes du haut des cellules qui doivent être visible à l'utilisateur et je mémorise, dans les lignes suivantes, des données utilisées par le code pour faire évoluer mon programme. Outre le fait qu'il ne comprendrais rien à ces données, l'utilisateur n'a pas intérêt à les modifier !

    J'ai donc résolu de les masquer pour 2 raisons :
    - ne pas "distraire" l'utilisateur avec des choses qui ne lui sont pas utiles
    - éviter de protéger et déporter ma feuille chaque fois que le code doit modifier les données.

    Dans une version antérieure de mon développement, mes données étaient mémorisées dans une feuille distincte, mais comme elles sont directement liées aux cellules visibles (de mes 13 1ères lignes) que l'utilisateur doit sélectionner pour agir sur ces données, j'ai pu rendre mon code beaucoup plus compréhensible en stockant les données dans les mêmes colonnes que les cellules qui leur correspondent.

    Mais le problème c'est que j'ai aussi dans d'autres colonnes de la même feuille des tableaux qui s'étendent vers le bas par ajout de lignes au cours de l'évolution du programme. Et c'est là que la méthode "End(xlDown)" me joue des problèmes car soit elle me renvoi l'index de la dernière ligne visible (si la première l'est aussi), soit le dernier index de la feuille.
    Là aussi l'emploi d'une feuille distincte pour stocker ces tableaux serait une solution, mais de nouveau en compliquant mon code qui reste beaucoup plus clair en ne jouant que sur la seule feuille active.

    Je t'explique tout cela parce que tu as pris le temps de t'intéresser à mon problème et de me répondre très clairement.

    Mais je dois à présent. te dire que cette nuit (je programme aussi en dormant !), je me suis demandé si la méthode "FIND" était aussi sensible à la visibilité des cellules. Car, à condition qu'elle puisse aussi renvoyer une cellule vide (ce que j'ai vérifié ce matin en même temps que le fait qu'elle ne tient pas compte de l'état des cellules), elle peut très bien remplacer mon "End" capricieux !

    Et cela m'a amené à développer une fonction qui me renvoi directement la plage dont j'ai besoin dans une variable "Range". Je te la transmet en pièce jointe au cas où cela pourrait t'intéresser, toute remarque de ta part étant bienvenue, bien entendu.

    Encore merci de la part d'un belge, qui au passage à la retraite (sans aucune formation informatique ...) a attrapé le même virus que les membres de votre Club !

    Bien à toi
    Images attachées Images attachées  

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Tout cela ressemble à la construction d'une usine à gaz.
    Mais bon ... C'est ton affaire et je ne m'en mêlerai donc pas au sein de cette discussion.

    Voici (analyse, comprends et adapte) de quoi tout afficher, traiter sur ce tout et tout remettre ensuite en l'état d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim plagevisible As Range, plageentiere As Range
      Set plagevisible = UsedRange.SpecialCells(xlCellTypeVisible)
      UsedRange.EntireRow.Hidden = False
      ActiveSheet.UsedRange
      Set plageentiere = UsedRange
        MsgBox "mets ici les instructions que tu veux. >Tout est maintenant visible"
     
      ' et on remet maintenant tout en l'état d'origine
      UsedRange.EntireRow.Hidden = True
      plagevisible.EntireRow.Hidden = False
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    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 762
    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 762
    Points : 28 621
    Points
    28 621
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement, j'utilise systématiquement la propriété CurrentRegion avec laquelle je n'ai jamais de problème. La seule condition c'est d'avoir la première ligne et la première colonne remplies.
    Pas de problème si la plage est filtrée même avec la dernière ligne masquée.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Philippe

    J'y ai également pensé, mais les quelques mots que je mets ici en rouge m'ont fait penser qu'il n'était peut-être pas totalement fiable d'utiliser cette propriété. --->>
    je me suis demandé si la méthode "FIND" était aussi sensible à la visibilité des cellules. Car, à condition qu'elle puisse aussi renvoyer une cellule vide (ce que j'ai vérifié ce matin en même temps que le fait qu'elle ne tient pas compte de l'état des cellules), elle peut très bien remplacer mon "End" capricieux !
    Et le descriptif fait de l'organisation de sa feuille de calculs n'a pas été de nature à me rassurer en ce qui concerne cet aspect-là.

    Amitiés

    EDIT : pour tout dire, j'ai du mal à imaginer avec certitude la disposition de ses données (visibles ou cachées) sur sa feuille de calculs.
    Je me demande s'il n'aurait pas intérêt à utiliser des plages nommées, voire encore à donner une entête (à cacher également) alors facilement identifiable par la méthode Find.
    Car (encore une fois si j'ai bien suffisamment compris/deviné) il semble vouloir permettre d'ajouter des données (et je suppose donc des lignes) dans la partie "supérieure" (celle non cachée), au dessus des cellules cachées. (???? mais je n'en sais à vrai dire rien ... Ce ne sont que de maigres hypothèses)

    EDIT 2 : ce sont par ailleurs tous ces doutes qui m'ont fait écrire plus haut :
    Attention à l'utilisation adéquate des arguments directionnels de la propriété Range.End
    Car (dans l'hypothèse où les cellules cachées sont dans la partie inférieure de sa feuille et que cette partie est totalement réservée à ce qui doit être caché), l'utilisation de la direction XlUp ignore les cellules cachées et retourne donc la dernière cellule visible de la zone non cachée, que cette dernière zone contienne ou non des "ruptures de région" (du fait de cellules vides)

    SEULE certitude : il est en train de payer finalement assez cher le fait d'avoir voulu éviter une feuille supplémentaire pour y abriter ce qu'il veut cacher. Plus cher que l'utilisation d'une simple variable Worksheet toto et un simple with toto ... End With.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    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 762
    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 762
    Points : 28 621
    Points
    28 621
    Billets dans le blog
    53
    Par défaut
    Bonjour Unparia,
    Il est évident que l'utilisation de la propriété CurrentRegion implique que l'on utilise les règles élémentaires de la bonne utilisation d'une liste de données dans Excel et ma réponse n'avait que pour seul but de répondre à l'explication donnée par l'initiateur de la discussion.
    Mise à part cela j'abonde complètement dans ton sens et trouve également étrange de ne pas utiliser une autre feuille pour placer les données à dissimuler. Feuille que l'on peut aisément cacher sans que l'utilisateur ne soupçonne même son existence à moins d'être un développeur VBA ayant une certaine expérience.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Points : 53
    Points
    53
    Par défaut
    Bonjour Unparia et Philippe Tulliez,

    Merci de vous être intéressé tous les deux à mon problème et d'avoir pris le temps de transmettre vos remarques très instructives.

    J'ai bien compris vos arguments et croyez bien que je vais en tenir compte pour la suite de mon développement.
    Pour tout vous dire, j'étais dans une solution multi-feuilles il y a quelques semaines, mais j'ai voulu tout grouper sur une seule pour simplifier mon code.
    Mais j'ai surtout réussi à construire une "Usine à gaz" comme tu l'as bien dis Unparia !

    Je vais donc revenir à mon option précédente qui va, du coup, écarter complètement le problème soulevé dans cette discussion et bien d'autres par la même occasion.
    Le fait, entre autres, de devoir masquer des plages sans intérêt pour l'utilisateur d'enlever et remettre la protection de ma feuille chaque fois que je le code doit y mémoriser quelque chose.

    Grace à vous j'ai aussi plus de chance de réussir un projet solide appris des petites choses intéressantes et je vous en remercie !

    Bien à vous

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

Discussions similaires

  1. [XL-2003] recherche de la dernière cellule non vide d'une plage
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/11/2009, 12h14
  2. Recherche de la dernière cellule non vide d'une colonne
    Par tasse2the dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2009, 09h30
  3. Dernière cellule non vide d'une colonne
    Par benfatpatra dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/10/2008, 17h28
  4. renvoi dernière cellule non vide d'une colonne
    Par emilie31 dans le forum Excel
    Réponses: 5
    Dernier message: 29/09/2008, 15h26
  5. Dernière cellule non vide d'une colonne
    Par RéviAT dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/02/2008, 14h43

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