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

Excel Discussion :

Création d'une fonction


Sujet :

Excel

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut Création d'une fonction
    Bonsoir à tous,
    Je cherche à retrouver l’adresse de la dernière cellule de la plage utilisée.
    J’ai donc créé une fonction qui à priori fonctionne normalement si je l’utilise en passant par l’intermédiaire d’une Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    Cells(3, 3) = sc("Feuil1")
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function sc(Optional feuilleRecherche As String)
        If feuilleRecherche = "" Then
            Set sht = ActiveSheet
        Else
            Set sht = Worksheets(feuilleRecherche)
        End If
    sc = sht.Cells.SpecialCells(xlCellTypeLastCell).Address
    End Function
    J’obtiens la bonne cellule, par contre si je lance directement la fonction en saisissant dans une cellule =sc("Feuil1") j’ai en retour $1:$1048576, ce qui correspond à la feuille entière.
    Je dois dire que je ne comprends pas. Quelqu’un a-t-il une explication, et une solution ?
    Merci de vos retours, bien cordialement
    JP

  2. #2
    Membre chevronné
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2012
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 323
    Par défaut
    Bonjour,

    Avec une formule matricielle pour la colonne A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=MAX(SI(ESTVIDE(A:A);0;LIGNE(A:A)))}
    Slts

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 310
    Par défaut
    Hello,
    Citation Envoyé par JPierreM Voir le message
    Bonsoir à tous,
    Je cherche à retrouver l’adresse de la dernière cellule de la plage utilisée.
    tu nous parles de plage et tu fais la recherche sur une feuille ? tu cherches la dernière cellule utilisée dans une feuille ? Avec des lignes sans donnée ?
    Ami calmant, J.P

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonjour,

    Oui c’est exactement cela, en fait c’est la cellule que l’on obtient par le raccourci clavier Ctrl+Fin ou par Accueil<Rechercher et sélectionner<Atteindre...<Cellules...Dernière cellule. Je voudrai généraliser la recherche en précisant la feuille sur laquelle la recherche se fait.

    Merci

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 310
    Par défaut
    Hello,
    tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function sc(Optional feuilleRecherche As String)
        If feuilleRecherche = "" Then
            Set sht = ActiveSheet
        Else
            Set sht = Worksheets(feuilleRecherche)
        End If
    sc = sht.UsedRange.SpecialCells(xlCellTypeLastCell).Address
    End Function
    mais cela te donnera plutôt la dernière ligne et la dernière colonne utilisées.

    Ami calmant, J.P

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonjour,
    Merci de vos retours. La solution proposée par JP m’aide beaucoup. Elle renvoie l’adresse de UsedRange de la feuille passée en argument. A partir de là j’ai apporté quelques ajouts, code ci-dessous :

    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
    Function sc(Optional feuilleRecherche As String)
    Dim sht As Worksheet
    Dim a As String, b As Long, c As String
        If feuilleRecherche = "" Then
            Set sht = ActiveSheet
        Else
            Set sht = Worksheets(feuilleRecherche)
        End If
    Application.EnableEvents = False '*Je donne plus bas la raison de cette utilisation
    a = sht.UsedRange.Cells.SpecialCells(xlCellTypeLastCell).Address(False, False)
    b = Range(a).Cells.Count
    c = Range(a).Cells(b).Address(False, False)
    Application.EnableEvents = True
     
        If a = "A1" Then
            If sht.UsedRange.Cells(1) <> "" Then
                sc = c
            Else
                sc = "La feuille est vide"
            End If
        Else
            sc = c
        End If
    Set sht = Nothing
    End Function
    *Je me suis rendu compte que SpecialCells(xlCellTypeLastCell) faisait appel à la macro Worksheet_SelectionChange si elle existait, donc pour éviter tout problème j’ai utilisé la propriété Application.EnableEvents.
    J’ai fait le test de la fonction à partir de la même feuille vers plusieurs feuilles en passant leurs noms en argument. Ça semble fonctionner, un petit bémol malgré tout.
    Pour une feuille donnée lorsque le retour de la fonction est A1, 4 cas se présentent :
    - La cellule A1 est non vide et non formatée
    - La cellule A1 est non vide et formatée
    - La cellule A1 est vide et formatée
    - La feuille est vierge de tout
    Pour les deux premiers cas j’utilise un test sur la cellule A1 pour savoir si elle n’est pas vide.
    Pour les deux autres cas je n’arrive pas à déterminer si A1 a été formatée, donc même si elle est vide et formatée la fonction renvoie « La feuille est vide ». Ce cas doit être extrêmement rare mais existe-t-il une façon pour savoir si une cellule a été formatée, car tester tous les cas de formatage possibles ne me semble pas envisageable ?
    Merci
    JP

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 216
    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 : 13 216
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La propriété NumberFormat de l'objet Range permet de connaître le format d'une cellule
    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

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonsoir,

    Sauf erreur il me semble que le formatage d’une cellule ne se limite pas aux nombres, il y a aussi la couleur de fond, les bordures, la police, l’alignement …C’est pourquoi je disais que tout tester ne me semblait pas envisageable.
    Merci

    JP

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2011, 12h54
  2. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 15h28
  3. Réponses: 16
    Dernier message: 24/10/2006, 22h37
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 12h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 14h44

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