recherche chaine dans une autre, copier/coller et suppresion ligne

  • Initiateur de la discussion Initiateur de la discussion cathodique
  • Date de début Date de début

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 !

cathodique

XLDnaute Barbatruc
Bonjour,

je Voudrais effectuer une boucle de recherche (sur une colonne) du contenu des cellules.

ma feuille de calcul se présente comme suit:

n°ligneExcel---------col A--------------ColB
2-------------------G1----------------OK
"------------------- "-----------------"
68------------------X_G1-------------1200

Les données ont toujours cette structure 1 ou 2 lettres+1 chiffre ou X,Y,Z et la valeur lettres+chiffres déjà contenue dans une cellule. autres de données que peut rencontrer : GL2 et ZX_GL2.

Je voudrais donc scanner toutes les cellules de la colonne A, pour cet exemple on recherche G1, qui se retrouve en ligne 68 , on copie la donnée cellule B68 (1200) et on l'insère au contenu cellule B2 (résultat en B2:OK&1200). ensuite on supprime la ligne 68.

Ceci va me permettre de réduire le nombre de lignes de ma base de données.

Je remercie.
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonsoir cathodique,

Essayez cette macro :

Code:
Sub Supprime()
Dim d As Object, c As Range, t$
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
  If c <> "" Then
    If InStr(c, "_") Then t = Split(c, "_")(1) Else t = c
    d(t) = d(t) & IIf(d(t) = "", "", "&") & c(1, 2)
  End If
Next
[A1].Resize(d.Count) = Application.Transpose(d.keys)
[B1].Resize(d.Count) = Application.Transpose(d.items)
Range("A" & d.Count + 1 & ":B" & Rows.Count).ClearContents
End Sub
Qu'il y ait des titres ou non en ligne 1 n'a pas d'importance.

A+
 
Dernière édition:
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Re,

Les lignes supprimées avec la macro précédente ne concernent que les colonnes A et B.

S'il faut vraiment supprimer les lignes entières utiliser :

Code:
Sub SupprimeLignes()
Dim d As Object, c As Range, t$, sup As Range
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
  If InStr(c, "_") Then t = Split(c, "_")(1) Else t = c
  If Not d.exists(t) And c <> "" Then
    d(t) = c(1, 2)
  Else
    If c <> "" Then d(t) = d(t) & "&" & c(1, 2)
    Set sup = Union(IIf(sup Is Nothing, c, sup), c)
  End If
Next
If Not sup Is Nothing Then sup.EntireRow.Delete
[A1].Resize(d.Count) = Application.Transpose(d.keys)
[B1].Resize(d.Count) = Application.Transpose(d.items)
End Sub
A+
 
Dernière édition:
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonjour Job75,

je te remercie beaucoup pour tes codes, mais ce n'est pas exactement le résultat que je recherche. Tes 2 codes, concatènent et suppriment les lignes (en quelque sorte, supprime les doublons en récupérant toutes données sur une ligne).

Toutes mes excuses, mais j'ai omis de signaler qu'il peut y avoir des doublons. j'ai simplifié au maximum mon problème pour trouver une solution à adapter à mon fichier.

Dans l'exemple que j'ai donné, il peut y avoir plusieurs fois G1 en colonne A auxquelles correspondent des valeurs différentes en colonne B. Je voudrais donc faire une recherche sur toutes les cellules de la colonne A. Bon, comment expliquer cela?
- je fais un for each cel in colonne A,
- donc on part de A2=G1, on cherche G1 dans les autres cellules et si elle est trouvée (dans mon exemple à la ligne 68, la valeur est= X_G1), on met la valeur de la colonne B correspondante dans celle de la cellule de départ (ici A2) en colonne B.

Donc pour la colonne A, les cellules dont le texte (chaine string) se retrouve en fin de texte d'une autre cellule, recevra en colonne B la valeur correspondante et sa ligne sera supprimée.

Je ne maîtrise pas les fonctions chaines de caractères et je tourne en rond depuis un bon bout de temps.

Sans vouloir abuser, je joins un fichier si tu peux m'aider. En te remerciant beaucoup.
 

Pièces jointes

Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Re,

Vous n'avez pas compris mes macros, elles tiennent compte de tous les doublons.

Sur votre fichier il faut utiliser la macro SupprimeLignes.

