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 :

La méthode 'Add' de l'objet 'ListRows' a échoué [XL-2013]


Sujet :

Macros et VBA Excel

  1. #21
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,
    y a t il une colonne "Prénom" avec "é" , "P",... ?
    TbLigne vaut quoi ? --> sur la ligne jaune , met le curseur sur TbLigne , il doit apparaître la valeur
    le nom de la textbox est bien "PrenomTextBox" --> voir accent, majuscule,...

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  2. #22
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,

    TbCols("Prénom").DataBodyRange(TbLigne).Value
    TbCols("Prénom") --> colonne "Prénom"
    .DataBodyRange(TbLigne) --> la ligne dans la colonne
    .Value --> la valeur de la cellule ( ligne , colonne)

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  3. #23
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,
    y a t il une colonne "Prénom" avec "é" , "P",... ?
    TbLigne vaut quoi ? --> sur la ligne jaune , met le curseur sur TbLigne , il doit apparaître la valeur
    le nom de la textbox est bien "PrenomTextBox" --> voir accent, majuscule,...

    @+JP
    1: oui colonne Prénom
    2: je ne vois pas où s'affiche une valeur ?
    3: oui c'est bien PrenomTextBox

  4. #24
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,
    juste avant TbCols("Prénom").DataBodyRange(TbLigne).Value

    ecrit msgbox TbLigne

    et relance

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  5. #25
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, avec les tableaux, j'utilise beaucoup les plages nommées.

    Sur base du tableau suivant, on peut utiliser un code de remplissage qui n'utilise pratiquement pas le listobject (juste pour tester s'il est vide ou pas)
    Nom : Capture.PNG
Affichages : 313
Taille : 23,7 Ko

    Voici un code qui remplit le tableau en testant qu'il est vide ou pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub AddContact(FirstName As String, LastName As String)
      Dim RowIndex As Long
     
      If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then
        RowIndex = 1
      Else
        RowIndex = Range("t_Contacts").Rows.Count + 1
      End If
      Range("t_contacts[prénom]")(RowIndex).Value = FirstName
      Range("t_contacts[nom]")(RowIndex).Value = LastName
    End Sub
    Sur un tableau vide, tu peux tester et entrer les deux contacts suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      AddContact "Pierre", "Durand"
      AddContact "Martine", "Dupont"
    End Sub
    Personnellement, je trouve que c'est plus simple que de travailler avec les listobject.

    De plus, j'essaie de ne jamais effectuer les traitements directement dans les userform. Je préfère découpler et utiliser le userform pour ce qu'il est, à savoir un auxiliaire de saisie. Lorsque les données sont saisies, on les passe en paramètres à une fonction hors userform qui réalise le process. On utilise cette méthode tant pour l'ajout que pour la suppression. Ca permet de tester chaque fonctionnalité en dehors d'un contexte où elle utilise peut-être des mauvaises valeurs de variables (cas typique d'une ligne supprimée qui décale un objet Range). Tu supprimes une ligne en lui passant son numéro, et tu ajoutes sur une ligne en lui passant des données via une autre fonction. Les fonctions utilisant chacune leurs propres variables, aucun risque de se mélanger les pinceaux... (C'est ma façon psychorigide de coder )
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #26
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,
    juste avant TbCols("Prénom").DataBodyRange(TbLigne).Value

    ecrit msgbox TbLigne

    et relance

    @+JP
    si je relance sans point d'arrêt je plante Excel
    avec arrêt sur ligne msgbox :

    Nom : jp.PNG
Affichages : 220
Taille : 45,8 Ko

  7. #27
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut merci Pierre mais si tu avais pu jeter un oeil plus haut... j'essayais le plages nommées->01/09 14h40
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Perso, avec les tableaux, j'utilise beaucoup les plages nommées.

    Sur base du tableau suivant, on peut utiliser un code de remplissage qui n'utilise pratiquement pas le listobject (juste pour tester s'il est vide ou pas)
    Nom : Capture.PNG
