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

XL 2016 travail sur tableau

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 !

finarobert

XLDnaute Occasionnel
Supporter XLD
bonsoir
je cherche à faire deux programmes.
je possède un tableau excel avec 3 onglets : solutions, semblables et doublons (voir fichier joint)
l'onglet solutions est l'onglet de base et connu. Il n'y a que la première colonne d'alimenté. Comment est-elle construite?
Il y a des mots (voir 2726 en A1, 6746 en A184) et en dessous des paquets de 2 lignes avec la première ligne qui commence par >sp, c'est la ligne identité et une deuxième ligne qui commence par >c. Cette deuxième ligne porte les données de la ligne 1 qui comporte le mot en question (2726 en A1), on met alors ce mot en caractère gras.
onglet "semblables"
premier programme : on retrouve toutes les lignes identités qui ont au moins 2 mots dans leur ligne de données
deuxième programme : onglet doublons. Plus compliqué. le début de la ligne identité commence par une structure genre <sp IAb3DE.4 I. Deux identités sont considérés identiques sont sont considérés doublons lorsque les caractères voir exemple Ab3D sont identiques. On commence au premier caractère après la barre I et on finit à l'avant dernier caractère avant le point (D dans l'exemple)
merci pour le coup de main
Robert
 

Bonsoit Laurent. Je reprends tout car je suis un peu paumé et je me rends compte que jje n'ai pas tenu compte de Poste#1 et Poste#2. Pouvez-vous me dire la différence?
merci Laurent
Robertt
 
je me rends compte que jje n'ai pas tenu compte de Poste#1 et Poste#2. Pouvez-vous me dire la différence?
Quand on parle de "poste#1" ou "message #1" ou tout simplement "#1", ça correspond au premier message dans ce fil de discussion.
De même, "#2" correspond au deuxième message dans ce fil de discussion. Etc.
Si tu regardes en haut à droite de chaque réponse, tu verras inscrit le numéro du message. Celui-ci est le message #48.

Laurent parlait du fichier de ton message #1, mais il se trompait puisqu'il n'y a aucun fichier dans #1. Le fichier en question est dans #2.

Tout ceci est-il bien clair maintenant ?
 
Ok ! C'est clair ! Encore merci !
 
bonsoir. J'ai revu un peu tout et nettoyer mes fichiers.. Laurent 950 'ai un pb avec la macro sur l'onglet "semblables". à la main, en comptant les "semblables" dans l'onglet solution, j'en ai une cinquantaine et la macro ne m'en donne que 11. Si tu pouvais m'aider pour clore ce sjet. e mets en fichiers joints le fichier avec les onglets et un fichier où premiere colonne on voit les 11 et deuxième colonne une liste plus conséquente. Merci si tu peux y jeter un dernier oeil...cordialement Robert
 

Pièces jointes

Bonjour @finarobert

La solution se trouve dans ce post #51, via votre post #50 (ci-joint le code VBA ayant légèrement évolué).
J'ai revu un peu tout et nettoyer mes fichiers
Constat : la ligne 150 contient ni : ">sp" et "<c"
<1b2c3b212a2cb563520342bba82b547454211bb43ba5204241216b8502b46b8b515123312bc55b32c135ab2b35135c2b2bb3b53bb21b13cb2b042c3bb25cc14324647c4a0b32025a4430b4aa4
Alors ici dans le code
' Si c'est un mot
'Case Left(ligne.Value, 3) <> ">sp" And Left(ligne.Value, 2) <> "<c" ' A cause de la ligne 150 de votre fichier !
Case Left(ligne.Value, 1) <> ">" And Left(ligne.Value, 1) <> "<"
mot = Trim(ligne.Value)
reg.Pattern = mot

le code en relation avec votre fichier en poste #50

