Suppression de ligne dans un objet Tableau

Bonjour à tous,

Pour accélérer mon programme, j'ai enregistré toute mes valeurs dans un objet tableau. Cependant, je veux faire un tri qui supprime les valeurs hors-intervalle (intervalle défini plus tôt).

Mon problème est : comment faire pour supprimer des lignes dans mon objet tableau afin de sortir les valeurs non conformes ?

Pour l'instant j'ai fait quelque chose comme ça, qui devrait uniquement agir sur le tableau Excel mais même ça ne marche pas.

For i = NbLignes To 0 Step -1
        If mes(i, 2) <= minimum Or mes(i, 2) >= maximum
                  Rows(i).Delete
        End If
Next

Merci d'avance pour votre aide :)

Félix

Bonjour,

Un tri change juste l'ordre des données. Cela ne supprimera pas de données.

Qu'est-ce qu'un objet tableau pour toi ?

Que représente mes(i,2) ? Cells(i,2) semblerait plus correct.

Il manque le mot "then" après maximum.

Si ... alors ... sinon. If ... then... else

Pardon, ça c'est pas bien clair.

- quand je dit que je veux trier, c'est que je veux supprimer des valeurs qui ne me plaisent pas. Peut-etre que filtrer est un terme plus adapté.

- Un objet tableau, c'est, pour moi, une matrice que j'ai déclaré en Variant pour pouvoir faire mes calculs plus rapidement que si je passait par Excel.

- mes() est mon tableau / matrice, et il est dimensionné comme suit : ReDim mes(NbLignes, 5). (NbLignes correspond à mon nombre de mesures)

- Et pour le Then oublié, j'ai juste ma recopié :(

Qu'en penses-tu du coup ? Cela est plus clair ?

Oui, c'est plus clair ainsi.

À ma connaissance, on ne supprime pas de lignes d'un tableau en mémoire. Il faudrait en recréer un autre avec tes conditions restrictives. À voir si le mieux n'est pas de faire ceci dès le départ si tu n'as pas besoin à un moment d'avoir toutes les données stockées dans ton tableau.

Bonjour,

Je ne suis pas certain que ça t'aide mais au cas où, pour supprimer une ligne d'un tableau excel.

Pour supprimer la 3eme ligne par exemple :

Sheets("Feuil1").Range("Tableau1").ListObject.ListRows(3).Delete

Mais, si c'est un tableau en mémoire appelé : "Tableau Array" la manipulation est différente.

@Formatic Quelque chose comme te parait cohérent ?

For i = NbLignes To 0 Step -1
        If mes(i, 2) <= minimum Or mes(i, 2) >= maximum Then
                  mes_traitées(i, 1) = mes(i, 1)
                  mes_traitées(i, 2) = mes(i, 2)
                  mes_traitées(i, 3) = mes(i, 3)
                  mes_traitées(i, 4) = mes(i, 4)
        End If
Next

@Martial C, merci bien. Je pense que je vais me rabattre sur cette solution si ce que j'essaye de faire ne marche pas.

Dans l'idée oui.

Dans la pratique, si tu utilises i pour tes 2 tableaux, tu risques d'avoir un décalage rapidement.

Je n'ai malheureusement pas le temps de me lancer dedans en ce moment.

À voir si tes recherches sont fructueuses ou si qqn d'autre passe par ici.

Pour copier un tableau dans l'autre, il te faudra deux compteurs. car à la fin, ils n'auront pas le même nombre de lignes.

Dans l'idée :

j=0
For i = NbLignes To 0 Step -1
        If mes(i, 2) <= minimum Or mes(i, 2) >= maximum Then
                  mes_traitées(j, 1) = mes(i, 1)
                  mes_traitées(j, 2) = mes(i, 2)
                  mes_traitées(j, 3) = mes(i, 3)
                  mes_traitées(j, 4) = mes(i, 4)
                  j=j+1
        End If
Next

Bonjour,

Effectivement si c'est vraiment indispensable le transfert dans un Array plus petit est une solution. Cette opération est relativement simple si les bornes sont connues (c a d si tu peux dimensionner exactement ton Array cible avec le nombre de valeurs voulues) Sinon tu vas perdre plus de temps à Redim ton Array cible à chaque fois.

Le problème -comme d'habitude en l'absence d'autres précisions -, c'est qu'on travaille avec une boule de cristal, je ne peux que te conseiller de nous donner tout le problème plutôt que la manière dont tu envisages d'y parvenir...

Si les données que tu veux retenir sont uniques, (pas de doublons) dans ce cas au lieu de transférer tes données dans un Array intermédiaire, il semble préférable de les transférer dans un Dictionnary, encore plus rapide et qui ne nécessite pas de dimensionnement préalable.

Ensuite, le dico étant rempli on le transfère dans un Array exactement à la bonne dimension.

Ça pourrait donner quelque chose comme ça :

Sub galopin()
Dim i&, Dico, ArrC 'ArrC = "ArrayCible"
  Set Dico = CreateObject("Scripting.Dictionary")
For i = LBound(mes) To UBound(mes)
    If mes(i, 2) > minimum And mes(i, 2) < Maximum Then Dico(mes(i, 2)) = ""
Next
  ArrC = Dico.keys 'Dans un tableau ou Lbound(ArrC) = 0 et Ubound(ArrC) = Dico.count - 1
    'Attention c'est un Array en ligne pour le transférer dans le tableur il faut écrire :
    [A1].Resize(Dico.Count) = Application.Transpose(ArrC)
End Sub

Nota : On ne parle pas de Nb de Ligne dans un Array

A+

Ahhhh, "ArrC", ça m'avait manqué

'tite erreur de Copier/Colle, il y avait un Dupont qui passait par là... C'est corrigé.

A+

Bonjour,

Merci beaucoup à tout les trois pour les retours. Effectivement, la solution du Dico me parait la plus adaptée, j'en avais jamais utilisé avant. C'est l'occasion ;)

Rechercher des sujets similaires à "suppression ligne objet tableau"