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

XL 2019 Supprimer ligne qui contient une valeur dans colonne

jim9595

XLDnaute Nouveau
Bonjour a tous, je cherche une formule /macro qui supprimerais automatiquement une ligne qui contient une donnée "une suite de numero"présente dans ma colonne A.
Exemple:


Colonne AColonne BColonne C
010203010203user1050809user2
030504050809user2

Dans cet exemple, la donné de la première ligne présente dans la colonne A "010203" est bien présente dans la première ligne de la colonne b "
010203user1" . Il faut donc que dans la colonne C, j'ai seulement des donnés de la colonne B ou aucune ligne ne contient la donnée de la colonne A. Dans cette exemple, j'aurais eu dans la colonne C "050809user2".

PS: j'ai des colonne avec 50 000 ligne max. Donc il faut que la formule/ macro se base sur les 50 000 ligne en colonne A et B et puisse la place en colone C sur 50 000 ligne max


Merci
 
Solution
Bonjour,

Petite adaptation, car vu le nombre de lignes, une recherche par la méthode .FIND risque de durer longtemps, je vous propose l'équivalent en recherchant dans le tableau en mémoire :

VB:
Private Sub CommandButton1_Click()
  Dim DATA(), t, u, v
  'Récupération des données
  DATA = Range("A2:C" & Application.Max(Range("A2").End(xlDown).Row, Range("B2").End(xlDown).Row)).Value
  
  For t = 1 To UBound(DATA, 1)
    If DATA(t, 1) = "" Then Exit For
    'recherche dans la colonne B de chaque valeur de la colonne A
    For u = 1 To UBound(DATA, 1)
      If CStr(DATA(u, 2)) Like CStr(DATA(t, 1)) & "*" Then
        v = v + 1
        DATA(v, 3) = DATA(u, 2): Exit For
      End If
    Next u
  Next t
  
  'Affichage des résultats...

Softmama

XLDnaute Accro
Bonjour,

cette proposition à adapter à ton problème réel, car pas certain d'avoir bien tout compris à ta demande :

VB:
Private Sub CommandButton1_Click()
  Dim DATA()
 
  ' récupération des données du Tableau
  DATA = Range("A2:C" & Range("A2").End(xlDown).Row).Value
 
  'Modification de la colonne 3 selon colonnes 1 et 2
  For t = 1 To UBound(DATA, 1)
    DATA(t, 3) = IIf(DATA(t, 2) Like "*" & DATA(t, 1) & "*", DATA(t, 3), "")
  Next
 
  'Affichage des résultats
  Range("A2").Resize(UBound(DATA, 1), 3) = DATA()
End Sub

cf. fichier joint.
Bonne soirée,
 

Pièces jointes

  • jim9595.xlsm
    20.4 KB · Affichages: 4

jim9595

XLDnaute Nouveau
Salut ! Merci pour ton retour! Je suis vraiment novice dessus donc je vais avoir un peu de mal ^^. je re explique : J'ai une 10éne de fichier excel qui dans la première colonne "A" contiens une suite de chiffre, qui sont 1fois sur 2 présente dans la colonne "B", cependant dans chaque ligne de la colonne B, celle-ci contient aussi du texte. Donc j'aimerais une formule/macro qui va supprimer automatiquement chaque ligne de la colonne b qui contient une donnée qui se trouve dans ma colonne A. Car je veux en gros avoir seulement les lignes qui ne contienne aucune donnée de la colonne A. Ou bien que le résultat de la formule soit dans la colonne C.

Je refait un exemple pour que ce soit encore plus clair:


Colonne AColonne BColonne C
00001111 utilisateur jim4444 utilisateur antoine
11114444 utilisateur antoine
22220000 utilisateur marc



Dans cette exemple, la ligne 1 et 2 dans la colonne A "0000" et "1111" sont présente dans la colonne B (ligne 1 et 3). Dans la colonne C on aura donc seulement la ligne 2 de la colonne b "4444 utilisateurs antoine" . Car la suite de chiffre '4444' ne se trouve pas dans la colonne A
 
Dernière édition:

Softmama

XLDnaute Accro
Bonsoir,

En effet, je n'avais rien compris de la demande initiale.
Voici donc une adaptation qui devrait mieux coller :

VB:
Private Sub CommandButton1_Click()
  Dim DATA(), c As Range, t, u

'Récupération des données  
DATA = Range("A2:C" & Range("A2").End(xlDown).Row).Value
 
  For t = 1 To UBound(DATA, 1)
    'Recherche de chaque élément de la colonne A dans la colonne B
    Set c = Range("B2:B" & Range("A2").End(xlDown).Row).Find(what:=DATA(t, 1), LookIn:=xlValues, lookat:=xlPart)
    'Si pas trouvé, alimente la colonne C
    If c Is Nothing Then
      u = u + 1
      DATA(u, 3) = DATA(t, 2)
    End If
  Next
 
   'Affichage des résultats
   Range("A2").Resize(UBound(DATA, 1), 3) = DATA()
End Sub

cf. fichier joint,
 