VB:
Sub Programme1Ter_Semblables_Objets()

    Dim wsSrc As Worksheet, wsDst As Worksheet
    Dim lastRow As Long, outRow As Long
    Dim reg As Object, Matches As Object, Match As Object
    Dim ligne As Range
    Dim mot As String
 
    ' Initialisation reg
    Set reg = CreateObject("VBScript.RegExp")
    reg.IgnoreCase = True
    reg.Global = True

    ' Feuilles
    Set wsSrc = ThisWorkbook.Sheets("solution")
    On Error Resume Next
    Set wsDst = ThisWorkbook.Sheets("semblables")
    On Error GoTo 0
    If wsDst Is Nothing Then
        Set wsDst = ThisWorkbook.Sheets.Add
        wsDst.Name = "semblables"
    End If

    ' Effacer l'onglet résultats
    wsDst.Cells.Clear
    wsDst.Range("A1:D1").Value = Array("Mot", "N° ligne", "Nombre", "Identité")
    outRow = 2

    ' Déterminer la dernière ligne
    lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row

    ' Boucle sur toutes les lignes de la colonne A
    For Each ligne In wsSrc.Range("A1:A" & lastRow)
        Select Case True
            ' Si c'est un mot
            'Case Left(ligne.Value, 3) <> ">sp" And Left(ligne.Value, 2) <> "<c"
             Case Left(ligne.Value, 1) <> ">" And Left(ligne.Value, 1) <> "<"
                mot = Trim(ligne.Value)
                reg.Pattern = mot

            ' Si c'est une séquence <c> précédée d'un >sp
            Case ligne.Row > 2 And Left(ligne.Value, 2) = "<c" And Left(ligne.Offset(-1, 0).Value, 3) = ">sp"
                If reg.Pattern <> "" And reg.Test(ligne.Value) Then
                    Set Matches = reg.Execute(ligne.Value)

                    ' Mise en forme dans "solution"
                    For Each Match In Matches
                        With ligne.Characters(Match.FirstIndex + 1, Match.Length).Font
                            .Bold = True
                            .Name = "Calibri"
                            .Size = 14
                        End With
                    Next Match

                    ' Reporter si plus d'une occurrence
                    If Matches.Count > 1 Then
                        wsDst.Cells(outRow, 1).Value = mot
                        wsDst.Cells(outRow, 2).Value = ligne.Row - 1         ' n° ligne identité
                        wsDst.Cells(outRow, 3).Value = Matches.Count         ' Nombres
                        wsDst.Cells(outRow, 4).Value = ligne.Offset(-1, 0).Value ' Identité
                        outRow = outRow + 1

                        ' Mise en rouge
                        For Each Match In Matches
                            With ligne.Characters(Match.FirstIndex + 1, Match.Length).Font
                                .Bold = True
                                .Name = "Calibri"
                                .Size = 14
                                .Color = vbRed
                            End With
                        Next Match
                    End If
                End If
        End Select
    Next ligne

    MsgBox "Extraction terminée. " & outRow - 2 & " résultats trouvés.", vbInformation

End Sub
 
Dernière édition:
Bonjour @finarobert

Le code qui permet de detecter :
- la ligne 150 de votre fichier Excel "etape2vbacandidat2.xlsm" en Poste #50
<1b2c3b212a2cb563520342bba82b547454211bb43ba5204241216b8502b46b8b515123312bc55b32c135ab2b35135c2b2bb3b53bb21b13cb2b042c3bb25cc14324647c4a0b32025a4430b4aa4
====================================================================================
Code 1 (Variante avec DICTIONARY)
Avec l'objet Scripting.Dictionary (Sans Module de classe associer au module standard : ExtraireObjetsSemblables_Dict)