La voici adaptée aux colonnes C et I à traiter :

Code:
Sub SupprimeLignes()
Dim d As Object, c As Range, t$, sup As Range
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("C1", Cells(Rows.Count, 3).End(xlUp))
  If InStr(c, "_") Then t = Split(c, "_")(1) Else t = c
  If Not d.exists(t) And c <> "" Then
    d(t) = c(1, 7) 'colonne I
  Else
    If c <> "" Then d(t) = d(t) & "&" & c(1, 7)
    Set sup = Union(IIf(sup Is Nothing, c, sup), c)
  End If
Next
If Not sup Is Nothing Then sup.EntireRow.Delete
[C1].Resize(d.Count) = Application.Transpose(d.keys)
[I1].Resize(d.Count) = Application.Transpose(d.items)
End Sub
Fichier joint.

A+
 

Pièces jointes

Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Rebonjour,

J'ai très bien compris votre code, mais je ne veux pas supprimer les doublons. Je pense que j'ai mal posé mon problème, débutant je ne maitrise pas le jargon des développeurs.

Dans mon premier message, j'ai donné un exemple: la cellule A2 contient= G1, G1 se retrouvera toujours en fin de chaine des lignes à supprimer - dans l'exemple G1 se trouve en fin de la chaine X_G1 à la ligne 68 et c'est cette ligne qu'il faut supprimer. et non toutes les lignes qui contiennent G1 en début de chaine.

Je galère car je ne maitrise pas du tout les fonctions chaine de caractères et encore moins les subtilités des boucles ainsi que les écritures de codes (que des erreurs).

Sur les 64 lignes initiales, après exécution de votre code il ne reste que 14 lignes (c-à-d plus de doublons), alors qu'il doit en rester 54.

Je vous remercie beaucoup pour votre réactivité et votre aide.

Cordialement,
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Re,

Alors quand il y a 3 lignes avec G1 que fait-on de chacune des 3 ?

Au post #1 vous dites bien qu'en B2 vous voulez obtenir "OK&1200" ?

Joignez un fichier montrant les résultats que vous attendez.

A+
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Re,

Bon voyez si cette macro fait ce que vous voulez :

Code:
Sub SupprimeLignes()
Dim c As Range, lig As Variant, sup As Range
Application.ScreenUpdating = False
With Range("C1", Cells(Rows.Count, "C").End(xlUp))
  .AutoFilter 1, "*_*" 'filtre automatique
  For Each c In .SpecialCells(xlCellTypeVisible)
    If c.Row > 1 Then
      lig = Application.Match(Split(c, "_")(1), .Cells, 0)
      If IsNumeric(lig) Then
        Cells(lig, "I") = Cells(lig, "I") & "&" & c(1, 7)
        Set sup = Union(IIf(sup Is Nothing, c, sup), c)
      End If
    End If
  Next
  .AutoFilter 'désactive le filtre
End With
If Not sup Is Nothing Then sup.EntireRow.Delete
End Sub
Le filtre automatique recherche les "_" en colonne C.

Au final 10 lignes sont supprimées.

Fichier (2).

A+
 

Pièces jointes

Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonsoir,

Une fois que la ligne X_G1 a été supprimée avec les autres G1 on garde les lignes telles quelles. Par mon inexpérience, je pense que je t'ai induit en erreur. Pour faire ce travail manuellement, je filtrais toujours sur la colonne D (item), à moins que l'on puisse passer outre avec les fonctions chaines de caractères. Sinon je suis vraiment désolé.

je te remercie beaucoup et te souhaite une bonne soirée.
 

Pièces jointes

Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Re,

La colonne D c'est nouveau.

Vos explications paraissent maintenant claires, pourquoi n'avoir pas tout dit dès le début ??

Code:
Sub SupprimeLignes()
Dim fin As Range, c As Range, c1 As Range, sup As Range
Application.ScreenUpdating = False
Set fin = Cells(Rows.Count, "C").End(xlUp)
For Each c In Range("C2", fin)
  If InStr(c, "_") = 0 Then
    For Each c1 In Range(c(2), fin)
      If InStr(c1, "_") Then
        If Split(c1, "_")(1) = c And c1(1, 2) = c(1, 2) Then
          c(1, 7) = c(1, 7) & " - " & c1(1, 7)
          Set sup = Union(IIf(sup Is Nothing, c1, sup), c1)
        End If
      End If
    Next
  End If
