Supprimer une ligne dans un tableau à 2 dimensions
Bonjour à tous,
Je sais qu'il y a pas mal de question redondante à ce sujet, mais malgré tout ce que j'ai pu lire ici ou là j'avoue que je suis toujours coincé.
Voila mon problème:
J'ai un tableau TErreur à 2 dimensions (3,x), déclaré en variable globale. Aucun soucis au chargement.
Au fur et à mesure que je traite les erreurs, je souhaite supprimer l'entrée correspondante de mon tableau.
Mais lorsque que je souhaite faire un Redim Preserve TErreur(Ubound(TErreur,1),Ubound(TErreur,2)-1) j'ai systématiquement le code erreur "9" avec le message "l'indice n'appartient pas à la sélection".
Je précise que je travaille en Base 1
Function Suppression_Erreur(Index As Integer) As Boolean
Dim i As Integer
If UBound(TErreur, 2) = 1 Then ' Quelque soit la valeur de Index, s'il n'y a plus qu'un élément, je vide le tableau
Erase TErreur
i = 0
Else
If Index < UBound(TErreur, 2) Then ' Si Index ne pointe pas sur le dernier élément du tableau
For i = Index To UBound(TErreur, 2) - 1 'Je boucle pour faire remonter mes enregistrements d'une position
TErreur(1, i) = TErreur(1, i + 1)
TErreur(2, i) = TErreur(2, i + 1)
TErreur(3, i) = TErreur(3, i + 1)
Next i
Else
i = Index
End If
End If
If i > 0 Then
ReDim Preserve TErreur(UBound(TErreur, 1), UBound(TErreur, 2) - 1) 'C'est ici que ça bloque. L'erreur survient au moment dimensionnement du tableau
Suppression_Erreur = True
Else
Suppression_Erreur = False
End If
End FunctionEn espérant que vous puissiez m'aider à trouver une solution, même pendant cette période festive qui nous pousse à quitter nos écrans ^^
J'espère à bientot
Bonjour et bienvenu,
Attends un peu. Comment ta fonction reconnaitra-t-elle la variable TErreur si tu ne transmets pas par l'appel de ta fonction ? Est-ce une variable Globale ? Pour être complet, transmets-nous quand même ton fichier qui va avec. On pourra ainsi tester.
Ah pardon j'ai en effet oublié de préciser que TErreur() est une variable globale, utilisée dans le seul module existant.
J'étais contraint de faire ainsi pour l'instant afin de pouvoir l'utiliser dans mes Userform
Ça va être compliqué de vous envoyer le fichier car il contient des informations sensible.
Je vais voir ce que je peux isoler/anonymiser
Bonjour Raja, Fox_Dox, le forum
Je ne comprends pas ce que tu souhaites faire
Mais quand je lis le titre de ton post, je comprends que tu veux supprimer certains éléments d'une variable tableau.
La fonction Filter sert à ça.
Ici, un exemple basique, après on peut renvoyer un tableau à 2 dimensions via Filter.
Sub test()
x = Application.Transpose(Columns(1).SpecialCells(2))
y = Filter(x, "banane", False)
z = Filter(x, "banane", True)
End SubAi-je compris le problème.
klin89
Bonjour,
Exemple de suppression de lignes dans un Array 2D
Sub SupLignesColCle()
a = [A2:D7].Value
a = SupArrayLignes(a, 3, "Issy")
[G2].Resize(UBound(a), UBound(a, 2)).Value2 = a
End Sub
Function SupArrayLignes(Tbl, col, cle)
deb = LBound(Tbl) : fin = UBound(Tbl)
cold = LBound(Tbl, 2) : colf = UBound(Tbl, 2)
For i = LBound(Tbl) To UBound(Tbl)
If Tbl(i, col) <> cle Then n = n + 1
Next i
Dim t(): ReDim t(LBound(Tbl) To LBound(Tbl) + n - 1, cold To colf)
j = LBound(Tbl)
For i = deb To fin
If Tbl(i, col) <> cle Then
For k = cold To colf: t(j, k) = Tbl(i, k): Next k
j = j + 1
End If
Next i
If n> 0 Then
SupArrayLignes = t()
Else
Dim a(): ReDim a(1 To 1, cold To colf)
SupArrayLignes = a()
End If
End Functionou
Sub SuppressionLignesCle()
a = [A2:D7].Value
Dim tmp(): ReDim tmp(1 To UBound(a))
For i = LBound(a) To UBound(a)
If a(i, 3) <> "Issy" Then n = n + 1: tmp(n) = i
Next
ReDim Preserve tmp(1 To n)
a = Application.Index(a, Application.Transpose(tmp), _
Application.Transpose(Evaluate("Row(1:" & UBound(a, 2) & ")")))
[g2].Resize(UBound(a), UBound(a, 2)) = a
End SubCeuzin
Bonjour à tous et merci pour vos aides
En effet, ce que je souhaite faire c'est bien supprimer une ligner de mon Array. Donc merci pour vos exemples, je vais les essayer aujourd'hui.
Mais au delà de cela, je cherchais à comprendre pourquoi mon code ne fonctionnait pas.
Car bizarrement la method Redim (que ce soit pour aggrandir ou réduire le tableau) me sort une erreur, en tout cas pas sur ma variable TErreur() -- Pour rappel il est global.
En déclarant un nouveau tableau localement aucun soucis.
ceuzin a écrit :Sub SuppressionLignesCle() a = [A2:D7].Value Dim tmp(): ReDim tmp(1 To UBound(a)) For i = LBound(a) To UBound(a) If a(i, 3) <> "Issy" Then n = n + 1: tmp(n) = i Next ReDim Preserve tmp(1 To n) a = Application.Index(a, Application.Transpose(tmp), _ Application.Transpose(Evaluate("Row(1:" & UBound(a, 2) & ")"))) [g2].Resize(UBound(a), UBound(a, 2)) = a End SubCeuzin
J'ai utilisé ta solution cette solution et cela fonctionne très bien merci
J'essaierai de trouver ce qui faisait planter plus tard
Merci à tous