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 :

L'indice n'appartient pas à la sélection


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut L'indice n'appartient pas à la sélection
    Bonjour,
    Je fais appel à vous pour résoudre un problème.
    Je rempli ma listview et je souhaite copier la liste entière de ma listview sur ma feuille historique
    dans un tableau structuré nommé Tableau1.
    Merci de m'aider
    Voici ci-dessous le code ;

    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
    Sub ListView_vers_Feuille()
    Dim R As Range 'déclare la variable R (Recherche)
    Dim LI As Integer 'déclare la variable LI (LIgne)
    Dim l As Integer 'déclare la variable I(Incrément)
    Dim lg As Long, cl As Long, i As Long, j As Long
    Dim T As Variant
     
    Set OB = Worksheets("Bilan") 'définit l'onglet OB
    Set TSB = OB.ListObjects("Tableau1")
     
    Set R = TSB.ListColumns(1).Range.Find("")
    If R Is Nothing Or TSB.ListRows.Count = 0 Then
        TSB.ListRows.Add 'ajoute une ligne à TSB
        LI = TSB.ListRows.Count  'définit la ligne LI (dernière ligne de TSB)
    Else
        LI = R.Row - TSB.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne de en-têtes de TSB)
    End If
     
        With UserFormFiltre.ListView1
            lg = .ListItems.Count
            cl = .ColumnHeaders.Count
            ReDim T(1 To lg, 1 To cl + 1)
            For i = 1 To lg
                T(i, 1) = .ListItems(i).Text
                For j = 1 To cl - 1
                    T(i, j + 1) = .ListItems(i).ListSubItems(j).Text
                Next j
               Next i
            End With
    For l = 1 To lg ' boucle sur les lignes du tableau
    TSB.DataBodyRange(LI, 1 + l) = T(i, 1)
    TSB.DataBodyRange(LI, 2 + l) = T(i, 2)
    TSB.DataBodyRange(LI, 3 + l) = T(i, 3)   
    TSB.DataBodyRange(LI, 4 + l) = T(i, 4) 
    TSB.DataBodyRange(LI, 5 + l) = T(i, 5)   
    TSB.DataBodyRange(LI, 6 + l) = T(i, 6)
    TSB.DataBodyRange(LI, 7 + l) = T(i, 7)
    TSB.DataBodyRange(LI, 8 + l) = T(i, 8)
    TSB.DataBodyRange(LI, 9 + l) = T(i, 9)
    Next
    End Sub

  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,
    Afin de rendre plus lisible le code de votre procédure, merci de le baliser comme c'est prévu dans les règles du forum (voir illustration)
    Cela étant dit, une fois que vous aurez placé le code comme il se doit, il serait opportun de nous indiquer à quel numéro de ligne du code, l'erreur "L'indice n'appartient pas à la sélection" est levée.

    Nom : dvp Editeur Balises Code.gif
