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 Function

En 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 Sub

Ai-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 Function

ou

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 Sub

Ceuzin

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 Sub

Ceuzin

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

Rechercher des sujets similaires à "supprimer ligne tableau dimensions"