Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

erreur sur identification de tableau

4 réponses
Avatar
Jieme
Bonjour,

J'ai un problème avec un tableau de string. un message de type erreur 9
"l'indice n'appartient pas a la sélection" qui me laisse...perplexe.
Je voudrais copier dans un feuille de calcul les adresses des cellules
sélectionnées par find et findnext.
Je suis un peu a sec car je ne vois pas ou est l'erreur au niveau du
tableau Mes_Resu

Quelqu'un peut-il m'aider ?

Merci d'avance
JM

ci dessous un exemple de mon code (désolé avec Thunderbird pas de
couleurs...)

-------------------------------------------------
Sub test()
'
Dim ExitLoop As Boolean
Dim Mes_Resu() As Variant 'allocation dynamique d'un tableau de strings
ReDim Mes_Resu(1) 'je ne sais pas pourquoi mais cela permet
d'avancer...
'
Dim ii As Integer
ii = 1
Set RechPlage = Sheets(1).Rows(31)
Set TrouveCell = RechPlage.Find(What:="RETARD", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns,
SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not TrouveCell Is Nothing Then
Set IniCell = TrouveCell
FoundAt = TrouveCell.Address(ReferenceStyle:=xlR1C1)
'
Mes_Resu(ii) = FoundAt
'
'incrementation de la recherche avec findnext
'
ii = 2
Do While ExitLoop = False
Set TrouveCell = RechPlage.FindNext(After:=TrouveCell)
If Not TrouveCell Is Nothing Then
'une seule occurence on sort de la boucle
If TrouveCell.Address = IniCell.Address Then Exit Do
'on elimine les adresses des colonnes de resultat cumulés
If (TrouveCell.Column = 87 Or
TrouveCell.Column = 148 Or TrouveCell.Column = 178 Or TrouveCell.Column
= 222 Or TrouveCell.Column = 243) Then
'comment
Else
Mes_Resu(ii) =
TrouveCell.Address(ReferenceStyle:=xlR1C1) 'cela bloque ici "l'indice
n'appartient pas a la selection", pourtant il connait bien l'indice et
le tableau est déclaré (erreur 9)??
ReDim Mes_Resu(ii)
'
End If
Else
ExitLoop = True
End If
ii = ii + 1

Loop
Else
'comment
End If
' affichage des adresses de cellules dans la feuille de calcul
Worksheets(1).Cells(50, 8).Resize(UBound(Mes_Resu, 1)) = Mes_Resu
Exit Sub

End Sub
---------------------------------------------------------------------------

---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus

4 réponses

Avatar
MichD
Bonjour,

Dans ton cas, l'indice du tableau n'existe pas dans ta
procédure. Regarde comment j'ai écris le code dans la
procédure.

Dim T()
T(1) = 5

Pour que cela fonctionne, il faut d'abord que tu définisses
ton tableau.
i=i+1
Redim T(1 to i)
T(1)=5

Si tu veux conserver ce que contient à chaque fois que tu ajoutes
un item
Redim Preserve T(1 to i)

J'utilise un tableau de base 1 parce que dans Excel, il n'y a pas
d'adresses de cellules qui débutent par 0. Cells(1,1) et non Cells(0,0)

On peut utiliser un tableau de base 0 mais lorsque vient le temps de
copier le tableau dans une feuille de calcul, il ne faut pas oublier
d'ajouter 1 à ....Resize(Ubound(t)+1)


Ta procédure devrait ressembler à ceci :

'----------------------------------------------------
Sub test()
Dim FoundAt As String, Mes_Resu(), RechPlage As Range
Dim TrouveCell As Range, i As Long, Sh As Worksheet

'Il est préférable de nommé la feuille comme cela,
'tu évites toute méprise

'Adapte le nom de l'onglet de ta feuille
Set Sh = Worksheets("Feuil1")

Set RechPlage = Sh.Rows(31)

With RechPlage
Set TrouveCell = .Find(What:="RETARD", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
End With

If Not TrouveCell Is Nothing Then
'Le (0,0)Pour afficher seulement l'adresse sans les symboles $
FoundAt = TrouveCell.Address(0, 0)

Do
'on elimine les adresses des colonnes de resultat cumulés
Select Case TrouveCell.Column
Case 87, 148, 178, 222, 243
'comment
Case Else
i = i + 1
ReDim Preserve Mes_Resu(1 To i)
Mes_Resu(i) = TrouveCell.Address(0, 0)
End Select

Set TrouveCell = RechPlage.FindNext(After:=TrouveCell)
Loop Until TrouveCell.Address(0, 0) = FoundAt
Else
'comment
End If

'A toi de décider du type d'affichage que tu désires.

'Pour afficher en colonne
Worksheets(1).Cells(50, 8).Resize(UBound(Mes_Resu)) =
Application.Transpose(Mes_Resu)

'Pour afficher en ligne
Worksheets(1).Cells(50, 8).Resize(, UBound(Mes_Resu)) = Mes_Resu

End Sub
'----------------------------------------------------
Avatar
Jieme
Le 18/02/2016 16:01, MichD a écrit :

Bonjour,

Dans ton cas, l'indice du tableau n'existe pas dans ta
procédure. Regarde comment j'ai écris le code dans la
procédure.

Dim T()
T(1) = 5

Pour que cela fonctionne, il faut d'abord que tu définisses
ton tableau.
i=i+1
Redim T(1 to i)
T(1)=5

Si tu veux conserver ce que contient à chaque fois que tu ajoutes
un item
Redim Preserve T(1 to i)

J'utilise un tableau de base 1 parce que dans Excel, il n'y a pas
d'adresses de cellules qui débutent par 0. Cells(1,1) et non Cells(0,0)

On peut utiliser un tableau de base 0 mais lorsque vient le temps de
copier le tableau dans une feuille de calcul, il ne faut pas oublier
d'ajouter 1 à ....Resize(Ubound(t)+1)


Ta procédure devrait ressembler à ceci :

'----------------------------------------------------
Sub test()
Dim FoundAt As String, Mes_Resu(), RechPlage As Range
Dim TrouveCell As Range, i As Long, Sh As Worksheet

'Il est préférable de nommé la feuille comme cela,
'tu évites toute méprise

'Adapte le nom de l'onglet de ta feuille
Set Sh = Worksheets("Feuil1")

Set RechPlage = Sh.Rows(31)

With RechPlage
Set TrouveCell = .Find(What:="RETARD", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
End With

If Not TrouveCell Is Nothing Then
'Le (0,0)Pour afficher seulement l'adresse sans les symboles $
FoundAt = TrouveCell.Address(0, 0)

Do
'on elimine les adresses des colonnes de resultat cumulés
Select Case TrouveCell.Column
Case 87, 148, 178, 222, 243
'comment
Case Else
i = i + 1
ReDim Preserve Mes_Resu(1 To i)
Mes_Resu(i) = TrouveCell.Address(0, 0)
End Select

Set TrouveCell = RechPlage.FindNext(After:=TrouveCell)
Loop Until TrouveCell.Address(0, 0) = FoundAt
Else
'comment
End If

'A toi de décider du type d'affichage que tu désires.

'Pour afficher en colonne
Worksheets(1).Cells(50, 8).Resize(UBound(Mes_Resu)) > Application.Transpose(Mes_Resu)

'Pour afficher en ligne
Worksheets(1).Cells(50, 8).Resize(, UBound(Mes_Resu)) = Mes_Resu

End Sub
'----------------------------------------------------




Bonsoir,

Un grand merci pour ton travail, je vais pouvoir avancer.
J'ai également un autre probléme, je voudrais recuperer l'index d'un
item d'une collection.
J'ai bien essayé ListIndex et aussi Liste.IndexOf(element) que je ne
connaissais pas mais cela ne marche pas...

'Boucle sur les numéros de ligne concernés
For Each Resligne In Ligne_Rech1

'recuperer le numéro de l'indice de Resligne dans la collection
Ligne_Rech1
IndOf = Ligne_Rech1.IndexOf(Resligne)
'bla bla code de traitement utilisant IndOf...
next Resligne

J'utilise Excel 2003 (je n'ai pas pu me faire aux nouvelles barres de
menus) la commande n'est peut etre pas active...

Encore merci et bonne soirée
JM


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
MichD
Bonjour,

Ceci affiche dans un msgbox chaque élément d'un tableau
'--------------------------
For Each Resligne In Ligne_Rech1
'récupérer le numéro de l'indice de Resligne dans la collection
Msgbox Resligne
Next
'--------------------------

On peut boucler différemment sur les items d'un tableau

Un tableau de base 0
'------------------
For a = 0 to Ubound(Ligne_Rech1) + 1
Msgbox Ligne_Rech1(a)
Next
'------------------

MichD
Avatar
MichD
Le 20/02/16 15:05, MichD a écrit :


Bonjour,

Ceci affiche dans un msgbox chaque élément d'un tableau
'--------------------------
For Each Resligne In Ligne_Rech1
'récupérer le numéro de l'indice de Resligne dans la collection
Msgbox Resligne
Next
'--------------------------

On peut boucler différemment sur les items d'un tableau

Un tableau de base 0
'------------------
For a = 0 to Ubound(Ligne_Rech1) + 1
Msgbox Ligne_Rech1(a)
Next
'------------------

MichD







Dim T()

'Remplir le tableau
'Et pour trouver l'item représentant le 5e du tableau

'Récupère la valeur de l'index 4 dans le tableau T
'peut générer une erreur si on demande de récupérer une valeur
'pour une position inexistante. en cas d'erreur, la procédure
'bloque sur cette ligne.
Y = Application.WorksheetFunction.Index(T, 4)

'récupère la position de la valeur 5 dans le tableau
'Génère aussi une erreur si la fonction Match ne trouve la valeur
'cherchée. En cas d'erreur, la procédure continue pas x contient une
'valeur d'erreur.
x = Application.Match(5, T, 0)

Attention, les variables y et X doivent être avoir le type variant,
car x et y peuvent contenir une valeur ou une valeur d'erreur.
dim Y as Variant
didm X as Variant