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 :

Comment déclarer une plage dans un tableau en VBA [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Comment déclarer une plage dans un tableau en VBA
    Bonjour,
    Je veux me servir de la fonction Countif pour rechercher dans un tableau (listobject) le nombre d'occurences entre ma 1ère ligne de tableau et ma cellule sélectionnée (Target), mais je ne parviens pas à déclarer le range. : est-ce que c'et possible à faire ?
    Merci d'avance

  2. #2
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Bien entendu
    Pour déclarer une variable objet Tableau Structuré, c'est par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim oList As ListObject
    Set oList = Range("T_maTable").ListObject
    Les propriétés qui renvoient un objet Range
    Toute la table, c'est Range
    Uniquement les données c'est dataBodyRange
    Les données d'une colonne, c'est ListColumns("Nom de l'étiquette").DataBodyRange

    C'est une façon de le faire, mais il y en a d'autres

    Exemple
    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
    Sub t()
     Dim oList As ListObject
     Dim oRange As Range
     Dim oDataRange As Range
     Dim oColumnName As Range
     Dim txt As String
     Set oList = Range("T_MyTable").ListObject
     With oList
       Set oRange = .Range
       Set oDataRange = .DataBodyRange
       Set oColumnName = .ListColumns("Nom").DataBodyRange
     End With
     txt = "Table complète : " & oRange.Address
     txt = txt & vbCrLf & "Uniquement les données : " & oDataRange.Address
     txt = txt & vbCrLf & "La colonne des noms : " & oColumnName.Address
     MsgBox txt
     Set oList = Nothing
     Set oRange = Nothing
     Set oDataRange = Nothing
     Set oColumnName = Nothing
    End Sub
    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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci Philippe Tulliez, je regarde ça dès que j'ai 5 minutes.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Du coup, j'essaie de mettre ça en forme avec WorksheetFunction.CountIf() mais je n'arrive pas à y déclarer ma plage
    j'ai essayé avec ça et come par magie... ça ne marche pas

    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
    Sub Numero_auto(ByVal Target As Range)
    Dim Num_Titre as integer
    Dim MaPlage as Range
    Dim Debut as Range
    Dim Fin as Range
    Dim oList as ListObject
     
    Set oList = Range("Electricite1").ListObject
    Set Debut = oList.DataBodyRange.Rows(1)
    Set Fin = Target.Row
    Set MaPlage = Range(Debut,Fin)
     
    Num_Titre = WorksheetFunction.CountIf(MaPlage, "[MB] Titre")
    MsgBox(Num_Titre)
     
    End Sub

  5. #5
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je vous donne la manière de définir une plage de colonne et je ne vois nulle part l'application de ce que j'ai donné comme réponse. Pourquoi les variables debut et fin
    Dans cette ligne, Num_Titre = WorksheetFunction.CountIf(MaPlage, "[MB] Titre"), qu'essayez-vous de dénombrer ?

    [EDIT]
    Dans l'illustration ci-dessous, j'affiche les valeurs au-dessus de 10 dans la colonne dont l'étiquette est Qté du tableau structuré nommé T_Stock et il n'y a pas de magie, cela fonctionne.

    Le code de la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub t()
      Dim oList As ListObject
      Dim oColumnRange As Range
      Dim fn As WorksheetFunction
      Set oList = Range("T_Stock").ListObject
      Set oColumnRange = oList.ListColumns("Qté").DataBodyRange
      Set fn = Application.WorksheetFunction
      '
      MsgBox fn.CountIf(oColumnRange, ">10")
      '
      Set oList = Nothing: Set oColumnRange = Nothing: Set fn = Nothing
    End Sub
    On peut faire plus court
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
      Dim oColumnRange As Range
      Dim fn As WorksheetFunction
      Set oColumnRange = Range("T_Stock[Qté]")
      Set fn = Application.WorksheetFunction
      '
      MsgBox fn.CountIf(oColumnRange, ">10")
      '
      Set oColumnRange = Nothing: Set fn = Nothing
    End Sub
    et encore plus court
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub t()
      Dim fn As WorksheetFunction
      Set fn = Application.WorksheetFunction
      '
      MsgBox fn.CountIf(Range("T_Stock[Qté]"), ">10")
      '
      Set fn = Nothing
    End Sub
    On pourrait bien entendu se passer également de la variable fn mais la question initiale était "Comment déclarer une plage dans un tableau en VBA"

    Nom : ListObject CountIf.png
Affichages : 352
Taille : 27,1 Ko
    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

  6. #6
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Dans cette ligne, Num_Titre = WorksheetFunction.CountIf(MaPlage, "[MB] Titre"), qu'essayez-vous de dénombrer ?
    j'essaie de compter le nombre de fois où "[MB] Titre" apparait dans la colonne "Forme" entre la 1ère ligne du tableau et la ligne dans laquelle j'ai ma cellule sélectionnée.

  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
    12 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    le nombre d'occurences entre ma 1ère ligne de tableau et ma cellule sélectionnée (Target)
    Désolé, mais je n'avais pas lu correctement votre question.

    Voici le code d'une procédure qui dénombre le nombre de fois que le texte Oignon filet est présent dans la plage de cellules de la colonne "Libellé" et ce de la première ligne des données jusqu'à la cellule sélectionnée (pour l'exemple B11)

    Code de la procédure
    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
    Sub t()
      Const TableName As String = "T_Stock"       ' Nom de la table
      Const LabelName As String = "Libellé"       ' Colonne où a lieu le dénombrement
      Const LookupText As String = "Oignon filet" ' Texte cherché
      Dim oList As ListObject
      Dim oColumnRange As Range
      Dim fn As WorksheetFunction
      Dim NumberOffRows As Long
      Set oList = Range("T_Stock").ListObject
      Set oColumnRange = oList.ListColumns(LabelName).DataBodyRange
      Set fn = Application.WorksheetFunction
      NumberOffRows = ActiveCell.Row - oList.Range.Row
      Set oColumnRange = oList.ListColumns(LabelName).DataBodyRange.Resize(NumberOffRows)
      '
      MsgBox "Recherche effectuée dans la plage : " & oColumnRange.Address _
             & vbCrLf & "Trouvé " & fn.CountIf(oColumnRange, LookupText) & " x " & LookupText
      '
      Set oList = Nothing: Set oColumnRange = Nothing: Set fn = Nothing
    End Sub
    Illustration
    Nom : CountIf sur sélection.png
Affichages : 370
Taille : 28,0 Ko


    [EDIT]
    Je viens de constater que dans la ligne 9 du code publié, j'avais oublié de faire référence à la valeur de la constante déclarée en début de procédure

    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oList = Range("T_Stock").ListObject
    il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oList = Range(TableName).ListObject
    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
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Super, ça fonctionne ! merci Philippe

    question bonus : si je veux que mon code soit utilisable pour plusieurs tableaux, il faut que je remplace Const par Dim en début de code puis que je libère la variable en fin d'exécution ?

  9. #9
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour que le code fonctionne pour d'autres tableaux, il faut créer une procédure (Function ou Sub) avec plusieurs arguments. Nom de la table, Colonne à traiter, N° de la ligne de fin ou objet Range correspondant à la sélection c'est selon.
    C'est exactement comme cela qu'il faut faire dès que tu écris presque le même code une seconde fois
    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

  10. #10
    Futur Membre du Club
    Homme Profil pro
    métreur en architecture
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : métreur en architecture
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    ok, merci pour tout

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

Discussions similaires

  1. Comment trouver une valeur dans un tableau ?
    Par wizou44 dans le forum Excel
    Réponses: 20
    Dernier message: 29/08/2008, 10h57
  2. Réponses: 1
    Dernier message: 29/07/2008, 22h40
  3. Réponses: 4
    Dernier message: 17/01/2008, 17h06
  4. Réponses: 1
    Dernier message: 24/04/2007, 17h20
  5. Comment déclarer une DataSource dans server.xml
    Par guillaume06 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/06/2004, 14h27

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