Code:
Sub ExtraireObjetsSemblables_Dict()

    Dim srcSheet As Worksheet, destSheet As Worksheet
    Dim lastRow As Long, outputRow As Long
    Dim ligneCell As Range
    Dim dict As Object
    Dim key As String

    ' Créer le dictionnaire
    Set dict = CreateObject("Scripting.Dictionary")

    ' Feuilles source et destination
    Set srcSheet = ThisWorkbook.Sheets("solution")
    On Error Resume Next
    Set destSheet = ThisWorkbook.Sheets("semblables")
    On Error GoTo 0
  
    If destSheet Is Nothing Then
        Set destSheet = ThisWorkbook.Sheets.Add
        destSheet.Name = "semblables"
    End If
  
    ' Nettoyage de la feuille destination
    destSheet.Cells.Clear
    destSheet.Range("A1:D1").Value = Array("Mot", "N° ligne", "Nombre", "Identité")
    outputRow = 2

    ' Dernière ligne de la colonne A
    lastRow = srcSheet.Cells(srcSheet.Rows.Count, "A").End(xlUp).Row

    ' Remplir le dictionnaire
    For Each ligneCell In srcSheet.Range("A1:A" & lastRow)
        If Left(ligneCell.Value, 3) <> ">sp" And Left(ligneCell.Value, 2) <> "<c" Then
            key = CStr(ligneCell.Row)
            dict(key) = ligneCell.Value
        End If
    Next ligneCell

    ' Écrire les résultats
    Dim k As Variant
    For Each k In dict.Keys
        If Left(dict(k), 1) = ">" Or Left(dict(k), 1) = "<" Then
            destSheet.Cells(outputRow, 1).Value = dict(k)
            destSheet.Cells(outputRow, 2).Value = k
            outputRow = outputRow + 1
        End If
    Next k

    MsgBox "Extraction terminée. " & outputRow - 2 & " résultats trouvés.", vbInformation

End Sub
' ====================================================================================
Code 2 (Variante avec Collection + Module de Classe CItem)
Avec l'Objet Collection + Module de Classe CItem associer au (module standard : ExtraireObjetsSemblables)
Module de classe : CItem

Code:
' Classe CItem
Public key As String
Public Valeur As Variant
module standard : ExtraireObjetsSemblables (associer : Module de Classe CItem)
Code:
Sub ExtraireObjetsSemblables()

    Dim srcSheet As Worksheet, destSheet As Worksheet
    Dim lastRow As Long, outputRow As Long
    Dim ligneCell As Range
    Dim objItem As CItem
    Dim itemsCollection As Collection
    Dim elem As Variant

    ' Initialisation de la collection
    Set itemsCollection = New Collection
  
    ' Feuilles source et destination
    Set srcSheet = ThisWorkbook.Sheets("solution")
    On Error Resume Next
    Set destSheet = ThisWorkbook.Sheets("semblables")
    On Error GoTo 0
  
    If destSheet Is Nothing Then
        Set destSheet = ThisWorkbook.Sheets.Add
        destSheet.Name = "semblables"
    End If
  
    ' Effacer le contenu de la feuille destination
    destSheet.Cells.Clear
    destSheet.Range("A1:D1").Value = Array("Mot", "N° ligne", "Nombre", "Identité")
    outputRow = 2

    ' Déterminer la dernière ligne de la colonne A
    lastRow = srcSheet.Cells(srcSheet.Rows.Count, "A").End(xlUp).Row

    ' Boucle pour remplir la collection avec les items
    For Each ligneCell In srcSheet.Range("A1:A" & lastRow)
        If Left(ligneCell.Value, 3) <> ">sp" And Left(ligneCell.Value, 2) <> "<c" Then
            Set objItem = New CItem
            objItem.Valeur = ligneCell.Value
            objItem.key = CStr(ligneCell.Row)
            itemsCollection.Add objItem
        End If
    Next ligneCell

    ' Boucle pour écrire les résultats dans la feuille destination
    For Each elem In itemsCollection
        Set objItem = elem
        If Left(objItem.Valeur, 1) = ">" Or Left(objItem.Valeur, 1) = "<" Then
            destSheet.Cells(outputRow, 1).Value = objItem.Valeur
            destSheet.Cells(outputRow, 2).Value = objItem.key
            outputRow = outputRow + 1
        End If
    Next elem

    MsgBox "Extraction terminée. " & outputRow - 2 & " résultats trouvés.", vbInformation

End Sub
 
Dernière édition:


Merci pour votre contribution, je vois que j'ai du boulot pour relever mon niveau !
cordialement
 
- 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

Réponses
19
Affichages
696
Réponses
1
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…