Affichages : 81
Taille : 24,2 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

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    Salut,

    Quelle ligne plante exactement ?
    Vérifie les dimensions des tableaux, ainsi que les indices.

    Note:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set R = TSB.ListColumns(1).Range.Find("")
    If R Is Nothing Or TSB.ListRows.Count = 0 Then
    	TSB.ListRows.Add 'ajoute une ligne à TSB
    	LI = TSB.ListRows.Count 'définit la ligne LI (dernière ligne de TSB)
    Else
    	LI = R.Row - TSB.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne de en-têtes de TSB)
    End If
    Pas sûr d'avoir compris ce petit bout de code, mais s'il s'agit de s'assurer que le tableau structuré possède au moins une ligne et de se positionner sur la dernière, il y a plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If(TSB.ListRows.Count = 0) Then
    	TSB.ListRows.Add
    End If
     
    dim LastRow as Excel.ListRow
    Set LastRow = TSB.listrows(TSB.ListRows.Count)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut L'indice n'appartient pas à la sélection
    Bonjour,
    Merci pour votre aide
    En faite je me suis trompé sur la boucle, For l To lg. J'ai remplacé par For i To lg et çà fonctionne.
    Sauf que dans mon tableau1 tout est décalé et créant des colonnes.
    Je vous envoi mon fichier.
    Merci encore.
    Cordialement
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour,

    en fait avec lg = .ListItems.Count tu dois parcourir ListItems de 0 = lg-1.

    Ce qui explique le premier message d'erreur (ListItems(lg) n'existe pas et par la suite le décalage : ListItems (i) est le i+1ème élément.

    Tu dois faire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T(i, 1) = .ListItems(i-1).Text
    avec i qui varie de 1 à lg, ou bien faire commencer tes tableaux à 0 plutôt qu'à 1, c'est une habitude à prendre.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    C'est une bonne idée de passer par un tableau 2D,
    côté perfs, on ne fait pas mieux.

    Si j'ai bien compris,
    Tu cherches à recopier les données du listview dans le tableau structuré.
    Sais-tu que tu peux recopier un tableau 2D dans une plage en une seul opération ?
    (a condition que la taille du tableau et de la plage correspondent).

    Di coup, on peut simplifier:
    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
    Sub ListView_vers_Feuille()
        Dim lg As Long, cl As Long, i As Long, j As Long
        Dim Data() As Variant
     
        With UserFormFiltre.ListView1
                '// Collecte des données du listview
            lg = .ListItems.Count
            cl = .ColumnHeaders.Count
            ReDim Data(1 To lg, 1 To cl + 1)
            For i = 1 To lg
                Data(i, 1) = .ListItems(i).Text
                For j = 1 To cl - 1
                    Data(i, j + 1) = .ListItems(i).ListSubItems(j).Text
                Next j
            Next i
        End With
     
        Dim OB As Excel.Worksheet
        Set OB = Worksheets("Bilan") 'définit l'onglet OB
     
        Dim TSB As Excel.ListObject
        Set TSB = OB.ListObjects("Tableau1")
            '// vide le TS
        TSB.DataBodyRange.Delete
     
            '// Ajoute autant de lignes que necessaire
        For i = 1 To lg
            TSB.ListRows.Add
        Next
            '// Transfer les données
        TSB.DataBodyRange.Value = Data
     
            '// active la feuille a la fin du traitement
            '// (c'est plus joli)
        OB.Activate
    End Sub
    PS:
    Prend l'habitude d'ajouter Option Explicit en tête de tous tes module, et d'activer l'option "Déclaration de variables obligatoire" dans ton IDE (Menu: Outils ==> Option ==> Onglet Editeur).
    Donne également des nom parlant a tes fonctions et variables, ca facilitera la lecture, la relecture et la compréhension.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut L'indice n'appartient pas à la sélection
    Merci pour ces précieux renseignements
    Merci d'avoir répondu rapidement
    Merci deedolith pour ta réponse que j'ai choisi et cela fonctionne très bien.
    Le problème est résolu
    Très cordialement

  8. #8
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Nouveau problème
    Bonjour à tous
    J'ai un nouveau problème concernant la macro éditer par deedolith.
    Je reçois un message lors d'exécution de mon bouton Print(Listview_vers_feuille)

    Erreur d'exécution '35600'
    Index out of bounds

    Dans cette ligne : Data(i, j + 1) = .ListItems(i).ListSubItems(j).Text
    Cordialement

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    C'est une histoire de calcul des indices.

    Le nombre de colonnes (ColumnHeaders.Count) ne correspond pas au nombre de sous items (ListSubItems.Count), il y a un ListSubItem de moins que de ColumnHeader.
    En effet, la premiere colonne est un objet ListItems, et les colonnes 2 à n sont des objets ListSubItems.

    A mon avis, me mieux, est encore de passer par les boucles For ... Each afin de s'affranchir au maximum du calcul des indices:
    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
    Sub ListView_vers_Feuille()
        Dim Data() As Variant
     
        With ListView1
                '// Collecte des données du listview
            ReDim Data(.ListItems.Count - 1, .ColumnHeaders.Count - 1)
     
            Dim i As Long
            Dim Item As MSComctlLib.ListItem
            For Each Item In .ListItems
                Data(i, 0) = Item.Text
     
                Dim j As Long
                j = 1   '// La première colonnes (indice 0) a déja été remplie, on commence donc à 1
                Dim Column As MSComctlLib.ListSubItem
                For Each Column In Item.ListSubItems
                    Data(i, j) = Column.Text
                    j = j + 1
                Next
                i = i + 1
            Next
        End With
     
        Dim OB As Excel.Worksheet
        Set OB = Worksheets("Bilan") 'définit l'onglet OB
     
        Dim TSB As Excel.ListObject
        Set TSB = OB.ListObjects("Tableau1")
     
            '// vide le TS
        If (TSB.ListRows.Count > 0) Then
            TSB.DataBodyRange.Delete
        End If
     
            '// Ajoute autant de lignes que necessaire
        For Each Item In ListView1.ListItems
            TSB.ListRows.Add
        Next
            '// Transfer les données
        TSB.DataBodyRange.Value = Data
     
            '// active la feuille a la fin du traitement
            '// (c'est plus joli)
        OB.Activate
    End Sub
    Au passage, j'ai changé la declaration du tableau, ce sera moins confu.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Index out of bounds
    Bonjour deedolith et Merci.
    En effet çà fonctionne beaucoup mieux et plus rapide.

    Est t'il possible de convertir en nombre la colonne Débit et Crédit.
    Merci
    Cordialement

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    Il y a les fonctions de transtypage pour cela (CDate, CStr, CInt ect ...)
    Fait une recherche dans l'explorateur d'objet et choisit celle qui te convient.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Voila j'ai trouvé comment modifier une colonne dans un tableaux structuré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub FormatColonne()
    Dim Tbl As ListObject
    Dim LI As Integer
     
    Set Tbl = ws_Synthèse.ListObjects("Tableau1")
        LI = Tbl.ListRows.Count 'définit la ligne LI (dernière ligne de TSB)
    For i = 1 To LI
          With Tbl
            .ListColumns("Débit [€]").DataBodyRange(i).ClearFormats
            .ListColumns("Débit [€]").DataBodyRange(i).Replace What:=",", Replacement:="."
         End With
      Next
    End Sub

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    Mouais,

    Tu t'attaques aux conséquences, et non aux causes.
    Ce sont les données en provenance du listview qu'il faut transtyper.

    Si besoin, il ne restera plus qu'a définir un format d'affichage pour les colonnes du tableau structuré.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    J'aimerais connaitre t'a pensée deedolith, comment je fais ?
    Cordialement

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    Actuellement,
    - Tu lis les données du listview (les causes).
    - Tu copies les données dans un tableau structuré.
    - Tu tritures les données du tableau pour qu'elles soient affichées correctement (les conséquences).
    Excel est capable de mieux que cela, avec l'aide entre autre du formatage de cellules (que tu as déjà mis en place).

    Je te proposes de t'attaquer aux causes, c'est à dire d'agir au plus tôt, lors de la lecture des données.
    Les données issues d'un listview étant de type texte, il faut transtyper ces dernières.
    Bien sûre elle doivent être testées, faute de quoi les fonction de transtypage lèverons une erreur.

    Au choix, via la fonction IsNumeric:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If (IsNumeric(Column.Text) Then
        Data(i, j) = CDbl(Column.Text)
    Else
        Data(i, j) = Column.Text
    End If
    Ou en se basant sur le numero de colonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select Case Column.Index
    Case 8, 9    '// Colonnes numeriques
            '// Transtypage si la colonne contient une donnée
        If (Column.Text <> vbNullString) Then
            Data(i, j) = CDbl(Column.Text)
        End If
    Case Else    '// Autre cas
        Data(i, j) = Column.Text
    End Select
    Au final:
    - On lit les données du listveiw
    - On transtype les données si necessaire
    - On copie les données dans un tableau structuré.
    - Les format de cellules s'occupent du reste.

    De plus, tu t'apercevras qu'une cellule contenant 85.25 est bien plus facile à manipuler qu'une cellule contenant 85.25 €, la devise ne faisant pas partie de la donnée.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    jeanyvesporcher
    Inscrit en
    Octobre 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : jeanyvesporcher
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2020
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Conversion en nombre
    Bonjour,
    J'ai adopté la première solution qui fonctionne très bien
    La deuxième solution ne fonctionne pas les colonnes 8 et 9 du tableau reste non converti.
    Cordialement

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 645
    Points
    1 645
    Par défaut
    Notes:
    Je t'invite à te documenter sur les techniques de débogage afin d'acquérir de l'autonomie sur tes développements.

Discussions similaires

  1. [AC-2007] Erreur : L'indice n'appartient pas à la sélection
    Par Nayko dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/04/2014, 11h23
  2. Réponses: 13
    Dernier message: 27/04/2012, 10h57
  3. erreur execution 9: l'indice n'appartient pas à la sélection
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/07/2007, 12h00
  4. [VBA-E] L'indice n'appartient pas à la séléction.
    Par DevStage dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/02/2007, 17h43
  5. l'indice n'appartient pas à la sélection ??
    Par Bernard83140 dans le forum Access
    Réponses: 4
    Dernier message: 06/05/2006, 22h27

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