Affichages : 313
Taille : 23,7 Ko

    Voici un code qui remplit le tableau en testant qu'il est vide ou pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub AddContact(FirstName As String, LastName As String)
      Dim RowIndex As Long
     
      If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then
        RowIndex = 1
      Else
        RowIndex = Range("t_Contacts").Rows.Count + 1
      End If
      Range("t_contacts[prénom]")(RowIndex).Value = FirstName
      Range("t_contacts[nom]")(RowIndex).Value = LastName
    End Sub
    Sur un tableau vide, tu peux tester et entrer les deux contacts suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      AddContact "Pierre", "Durand"
      AddContact "Martine", "Dupont"
    End Sub
    Personnellement, je trouve que c'est plus simple que de travailler avec les listobject.

    De plus, j'essaie de ne jamais effectuer les traitements directement dans les userform. Je préfère découpler et utiliser le userform pour ce qu'il est, à savoir un auxiliaire de saisie. Lorsque les données sont saisies, on les passe en paramètres à une fonction hors userform qui réalise le process. On utilise cette méthode tant pour l'ajout que pour la suppression. Ca permet de tester chaque fonctionnalité en dehors d'un contexte où elle utilise peut-être des mauvaises valeurs de variables (cas typique d'une ligne supprimée qui décale un objet Range). Tu supprimes une ligne en lui passant son numéro, et tu ajoutes sur une ligne en lui passant des données via une autre fonction. Les fonctions utilisant chacune leurs propres variables, aucun risque de se mélanger les pinceaux... (C'est ma façon psychorigide de coder )
    Voici le code qui me posait souci (Tableau et Plage nommée)

    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
     
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            Range("A2").Select
            Selection.ListObject.ListRows.Add (1)
            ActiveCell.Value = UserForm1.NomTextBox
            ActiveCell.Offset(0, 1).Value = UserForm1.PrenomTextBox
            Unload Me
            UserForm1.Show
        Else
            Unload Me
            UserForm1.Show
        End If
    End Sub
     
     
    Private Sub SupprIntervenantBtn_Click()
     With ComboBox1
        li = .ListIndex + 2
        Rows(li & ":" & li).Select
        Selection.Delete Shift:=xlUp
        Unload Me
        UserForm1.Show
      End With
    End Sub
     
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "=Plage"
    End Sub
    Cdt, Eric

  8. #28
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,

    l'erreur est donc TbLigne qui n'a pas de valeur

    TbLigne prend la valeur de TbRows.Count --> nombre de ligne de TbRows --> donc la dernière ligne

    on pourrait tester avec msgbox TbRows.Count , mais autant contrôler si TbRows est bien déclaré

    Dim TbRows As ListRows --> en tête de module
    et
    Set TbRows = Tb.ListRows dans procédure "Initialise"
    et
    Call Initialise dans Private Sub UserForm_Initialize()

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  9. #29
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Pour continuer dans les exemples de manip, tu peux créer également une fonction qui supprime. Le code suivant, issu du tableau illustré ci-dessous, supprime une ligne puis en ajoute une. Ici, les fonctions ne gèrent pas les erreurs. C'est normalement au code appelant (le clic sur un des boutons) à gérer les erreurs qui remontent des autres couches de l'appli. Par exemple, si l'ID n'existe pas, ça plante. C'est donc la fonction qui appelle DeleteContact qui doit gérer l'erreur avec une gestionnaire d'erreur adéquat. On pourrait aussi gérer l'erreur en interne et renvoyer soit 0 (tout est ok) soit un code d'erreur qui serait traité par la suite dans la fonction appelante.

    Mais à nouveau, en procédant de la sorte, tu crées des fonctions qui ne font qu'une seule chose, et tu peux tester et retester ces fonctions dans tous les sens... Ca donne l'impression d'être plus complexe, mais c'est au final beaucoup plus simple à écrire, à tester et à maintenir.
    Nom : Capture.PNG
