XL 2010 Supprimer ligne tableau 1 dimension

cp4

XLDnaute Barbatruc
Bonjour,

Je sèche sur un problème. Je me suis inspiré d'un exemple de Boisgontier pour supprimer d'un tableau 2 dimensions des lignes suivants une clé.
J'ai rectifié le code pour l'utiliser avec un tableau à une dimension. Cependant, le code plante si c'est le premier item qu'on souhaite supprimer.
Pour les autres le code fonctionne correctement. Auriez-vous une explication, une solution?
VB:
Option Explicit

Sub supLigne()
   Dim choix(), i As Integer, j As Integer, n As Integer, clé
   choix = [a1].CurrentRegion.Value
   clé = [e1]
   n = 0
   For i = LBound(choix) To UBound(choix)
      If choix(i, 1) <> clé Then n = n + 1
   Next i
   j = 0
   Dim T(): ReDim T(1 To n, 1 To 1)
   For i = LBound(choix) To UBound(choix)
      If choix(i, 1) <> clé Then j = j + 1
      T(j, 1) = choix(i, 1)
   Next i
   [c1].Resize(UBound(T)) = T
End Sub
1587813264669.png

En vous remerciant par avance.
 

Pièces jointes

  • Supprimer Ligne clé.xlsm
    16.1 KB · Affichages: 28

cp4

XLDnaute Barbatruc
Bonjour Herve62,

Merci pour ton retour. L'image est parlante. As-tu essayé de supprimer la première du tableau (148,001)?
Sinon pourquoi n'utilises tu pas la structure de JB .... une sub qui utilise une fonction ?
J'en ai trouvé plusieurs mais pas une, ne traite de tableau 1D que 2 D. J'ai eu beau adapter ça ne fonctionne pas.

Merci quand même.

Bon week-end.
 

ChTi160

XLDnaute Barbatruc
Bonjour cp4
Bonjour le Fil ,le Forum

je sais pas si j'ai compris Lol
mais ceci fonctionne
VB:
For i = LBound(choix) To UBound(choix)
      If choix(i, 1) <> clé Then 'l'erreur je pense était à ce niveau
'                                                 "If choix(i, 1) <> clé Then  j = j + 1
      j = j + 1
      T(j, 1) = choix(i, 1)
      End If
   Next i
Edit : Salut particulier à pierrejean
jean marie
prenez soi de vous !
 

jmfmarques

XLDnaute Accro
Bonjour cp4 et herve62
analyse ton code (celui montré) et comprends ce qui se passe avec ce code
au départ : j = 0
j ne s'incrémente que si valeur parcourue <> valeur cherchée
et si donc la valeur cherchée est trouvée dès le début, j reste = 0
et donc :
T(j, 1) = choix(i, 1)
ne peut qu'être insensé, l'indice 0 de T n'existant pas.
 

cp4

XLDnaute Barbatruc
Bonjour cp4
Voici comment j'aurai traité ton problème
Comme je ne fais pas partie des ayatollahs de l'option explicit je l'ai supprimée
Bonjour PierreJean:),
C'est le top. Pour moi c'est plus que parfait. J'essaie de me perfectionner avec ces fameux arrays qui font gagner pas mal de temps. Mais qu'il faut bien maitriser. J'avoue que j'ai du mal.
En tout cas merci beaucoup, tes 2 codes vont aller direct dans mes archives (quoique, je suis brouillon:oops:). Je vais les étudier à tête reposée.

Bonne soirée.
 

cp4

XLDnaute Barbatruc
Bonjour cp4 et herve62
analyse ton code (celui montré) et comprends ce qui se passe avec ce code
au départ : j = 0
j ne s'incrémente que si valeur parcourue <> valeur cherchée
et si donc la valeur cherchée est trouvée dès le début, j reste = 0
et donc :
T(j, 1) = choix(i, 1)
ne peut qu'être insensé, l'indice 0 de T n'existant pas.
Bonsoir jmfmarques:),
En effet, j'ai remarqué que "j" était nul dès le début et du coup ça planté.
Comme je ne maitrise pas parfaitement les tableaux, je me suis perdu.

Merci beaucoup.

Bonne soirée.

ps: on dirait que Chti160 a disparu;););)
 

cp4

