Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Suppression d'éléments d'un tableau dynamique

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

J'ai 2 tableaux dynamiques qui n'ont pas forcément la même dimension, par ex. :
tab1 = (Pitalugue, Ernestine, Hillary, Gudule, Ursule, Cunégonde, Romina)
tab2 = (Calamity, Ernestine, Ursule, Florencia, Romina)
Je voudrais retirer de "tab1" les éléments communs avec "tab2". Autrement dit, obtenir :
(Pitalugue, Hillary, Gudule, Cunégonde).
Comment s'y prendre (en VBA) ?
 
Dernière édition:
Bonjour Magic_Doctor, le forum

Plusieurs façons de faire, on peut passer par un tableau intermédiaire:
VB:
Sub Modif_Tab1()
Dim Tab1, Tab2, Tab3, x%, y%, z%, test As Boolean
Tab1 = Array("Pitalugue", "Ernestine", "Hillary", "Gudule", "Ursule", "Cunégonde", "Romina")
Tab2 = Array("Ernestine", "Ursule", "Romina")
ReDim Tab3(0)
z = -1
For x = LBound(Tab1) To UBound(Tab1)
    test = False
    For y = LBound(Tab2) To UBound(Tab2)
        If Tab1(x) = Tab2(y) Then test = True: Exit For
    Next y
    If Not test Then
        z = z + 1
        ReDim Preserve Tab3(z)
        Tab3(z) = Tab1(x)
    End If
Next x
If z > -1 Then
    Tab1 = Tab3
    For x = LBound(Tab1) To UBound(Tab1)
        MsgBox "Valeur conservée " & x + 1 & " sur " & UBound(Tab1) - LBound(Tab1) + 1 & " : " & Tab1(x)
    Next x
Else
    Tab1 = Nothing
    MsgBox "Aucun élément ne subsiste dans Tab1", vbOKOnly + vbInformation
End If
End Sub
Bien cordialement, @+
 
re,

on peut aussi passer par un replace si le tableau est bien un array au départ

Code:
Sub Modif_Tab2()
Dim Tab1, Tab2, x%, y%, z%
Tab1 = Array("Pitalugue", "Ernestine", "Hillary", "Gudule", "Ursule", "Cunégonde", "Romina")
Tab2 = Array("Ernestine", "Ursule", "Romina")
Tab1 = Join(Tab1, "|")
y = LBound(Tab2): z = UBound(Tab2)
For x = y To z: Tab1 = Replace(Tab1, "|" & Tab2(x), ""): Tab1 = Replace(Tab1, Tab2(x) & "|", ""): Tab1 = Replace(Tab1, Tab2(x), ""): Next x
Tab1 = Split(Tab1, "|")
MsgBox UBound(Tab1) - LBound(Tab1) + 1 & " valeurs conservées : " & Join(Tab1, ", "), vbOKOnly + vbInformation
End Sub

Bien cordialement, @+
 
Dernière édition:
Réactions: cp4
Bonjour Magic_Doctor, Yeahou,

Le plus simple si les tableaux ne sont pas très grands ;
VB:
Sub Test()
Dim tab1, tab2, e, n, tab3()
tab1 = Array("Pitalugue", "Ernestine", "Hillary", "Gudule", "Ursule", "Cunégonde", "Romina")
tab2 = Array("Calamity", "Ernestine", "Ursule", "Florencia", "Romina")
For Each e In tab1
    If IsError(Application.Match(e, tab2, 0)) Then
        ReDim Preserve tab3(n)
        tab3(n) = e
        n = n + 1
    End If
Next
'---vérification---
If n Then MsgBox Join(tab3, vbLf) Else MsgBox "Pas de résultat..."
End Sub
Si les tableaux sont grands utiliser le Dictionary sera plus rapide :
VB:
Sub Test()
Dim tab1, tab2, d As Object, e
tab1 = Array("Pitalugue", "Ernestine", "Hillary", "Gudule", "Ursule", "Cunégonde", "Romina")
tab2 = Array("Calamity", "Ernestine", "Ursule", "Florencia", "Romina")
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For Each e In tab1
    d(e) = ""
Next
For Each e In tab2
    If d.exists(e) Then d.Remove e
Next
'---vérification---
If d.Count Then MsgBox Join(d.keys, vbLf) Else MsgBox "Pas de résultat..."
End Sub
A+
 
Bonjour Yeahou, job, le forum,

Merci pour vos réponses. Pas pu répondre avant.
J'ai essayé la première solution de job (le tableau n'excédera pas, à tout casser, 100 éléments) qui marche très bien.

Bonne soirée.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…