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

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    septembre 2007
    Messages
    666
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : septembre 2007
    Messages : 666
    Points : 279
    Points
    279

    Par défaut ordre alphabétique et forcer majuscule après saisie dans ListObjects

    salut le phorum

    j'ai une macro qui me tri un tableau après mise à jour
    jusque là pas de problème
    par contre si je veux que la saisie soit en majuscule pas moyen
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        With Me.ListObjects("BDD_CLIENTS")
     
            If Not Intersect(Target, .DataBodyRange.Columns(1)) Is Nothing Then
                .Range.Sort key1:=.Range.Cells(1, 1), order1:=xlAscending, Header:=xlYes
            End If
     
        End With
     
    End Sub
    voici ce que j'ai mis mais cela ne fonctionne pas cela plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            'If Not Intersect(Target, .DataBodyRange.Cells(1) Is Nothing Then
            '    .Range.value = UCase(.Range.value)
            'End If
    j'aimerai aussi qu'il teste si ce n'est pas un doublon et afficher un message dans ce cas et ne pas prendre en compte la saisie donc sortir de la boucle

    merci d'avance pour votre aide

    david

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    7 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 7 187
    Points : 12 470
    Points
    12 470

    Par défaut

    Bonjour
    L'objet ListObjects est une collection et est à traiter comme toute collection.
    Range n'est pas un membre de l'objet/collection ListObjects. Et donc --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range.value = UCase(.Range.value)
    n'a aucun sens et est incompréhensible.
    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" ...
    Les raisons réelles de délaissements ne sont pas toujours celles que l'on pense avoir déterminées.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    septembre 2007
    Messages
    666
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : septembre 2007
    Messages : 666
    Points : 279
    Points
    279

    Par défaut

    merci de ta réponse Unparia

    mais pourrais tu être plus explicite ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    7 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 7 187
    Points : 12 470
    Points
    12 470

    Par défaut

    mais pourrais tu être plus explicite ?
    oui. Et je l'ai déjà été --->>
    L'objet ListObjects est une collection et est à traiter comme toute collection.
    Ta question serait-elle : "comment manipuler les items d'une collection" ? (quelle que soit la collection) ...
    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" ...
    Les raisons réelles de délaissements ne sont pas toujours celles que l'on pense avoir déterminées.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    mai 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 128
    Points : 106
    Points
    106

    Par défaut

    tu es obligé de passer par un traitement vba ou autre.

    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
     
    Option Explicit
     
    '*
    '* striEtMajuscule
    '* tri tableau et mise en majuscule
    '*************************
    Sub striEtMajuscule()
     
        Dim lo_tab As ListObject
        Dim r_Cel As Range
        '-------------------------
     
        Set lo_tab = Sheets("maFeuille").ListObjects("t_tab") ' t_tab nom donné au tableau structuré
     
        sTri_Table lo_tab, 1 ' tri colonne 1 du tableau lo_tab
     
        For Each r_Cel In lo_tab.ListColumns(1).DataBodyRange
            Debug.Print UCase(r_Cel.Value)
        Next
     
        Set lo_tab = Nothing
    End Sub
     
    '*
    '* sTri_Table
    '* ListObject : Lo concerné
    '* Col : Colonne sur laquelle sera appliquée le tri
    '**************************************************
    Public Sub sTri_Table(Tb As ListObject, Col As Integer)
        '---------------------------------------------------------
        Dim objCol As Range
        '---------------------------------------------------------
     
        'On sort si le nombre de colonnes du tableau est inférieur à la valeur
        'passée à la sous procédure.
        If Tb.ListColumns.Count < Col Then Exit Sub
     
        'Définit le champ à trier dans le tableau
        Set objCol = Tb.ListColumns(Col).Range
     
        With Tb.Sort
            'Supprime les tris existants
            .SortFields.Clear
            'Ajoute un nouveau tri
            .SortFields.Add objCol, xlSortOnValues, xlAscending, DataOption:=xlSortTextAsNumbers
            'Indique si la première ligne contient les en-têtes
            .Header = xlYes
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            'Applique le tri
            .Apply
        End With
    End Sub

  6. #6
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    13 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 13 320
    Points : 35 545
    Points
    35 545
    Billets dans le blog
    40

    Par défaut

    Salut

    Citation Envoyé par unparia Voir le message
    Bonjour
    L'objet ListObjects est une collection et est à traiter comme toute collection.[...]
    Dans le code fourni, il n'est pas question de ListObjectS, mais d'UN listobjet précis, celui nommé BDD_CLIENTS, qui possède bien une propriété Range (à ne pas confondre avec sa propriété DataBodyRange). ListObject.Range fait référence à la plage de l'entièreté du tableau structuré ( range("DBB_CLIENTS[#All]"), DataBodyRange faisant référence à la plage de données s'il y a des données (range("DBB_CLIENTS").

    @Munity: Dans ton message initial, tu parles de boucle, mais je ne vois pas de boucle dans ton code. Tu as intérêt à scinder ton code en procédures comme le montre WuKoDLaK . Tu appelleras ces procédures l'une après l'autre d'abord pour transformer en majuscules puis pour trier. Pour des raisons d'efficacité si tu saisis dans ton tableau "au kilomètre", je te déconseille de réaliser la mise en majuscules et le tri sur l'évènement Change, mais de le faire lorsque les saisies sont terminées.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    septembre 2007
    Messages
    666
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : septembre 2007
    Messages : 666
    Points : 279
    Points
    279

    Par défaut

    Bonsoir a tous les deux
    Et merci de vos reponses
    Oui effectivement la solution ideale serait de creer le code et de le valider avec un command button situe sur la feuille excel
    Mais j aurai preferer une mise a jour automatisee
    L utilisateur saisi le nouveau client appuie sur entree et la table se met a jour
    Tri
    Majuscule
    Controle et suppression si doublons

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    mai 2008
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2008
    Messages : 180
    Points : 257
    Points
    257

    Par défaut

    Bonjour !

    Une Table, un Tableau que d'aucun qualifie de structuré, est avant tout un objet (une collection) Range.
    Il est donc plus commode d'utiliser le vocabulaire classique, de base connu donc éviter celui (alambiqué) réservé au Tableau.
    Avec un tableau nommé Clients et quand même l'évènement Change cela pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal R As Range)
      Dim P As Range, C As Range
      Set P = [Clients].Columns(1)
      If Not Intersect(R, P) Is Nothing And R.Count = 1 Then
        Application.EnableEvents = 0
        'colonne 1 du Tableau sans doublon
        If Application.CountIf(P, R) > 1 Then R = ""
        'tri croissant du tableau à partir de sa colonne 1
        [Clients].Sort P.Rows(0), Header:=1
      End If
      'colonne 1 du Tableau en majuscules
      For Each C In Range(P.Address): C = UCase(C): Next
      Application.EnableEvents = 1
    End Sub
    Remarques
    - une petite difficulté de ces tableaux :
    For Each C In [Clients].Columns(1) pose problème ; mais pas For Each C In [Clients[Titre1]] !
    - Avec un nombre de lignes très important, il vaudra mieux passer par un tableau (VBA)
    Fichiers attachés Fichiers attachés

  9. #9
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    13 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 13 320
    Points : 35 545
    Points
    35 545
    Billets dans le blog
    40

    Par défaut

    Salut.

    Citation Envoyé par OrDonc Voir le message
    Bonjour !

    Une Table, un Tableau que d'aucun qualifie de structuré, est avant tout un objet (une collection) Range.
    Il est donc plus commode d'utiliser le vocabulaire classique, de base connu donc éviter celui (alambiqué) réservé au Tableau.[...]
    Sans vouloir à tout prix polémiquer, je ne suis pas d'accord avec ce qui est dit ici. Je termine un tuto sur les tableaux structurés en VBA, et je montre dans ce tuto les avantages énormes à travailler avec les tableaux structurés (et a minima avec les "plages nommées" de ces tableaux). Et un tableau structuré n'est pas, même avant tout, un objet Range. C'est un objet ListObject qui possède des propriétés de type Range (parmi d'autres).

    Les problèmes évoqués par OrDonc sont avant tout issus d'une méconnaissance de la manipulation des références structurées en VBA. Il est possible par exemple d'utiliser les références structurées en VBA. On peut donc pointer vers Range("Tableau1[Colonne1]") par exemple.

    Je ne peux en tout cas personnellement que conseiller de travailler avec des tableaux structurés et des références structurées, que ce soit en Excel ou en VBA, plutôt qu'avec des plages classiques. Le code produit sera plus léger et surtout beaucoup plus stable
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    septembre 2007
    Messages
    666
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : septembre 2007
    Messages : 666
    Points : 279
    Points
    279

    Par défaut

    bonsoir

    désolé pour ce retour rapide
    la solution de OrDonc est parfaite...

    cependant j'ai une question (je ne sais pas si c'est possible mais bon je tente....), lorsque j'ai un tableaux avec x colonnes
    comment lui dire de faire un change après la saisie d'une ligne complète
    colonne 1 a x, validation après saisie de la dernière colonne du tableau

    merci pour tout en tout cas

    david

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    septembre 2007
    Messages
    666
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : septembre 2007
    Messages : 666
    Points : 279
    Points
    279

    Par défaut

    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Sans vouloir à tout prix polémiquer, je ne suis pas d'accord avec ce qui est dit ici. Je termine un tuto sur les tableaux structurés en VBA, et je montre dans ce tuto les avantages énormes à travailler avec les tableaux structurés (et a minima avec les "plages nommées" de ces tableaux). Et un tableau structuré n'est pas, même avant tout, un objet Range. C'est un objet ListObject qui possède des propriétés de type Range (parmi d'autres).
    quand ce tuto sera disponible ?
    faut il s'abonner quelque part pour être informé de sa disponibilité

  12. #12
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    13 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 13 320
    Points : 35 545
    Points
    35 545
    Billets dans le blog
    40

    Par défaut

    Salut.

    Citation Envoyé par munity Voir le message
    quand ce tuto sera disponible ?
    faut il s'abonner quelque part pour être informé de sa disponibilité
    Fin de semaine prochaine ou de la suivante, je pense. Il sera annoncé sur le portail Excel et dans cette discussion à laquelle tu peux t'abonner si tu le souhaites
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    mai 2008
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2008
    Messages : 180
    Points : 257
    Points
    257

    Par défaut Re

    Re !
    Citation Envoyé par Pierre Fauconnier Voir le message
    Les problèmes évoqués par OrDonc sont avant tout issus d'une méconnaissance de la manipulation des références structurées en VBA ...
    Pierre, tu as un début de réponse ici.

  14. #14
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    13 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 13 320
    Points : 35 545
    Points
    35 545
    Billets dans le blog
    40

    Par défaut

    Citation Envoyé par OrDonc Voir le message
    [...]
    - une petite difficulté de ces tableaux :
    For Each C In [Clients].Columns(1) pose problème ; mais pas For Each C In [Clients[Titre1]][...]
    Il faut écrire For Each C in [Clients].Columns(1).Cells

    Au passage, avis personnel et donc subjectif, je n'aime pas du tout la notation [Clients] ou [A1]... (notamment parce qu'elle ne permet pas la saisie semi-automatique derrière, ne permettant dès lors pas d'obtenir la liste des méthodes/propriétés de l'objet, et/ou de bien comprendre que l'on utilise un Range).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. [AC-2007] MAJ liste déroulante FormA aprés saisie dans FormB
    Par popoliline dans le forum IHM
    Réponses: 6
    Dernier message: 30/11/2009, 19h25
  2. Remplacer un caractère après saisie dans TextBox
    Par melouille56 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/10/2007, 16h12
  3. Réponses: 11
    Dernier message: 17/03/2007, 21h17
  4. [VBA-E] afficher des données apres saisie dans cellule
    Par user0505 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2006, 15h04
  5. Refresh de page initiale après saisie dans une popup
    Par muppetshow dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 16/03/2005, 13h21

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