XLDnaute Barbatruc
Bonjour cp4
Bonjour le Fil ,le Forum

je sais pas si j'ai compris Lol
mais ceci fonctionne
VB:
For i = LBound(choix) To UBound(choix)
      If choix(i, 1) <> clé Then 'l'erreur je pense était à ce niveau
'                                                 "If choix(i, 1) <> clé Then  j = j + 1
      j = j + 1
      T(j, 1) = choix(i, 1)
      End If
   Next i
Edit : Salut particulier à pierrejean
jean marie
prenez soi de vous !
Bonsoir Chti160 ;),
Merci pour ton aide. Je vais revoir mon code en y apportant ta suggestion.
Bonne soirée.

edit: @ChTi160 :cool: dans le 1000, c'était ma grossière erreur. 1000 mercis.
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re @tous !!
J'étais aussi sur la recherche car j'ai vu après que j=0 et que T(0) .... ça va pas
Mais comme moi aussi je ne maîtrise pas bien les tableaux , les trucs que j'essayais n'allaient pas !!!!
et au + simple je n'y ai pas pensé comme JM !!!
Bon WE :cool: ici dans le 62 toujours soleil depuis 3sem !!!!!
 

cp4

XLDnaute Barbatruc
Re @tous !!
J'étais aussi sur la recherche car j'ai vu après que j=0 et que T(0) .... ça va pas
Mais comme moi aussi je ne maîtrise pas bien les tableaux , les trucs que j'essayais n'allaient pas !!!!
et au + simple je n'y ai pas pensé comme JM !!!
Bon WE :cool: ici dans le 62 toujours soleil depuis 3sem !!!!!
Re,
@herve62
Merci pour ton intérêt. En effet, quand on ne maitrise pas bien on est vite perdu.
PierreJean a vraiment déduit ce que je voulais faire, supprimer les 3 données de la colonne E de la colonne A (pas de la feuille mais du tableau).
J'étais tellement perdu que j'avais orienté mes recherches vers les dictionnaires. D'après ce que j'ai pu lire on peut cibler directement la clé et la supprimer avec dico.remove (clé).
Entre l'avoir lu et l'appliquer...

Aujourd'hui en ile-de-France temps ensoleillé aussi.

Bonne soirée.
 

job75

XLDnaute Barbatruc
Bonjour cp4, le fil,

Le code du post #1 est inutilement lourd, on peut se passer du tableau T :
VB:
Sub supLigne()
Dim choix, clé, i As Long, n As Long
choix = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
clé = [E1]
For i = 1 To UBound(choix)
      If choix(i, 1) <> clé Then n = n + 1: choix(n, 1) = choix(i, 1)
Next i
[C:C].ClearContents
[C1].Resize(n) = choix
End Sub
A+
 

cp4

XLDnaute Barbatruc
Bonjour cp4, le fil,

Le code du post #1 est inutilement lourd, on peut se passer du tableau T :
VB:
Sub supLigne()
Dim choix, clé, i As Long, n As Long
choix = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
clé = [E1]
For i = 1 To UBound(choix)
      If choix(i, 1) <> clé Then n = n + 1: choix(n, 1) = choix(i, 1)
Next i
[C:C].ClearContents
[C1].Resize(n) = choix
End Sub
A+
Merci beaucoup Job75. La classe a l'état pure.

Bonne soirée.
 

job75

XLDnaute Barbatruc
S'il y a plusieurs clés en E1 E2 E3 etc on peut utiliser le Dictionary :
VB:
Sub supLigneClésMultiples()
Dim d As Object, clé As Range, choix, i&, n&
'---liste des clés à supprimer---
Set d = CreateObject("Scripting.Dictionary")
For Each clé In [E1].CurrentRegion
    d(clé.Value) = ""
Next
'---traitement du tableau---
choix = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
For i = 1 To UBound(choix)
      If Not d.exists(choix(i, 1)) Then n = n + 1: choix(n, 1) = choix(i, 1)
Next i
'---restitution---
[C:C].ClearContents
[C1].Resize(n) = choix
End Sub
La macro est très rapide.
 

Pièces jointes

  • Supprimer Ligne clé(1).xlsm
    19.1 KB · Affichages: 6

Discussions similaires

Réponses
11
Affichages
280
Réponses
7
Affichages
322