Affichages : 197
Taille : 24,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub DeleteContact(ID As String)
      Dim RowIndex As Long
     
      RowIndex = Application.Match(ID, Range("t_contacts[ID]"), 0)
      Range("t_contacts").ListObject.ListRows(RowIndex).Delete
    End Sub
     
    Sub Test()
      DeleteContact "X485"
      AddContact "Alain", "Térieur", "Z111"
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #30
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    bonjour Pierre,

    j'aime bien ton code , qui est "tout simple" (traduire par "clair' )

    dans mon exemple qui est plus "lourd" , j'ai voulu démontrer le croisement des colonne et ligne avec des "nommé"
    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  11. #31
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,

    l'erreur est donc TbLigne qui n'a pas de valeur

    TbLigne prend la valeur de TbRows.Count --> nombre de ligne de TbRows --> donc la dernière ligne

    on pourrait tester avec msgbox TbRows.Count , mais autant contrôler si TbRows est bien déclaré

    Dim TbRows As ListRows --> en tête de module
    et
    Set TbRows = Tb.ListRows dans procédure "Initialise"
    et
    Call Initialise dans Private Sub UserForm_Initialize()

    @+JP
    mais dis-moi JP, pourquoi ça fonctionne au début et qu'après ça dérape ?
    Je ne m'explique pas bien comment ton premier fichier fonctionne toujours et que sur cette copie où j'ai uniquement changé le lancement du formulaire à l'ouverture du classeur plante ???

  12. #32
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Pour continuer dans les exemples de manip[...]
    Bonjour Pierre
    J'aurais eu grand besoin de tes lumières plus haut 01/09 14h40 pour me dire ce qui cloche dans ce code (plage nommée)

    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
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            Range("A2").Select
            Selection.ListObject.ListRows.Add (1)
            ActiveCell.Value = UserForm1.NomTextBox
            ActiveCell.Offset(0, 1).Value = UserForm1.PrenomTextBox
            Unload Me
            UserForm1.Show
        Else
            Unload Me
            UserForm1.Show
        End If
    End Sub
     
     
    Private Sub SupprIntervenantBtn_Click()
     With ComboBox1
        li = .ListIndex + 2
        Rows(li & ":" & li).Select
        Selection.Delete Shift:=xlUp
        Unload Me
        UserForm1.Show
      End With
    End Sub
     
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "=Plage"
    End Sub

  13. #33
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,
    moi çà fonctionne , mais j'ai que un onglet

    sheets(monsheet).select
    UserForm1.show

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  14. #34
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,

    l'erreur est donc TbLigne qui n'a pas de valeur

    TbLigne prend la valeur de TbRows.Count --> nombre de ligne de TbRows --> donc la dernière ligne

    on pourrait tester avec msgbox TbRows.Count , mais autant contrôler si TbRows est bien déclaré

    Dim TbRows As ListRows --> en tête de module
    et
    Set TbRows = Tb.ListRows dans procédure "Initialise"
    et
    Call Initialise dans Private Sub UserForm_Initialize()

    @+JP
    Mais c'est déjà le cas JP et ça plante toujours

    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
    Dim Tb As ListObject
    Dim TbRows As ListRows
    Dim TbCols As ListColumns
     
    Private Sub UserForm_Initialize()
        Call Initialise
    End Sub
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        Me.PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            'ajouter ligne
            Tb.ListRows.Add
            'derniere ligne
            TbLigne = TbRows.Count
            'ecrire nom
            TbCols("Nom").DataBodyRange(TbLigne).Value = UserForm1.NomTextBox.Value
            'ecrire prenom
            MsgBox TbLigne
            TbCols("Prénom").DataBodyRange(TbLigne).Value = UserForm1.PrenomTextBox.Value
            'initialise ComboBox1
            ComboBox1.RowSource = Range("Intervenants[#data]").Address
        End If
    End Sub
     
    Private Sub SupprIntervenantBtn_Click()
        'ligne à supprimer
        TbLigne = UserForm1.ComboBox1.ListIndex + 1
        'supprime ligne
        Tb.ListRows(TbLigne).Delete
        'initialise ComboBox1
        ComboBox1.RowSource = Range("Intervenants[#data]").Address
    End Sub
     
    Private Sub Initialise()
        Set Tb = ActiveSheet.ListObjects("Intervenants")
        Set TbRows = Tb.ListRows ' contient les lignes
        Set TbCols = Tb.ListColumns ' contient les colonnes
        'ComboBox1.RowSource = Range("Intervenants[[#data],[Nom]]").Address
        ComboBox1.RowSource = Range("Intervenants[#data]").Address
    End Sub

  15. #35
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,
    dans cette ligne,
    Set Tb = ActiveSheet.ListObjects("Intervenants")

    AvtiveSheet est celui qui contient le tableau

    mais à l'ouverture de ton fichier , quel est l'onglet actif ?

    avant d'appeler le form , selectionner le bon onglet OU revoir le code
    en indiquant Sheets("NomduSheet").ListObjects("Intervenants")
    et revoir tous les activesheet

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  16. #36
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Pour être sûr de travailler sur le bon tableau, quelle que soit la feuille active, tu peux utiliser
    set tbl = range("Intervenants").ListObject sans te tracasser de la feuille sur laquelle il se trouve ou que ce soit la bonne feuille qui soit activée.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #37
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    re,
    cool !!..

    direct je modifie..

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  18. #38
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,
    cool !!..[...]
    J'illustrais cette possibilité dans les codes que j'ai donnés, pour l'ajout ou pour le delete
    If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then pour voir si le tableau est vide

    Range("t_contacts").ListObject.ListRows(RowIndex).Delete pour supprimer la ligne du tableau (en se limitant donc aux colonnes dudit tableau)

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  19. #39
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Points : 24
    Points
    24
    Par défaut "pause dej"
    Excuse-moi JP, j'étais OFF

    Pour ce cas je suis sur un seul onglet pour rester simple, j'ai assez de comme ça
    Donc de toute façon à l'ouverture c'est bien Feuil1 qui est active

    Pour Pierre (pour lui montrer que j'ai un peu creusé la plage nommée sur ses recommandations)
    Oui si la plage n'est pas nommée pour la Feuille dont elle est issue, alors elle s'applique à tout le classeur actif

    Eric

  20. #40
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 927
    Points
    55 927
    Billets dans le blog
    131
    Par défaut
    En fait, le nom d'un tableau est unique dans le classeur. Dès lors, le nom utilisé est unique aussi, et donc la plage nommée avec un nom de tableau s'applique à la zone de données du tableau et s'applique donc à tout le classeur actif.

    De sorte que si tu as un tableau nommé t_Contacts, tu peux utiliser la plage nommée t_Contacts partout dans ton code, elle fera toujours référence à la zone de données dudit tableau.
    Entre autres avantages, utiliser Range("t_Contacts") pour pointer vers la zone de données du tableau, et notamment utiliser range("...").ListObject pour récupérer le listobject, permet que ton code ne doit pas être modifié si tu déplaces ton tableau sur une autre feuille ou si tu renommes ta feuille. Tu n'as en fait même pas besoin de savoir sur quelle feuille ton tableau se trouve ni comment elle se nomme, et ton code passe au travers de tous les déplacements, sur la feuille même, et vers une autre feuille également.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Méthode add() de l'objet select
    Par webrider dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/01/2008, 14h01
  2. Méthode add de l'objet AllowEditRange fonctionne... maintenant
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 12h58
  3. erreur La méthode 'Range' de l'objet '_Global' a échoué
    Par mahboub dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2006, 20h46
  4. la méthode 'connection' de l'objet '_currentProject' a échoué
    Par floysand dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/09/2006, 12h14
  5. [VBA-E]La méthode 'Range' de l'objet '_Global' a échoué
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/02/2006, 16h00

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