Alligner des lignes en une seule en vba

Bonjour,
je suis debutante en VBA, j'ai une petit souci et ça sera trop aimable de votre part si vous pourriez m'aider:
voilà , j'ai fait une macro en vba qui me recherche une valeur dans ma feuille de calcul. En trouvant cette valeur j'aligne la ligne à laquelle elle appartient et toutes les lignes qui suivent jusqu'à ce qu'il retrouve cette valeur de nouveau, là il fait la mème opération pour m'afficher les lignes qui suivent sur une seule ligne et ainsi de suite jusqu'à la fin de ma feuille,
voilà ce que j'ai fais:

Sub postraitement()
Dim ligne As Long, lig As Long
With ActiveSheet
derlig = .Range("A65536").End(3).Row
For ligne = 1 To derlig Step 1

FirstCar = Left(Range("A" & ligne).Value, 1)

If FirstCar = "I" Or FirstCar = "M" Or FirstCar = "E" Then

PMField = Mid(Range("A" & ligne).Value, 17, 8)
'jusq'ici j'ai trouver ma valeur et je l'ai ranger dans PMField mnt il faut

'copier la 1ère ligne
'tant que ligne ++ ne contient pas PMfield, copier
'sinon retourner au début du for et grouper les lignes qui suivent sur une autre ligne

End If
Next ligne
End With
End Sub

Je bloque sur la partie partie du regroupement des lignes qui suivent la ligne avec la condition en une seule et leur affichage dans une autre feuille du classeur
Je vous remercie d'avance.
Configuration: Windows XP
Firefox 3.0.10