Pièces jointes

  • jim9595.xlsm
    20.8 KB · Affichages: 1

jim9595

XLDnaute Nouveau
Super je vien de tester, c'est bien cela! Par contre j'ai remarqué que le contraire et plus simple pour moi finalement! C'est a dire que si une suite de numéro de la colonne A se trouve dans une des ligne de la colonne B => alors dans la colonne C on aura toute les lignes de la colonne B qui ont une suite de chiffre se trouvant dans la colonne A.

Je refait un exemple pour que ce soit encore plus clair:


Colonne AColonne BColonne C
00001111 utilisateur jim1111 utilisateur jim
11114444 utilisateur antoine0000 Utilisateur marc
22220000 utilisateur marc



Dans cette exemple, la ligne 1 et 2 dans la colonne A "0000" et "1111" sont présente dans la colonne B (ligne 1 et 3). Dans la colonne C on aura donc la ligne 1et 3 de la colonne b " 1111 utilisateur jim" et 0000 Utilisateur marc. Car la suite de chiffre "1111" et "0000" se trouve dans la colonne A
 

Softmama

XLDnaute Accro
L'adaptation est légère :

VB:
Private Sub CommandButton1_Click()
  Dim DATA(), c As Range, t, u

'Récupération des données
DATA = Range("A2:C" & Range("A2").End(xlDown).Row).Value
 
  For t = 1 To UBound(DATA, 1)
    'Recherche de chaque élément de la colonne A dans la colonne B
    Set c = Range("B2:B" & Range("A2").End(xlDown).Row).Find(what:=DATA(t, 1), LookIn:=xlValues, lookat:=xlPart)
    si trouvé on alimente colonne C
    If Not c Is Nothing Then
      u = u + 1
      DATA(u, 3) = c
    End If
  Next
 
'Affichage résultats
Range("A2").Resize(UBound(DATA, 1), 3) = DATA()
End Sub

cf. fichier joint
 

Pièces jointes

  • jim9595.xlsm
    20.8 KB · Affichages: 1

jim9595

XLDnaute Nouveau
Merci pour votre retour.

Par contre j'ai un soucis: Jai tester votre macro pour voir si elle fonctionne correctement sans texte => Sur la colonne A j'ai pratiquement 14 000 ligne, dans la colonne B j'en ai plus de 20 000. Je sais que dans la colonne A pratiquement 13 000 sur les 14 000 ligne figure dans la colonne B. Cependant dans la colonne C je n'ai que 9000 ligne qui ressort. Apres avoir afficher les "valeur en double" excel m'indique bien que j'en ai 13 000.
Donc dans la logique dans la colonne C je devrais avoir 13 000 ligne. Ci -joint le fichier avec mes donnés pour le test.

PS: Au debut j'avais tester avec du texte en plus des chiffre dans la colonne B. Mais voyant que dans la colonne C je n'avais que 9000 ligne qui resort, sachant que 13 000 ligne sur 14 000 de la colonne A sont bien présent dans la colonne B, j'ai tester avec seulement des chiffres dans la colonne B, voir si le texte causé pas le probléme, mais le soucis est similaire
 

Pièces jointes

  • jim9595_test.xlsm
    646.1 KB · Affichages: 4
Dernière édition:

Softmama

XLDnaute Accro
Oui, logique, j’ai limité la recherche dans la colonne B au même nombre de lignes que la colonne A.

Il suffit de changer cette ligne :
Set c = Range("B2:B" & Range("A2").End(xlDown).Row).Find(what:=DATA(t, 1), LookIn:=xlValues, lookat:=xlPart)
En :

Set c = Range("B2:B" & Range("B2").End(xlDown).Row).Find(what:=DATA(t, 1), LookIn:=xlValues, lookat:=xlPart)

À tester car je ne suis pas chez moi et n’ai pas accès à un ordi.
 

Softmama

XLDnaute Accro
Bonjour,

Petite adaptation, car vu le nombre de lignes, une recherche par la méthode .FIND risque de durer longtemps, je vous propose l'équivalent en recherchant dans le tableau en mémoire :

VB:
Private Sub CommandButton1_Click()
  Dim DATA(), t, u, v
  'Récupération des données
  DATA = Range("A2:C" & Application.Max(Range("A2").End(xlDown).Row, Range("B2").End(xlDown).Row)).Value
  
  For t = 1 To UBound(DATA, 1)
    If DATA(t, 1) = "" Then Exit For
    'recherche dans la colonne B de chaque valeur de la colonne A
    For u = 1 To UBound(DATA, 1)
      If CStr(DATA(u, 2)) Like CStr(DATA(t, 1)) & "*" Then
        v = v + 1
        DATA(v, 3) = DATA(u, 2): Exit For
      End If
    Next u
  Next t
  
  'Affichage des résultats
  Range("A2").Resize(UBound(DATA, 1), 3) = DATA()
End Sub

Fichier en PJ à tester
 

Pièces jointes

  • jim9595_test.xlsm
    648.2 KB · Affichages: 3

Discussions similaires

  • Résolu(e)
Microsoft 365 Fonction excel
Réponses
7
Affichages
266
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…