Next
If Not sup Is Nothing Then sup.EntireRow.Delete
End Sub
Fichier (3).

A+
 

Pièces jointes

Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonsoir,

Toute ma gratitude, c'est exactement ce que je recherchais. Pour la colonne D, c'est une omission (ou j'ai été brouillon).
J'ai simplifié mon problème pour avoir un code type et des explications dans un but d'apprentissage. Je me débrouille assez bien sur le tableur mais je suis nul en VBA. Au vu de ton code, je ne pense que je serais arrivé à quoi que ce soit.

je vais m'en inspirer pour essayer de récupérer les données des colonnes G et H en I.

Je te remercie beaucoup.

Bonne soirée!

Cordialement,
Cathodique
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonjour Job75,

j'ai commencé dès hier soir à essayer de comprendre ton code, je t'avoue que je n'ai pas tout saisi.
For Each c1 In Range(c(2), fin) , ici dans le range je n'ai pas compris la notation c(2). je te remercie de m'éclairer.

je me suis aperçu ce matin que sur mon fichier, j'avais fait une erreur en la ligne 2, j'avais oublié le "_" (dans FwSt2). j'ai donc corrigé et exécuté le code mais rien ne s'est passé ( la donnée devait se mettre en ligne 6 et supprimer la ligne 2). Je n'ai pas compris pourquoi.

J'ai retenu qu'on faisait une recherche du caractère "_", mais pour les lignes suivantes je n'ai pas compris grand chose:

If Split(c1, "_")(1) = c And c1(1, 2) = c(1, 2) Then que signifie (1) à la fin du split et que représente c1(1,2) et c(1,2)
c(1, 7) = c(1, 7) & " - " & c1(1, 7)
Set sup = Union(IIf(sup Is Nothing, c1, sup), c1

J'espère que je n'abuse pas trop, mais je voudrais comprendre.

Je te remercie beaucoup.

Bonne journée!
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonjour cathodique,

J'ai donc comme vous le désirez modifié la cellule C2 dans le fichier (4) ci-joint.

Et dans la macro j'ai remplacé :

Code:
For Each c1 In Range(c(2), fin) 'étude sous la cellule c
par :

Code:
For Each c1 In Range("C2", fin) 'étude à partir de C2

Quelques explications :

1) Il faut savoir que la cellule c peut aussi s'écrire c(1) ou c(1, 1).

Si l'on écrit c(2) ou c(2, 1) c'est la cellule immédiatement en dessous de c qui est traitée.

Si l'on écrit c(1, 7) c'est la 7ème cellule à droite de c qui est traitée (en comptant c).

2) Split(c1, "_") crée la collection des éléments qui dans c1 sont séparés par "_".

Split(c1, "_")(0) c'est le 1er élément, Split(c1, "_")(1) c'est le 2ème élément.

Voyez l'aide VBA sur Split.

A+
 

Pièces jointes

Dernière édition:
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Bonjour Job75,

Encore une fois toute ma gratitude. Maintenant, c'est beaucoup plus clair. Je vous assure que j'ai consulté l'aide VBA sur Split et pour moi qui découvre le VBA, ne m'a été d'une grande utilité. ça viendra peut-être avec de la persévérance.

Je t'en remercie.

Cordialement,
Cathodique
 
Re : recherche chaine dans une autre, copier/coller et suppresion ligne

Rebonjour,

Au risque de vous paraître embêtant, j'ai une dernière question à vous poser. Mais avant cela voici les explication de l'aide VBA que je ne trouve pas très riche:
Split, fonction
Description: Renvoie un tableau de base zéro à une dimension contenant le nombre spécifié de sous-chaînes.
Syntaxe: Split(expression[, delimiter[, limit[, compare]]])

2) Split(c1, "_") crée la collection des éléments qui dans c1 sont séparés par "_".
Vous m'expliquez que "Split" crée la collection des éléments séparés par "_". Quelle aurait été la solution s'il n'y avait pas "_" (ex: G1 et XG1) ou des codes différents comme DL2 et YZDL2, mais ayant toujours la même structure (Début se trouve à la fin de la chaine)?

Tous mes remerciements.

Cordialement,
Cathodique
 
- 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

Discussions similaires

Retour