8 réponses

  1. Un exemple serait le bienvenu pour éclaircir ta demande.
    0
    1. Bonjour,
      voici un exemple
      J'ai des lignes de cette forme :
      ----------------------------------------------------------------------------------------------------------------------
      I8921-0150 BGA350 RB BG24 NR 950
      1884VCRV1 JA D 420
      1884VCRV1 WJ GAI FZ4 420 8921G0152
      BGA350

      ----------------------------------------------------------------------------------------------------------------------
      I8921-0151 BGA350 RB BG24 NR 950
      1884VCRVB A WJ GAI FZ5 420 8921G0152
      1884VCRVB A PA D 420
      BGA350

      ----------------------------------------------------------------------------------------------------------------------
      Chaque ligne est placée dans une seule cellule et non pas en colonnes. je cherche BGA350 , une fois je la trouve je groupe toutes les lignes qui viendront par la suite jusqu'à ce que je retrouve une deuxième BGA350. Je mets les lignes qui désormais sont groupées en une seule, dans ma 2ème feuille de calcul du mm classeur.
      Je procède ainsi jusqu'à la fin de ma première feuille
      Pour chaque ligne , avant de la grouper avec celle qui la suit, je prends 102 caractères.
      J'espère que j'etais un peu claire, mais je suis là pour tout coplement d'infos,
      merci d'avance
      0
      1. par rapport à cet exemple, quel est le résultat attendu sur la feuille 2 (2 lignes ??)

        I8921-0150 BGA350 RB BG24 NR 950 1884VCRV1 JA D 420 1884VCRV1 WJ GAI FZ4 420 8921G0152 BGA350
        I8921-0151 BGA350 RB BG24 NR 950 1884VCRVB A WJ GAI FZ5 420 8921G0152 1884VCRVB A PA D 420
        0
        1. wi c justement ça sauf qu'il faut compter 102 caractère avec de concatener une ligne avec celle qui la suit
          0
          1. voici un code fonctionnant avec l'exemple donné
            
            Sub alignement()
            
            Dim ligne As Integer
            Dim colA_source As Range
            Dim colA_destin As Range
            
            Set colA_source = ActiveSheet.UsedRange.Columns("A").Rows
            Set colA_destin = Worksheets(2).Columns("A").Rows
            
            PMField = Empty
            ligne = 0
            For Each ligne_source In colA_source
                
                If Not IsEmpty(PMField) Then
                    If ligne_source.Value <> PMField Then
                        colA_destin(ligne).Value = colA_destin(ligne).Value & ligne_source.Value & String(104, " ")
                    Else
                        PMField = Empty
                    End If
                End If
                FirstCar = Left(ligne_source.Value, 1)
                If FirstCar = "I" Or FirstCar = "M" Or FirstCar = "E" Then
                    PMField = Mid(ligne_source.Value, 12, 6)
                    ligne = ligne + 1
                    colA_destin(ligne).Value = ligne_source.Value & String(104, " ")
                End If
            
            Next ligne_source
            
            End Sub
            
            0
            1. Bonjour,
              ça marche , sauf qu'il ne prend pas en considération le 2ème BGA350 qui est juste avnt les tirets, et pui il prends mème les tirets en considération:
              exemple:
              Il prends tout ça :
              I8921-0152B BGA350 BT TV24 B FN0 NR 950 1884VCRV1 JA F 420 1884VCRVB A PA F 420 BGA350 ---------------------------------------------------------------------------------------------- I8921-0152W BGA350 BT TV24 W FN0 NR 950

              Au lieu de prendre rien que ça :

              8921-0152B BGA350 BT TV24 B FN0 NR 950 1884VCRV1 JA F 420 1884VCRVB A PA F 420
              BGA350

              En respectant que chaque ligne doit contenir 102 caractère avant de la concaténer avec celle qui la suit.

              Merci d'avance.
              0
              1. ci-joint code modifié en supposant que BGA350 est toujours le 2ème mot de la ligne commençant par I, M ou E.

                Sub alignement()
                
                Dim ligne As Integer
                Dim colA_source As Range
                Dim colA_destin As Range
                
                Set colA_source = ActiveSheet.UsedRange.Columns("A").Rows
                Set colA_destin = Worksheets(2).Columns("A").Rows
                
                PMField = Empty
                ligne = 0
                For Each ligne_source In colA_source
                    
                    If Not IsEmpty(PMField) Then
                        If ligne_source.Value <> PMField Then
                            colA_destin(ligne).Value = colA_destin(ligne).Value & ligne_source.Value & String(102 - Len(ligne_source.Value), " ")
                        Else
                            PMField = Empty
                        End If
                    End If
                    FirstCar = Left(ligne_source.Value, 1)
                    If FirstCar = "I" Or FirstCar = "M" Or FirstCar = "E" Then
                        mots_ligne = Split(ligne_source.Value, " ") 'scission ligne en mots séparés par espace
                        PMField = mots_ligne(1)
                        ligne = ligne + 1
                        colA_destin(ligne).Value = ligne_source.Value & String(102 - Len(ligne_source.Value), " ")
                    End If
                
                Next ligne_source
                
                End Sub
                0
                1. Bonjour,
                  tout dabord merci infiniment pour tes reponses, et pour l'interet que ta prété à ma demande d'infos.
                  j'ai executé le 2ème programme et ça donne une erreur "argument ou appel de procedure incorrect" sur la ligne :
                  colA_destin(ligne).Value = ligne_source.Value & String(102 - Len(ligne_source.Value), " ")

                  D'autre part, j'ai essayé de faire un programme et ça marche !! :D sauf que ça me donne un bug au niveau d'une seule ligne, le reste de la fueille s'affiche correctement et come je el souhaite, stp si tu pouvais me donner ton avis dessus
                  Voici le programme:
                  Sub postraitement()
                  Dim ligne As Long, lig As Long, ligne_sh1 As Long
                  Dim chaine As String
                  ligne_sh1 = 1
                  With ActiveSheet
                  'detecter la dernnière ligne non vide de la feuille
                  derlig = .Range("A65536").End(3).Row

                  For ligne = 1 To derlig Step 1

                  'détecter la première letter de la chaine de caractère
                  FirstCar = Left(Range("A" & ligne).Value, 1)
                  If FirstCar = "I" Or FirstCar = "M" Or FirstCar = "E" Then

                  'formattage de la ligne, recupération de la chaine utile(102 caractères)
                  chaine = Mid(Range("A" & ligne).Value, 1, 102)

                  'copier la 1ère ligne dans sheet "test"
                  Sheets("test").Cells(ligne_sh1, 1).Value = chaine

                  'récupérer les caractères 17 à 24 PMfield ( le BGA350 dans ce cas ) : Left(ligne)
                  PMField = Mid(Range("A" & ligne).Value, 17, 8)
                  lig = 1
                  toto = InStr(1, Cells(ligne + lig, 1).Value, PMField)
                  'toto renvoi 1 si la ligne contient PMfield , 0 sinon

                  'tant que ligne ++ ne contient pas PMfield (InStr),
                  While toto = 0
                  'formattage de la ligne
                  chaine = Mid(Cells(ligne + lig, 1).Value, 1, 102)
                  'copier la ligne en concaténant dans la feuille test
                  Sheets("test").Cells(ligne_sh1, 1).Value = Sheets("test").Cells(ligne_sh1, 1).Value & chaine

                  lig = lig + 1 'incrementer la boucle
                  testchaine = .Cells(ligne + lig, 1).Value
                  toto = InStr(1, PMField, testchaine)
                  'lig = lig
                  Wend

                  ligne_sh1 = ligne_sh1 + 1

                  'sinon retourner au début du for

                  End If
                  Next ligne
                  End With
                  End Sub
                  0