VBA Macro Excel

Résolu
Bonjour,

Je débute (depuis aujourd'hui) avec VBA sur excel... et ce n'est pas évident !
Voilà ce que j'aimerai faire :
J'importe un fichier texte dans excel (jusque là tout va bien).

Mes données sont des groupes d'informations :
[ ] = colonne
[A][B][C]
[Nom1]
[Spécificité1][Spécificité2][Spécificité3]
[données][ données][ données]
[données][ données][ données]
ligne vide
[Nom2]
[Spécificité1][Spécificité2][Spécificité3]
[données][ données][ données]
[données][ données][ données]
ligne vide
etc
Je voudrais que excel :
-cherche [nom1] (les noms sont toujours les mêmes mais pas forcément à la même place)
- qu'il sélectionne le groupe (tout ce qui suit jusqu'à la ligne vide suivante)
- qu'il colle la sélection dans la feuille suivante.
J'ai commencé un début de code, j'arrive à trouver [Nom1] et à le coller dans la feuille suivante mais je ne sais pas comment sélectionner et coller ce qui m'intéresse.
Merci d'avance !

28 réponses

Résumé de la discussion

La demande porte sur automatiser dans Excel via VBA l'import d'un fichier texte et l'extraction d'un bloc de données lié à un nom donné, parfois placé ailleurs. Les solutions proposées incluent des macros qui localisent le nom puis copient le bloc jusqu'à la ligne vide suivante et le collent sur une autre feuille. Certaines propositions prévoient aussi de scinder le fichier en feuilles distinctes (par exemple COORDINATES et VERTICES) pour faciliter l'import et l'organisation. Les échanges évoquent encore des méthodes pour éviter de recopier le code par nom et pour gérer l'ouverture du fichier texte.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,
    Une petite piste..
    Sub ColleSuite()
    Dim Lig As Long, Lig2 As Long
    Dim Cherch As Variant, Index As Integer
        Cherch = "Nom1"
        Index = ActiveSheet.Index + 1
        For Lig = 1 To [A65536].End(xlUp).Row
            If Cells(Lig, 1) = Cherch Then
                Lig2 = Cells(Lig, 1).End(xlDown).Row
                Rows(Lig & ":" & Lig2).Copy Sheets(Index).Range("A" & Sheets(Index).[A65536].End(xlUp).Row + 2)
                Exit Sub
            End If
        Next Lig
    End Sub
    A+
    1. Bonjour,

      merci pour ton aide !!
      Ca marche super bien pour le nom 1 (à copier dnas la feuille 2) mais quand je veux copier/coller nom2 dans la feuille 3, rien ne se passe ... :(
      Et je ne comprends pas trop pourquoi...

      Ensuite je voudrais que chaque feuille (sauf la première) s'enregistre en tant que fichier texte. J'ai vu plein de choses avec .csv mais pas .txt. Ensuite j'utilise un logiciel pour convertir les données et il n'accepte que les .txt...

      Une idée ?
      Merci

      Voilà où j'en suis pour l'instant :
      Sub Conversion()
      
          Workbooks.OpenText Filename:="C:\Users\Fabien\Desktop\Blabla.inp", Origin:= _
              xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
              , ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:= _
              False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1) _
              , Array(3, 1), Array(4, 1)), TrailingMinusNumbers:=True
          
          Sheets.Add After:=Sheets(Sheets.Count)
          Sheets("Feuil1").Name = "COORDINATES"
          Sheets.Add After:=Sheets(Sheets.Count)
          Sheets("Feuil2").Name = "VERTICES"
      
          Sheets("Blabla").Select
      
      Dim Lig As Long, Lig2 As Long
      Dim Cherch As Variant, Index As Integer
          Cherch = "[COORDINATES]"
          Index = ActiveSheet.Index + 1
           For Lig = 1 To [A65536].End(xlUp).Row
              If Cells(Lig, 1) = Cherch Then
                  Lig2 = Cells(Lig, 1).End(xlDown).Row
                  Rows(Lig & ":" & Lig2).Copy Sheets(Index).Range("A" & Sheets(Index).[A65536].End(xlUp).Row)
                  Exit Sub
              End If
           Next Lig
           
         ' La partie suivante ne mache pas : ....
          Sheets("Blabla").Select
          Cherch = "[VERTICES]"
          Index = ActiveSheet.Index + 2
          For Lig = 1 To [A65536].End(xlUp).Row
              If Cells(Lig, 1) = Cherch Then
                  Lig2 = Cells(Lig, 1).End(xlDown).Row
                  Rows(Lig & ":" & Lig2).Copy Sheets(Index).Range("A" & Sheets(Index).[A65536].End(xlUp).Row)
                  Exit Sub
              End If
          Next Lig
      
      End Sub
      
      1. Fonctionne pas bien.

        La première copie marche.
        Mais il ne se passe rien pour la copie du deuxième groupe de donnée.
        La troisième feuille reste vide.
        1. Mais aucune erreur n'est générée
      2. Contributeur
        Et inutile de réécrire la macro pour chaque mot...
        Sub Conversion()
        Dim B As Boolean
            Workbooks.OpenText Filename:="C:\Users\Fabien\Desktop\Blabla.inp", Origin:= _
                xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
                , ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:= _
                False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1) _
                , Array(3, 1), Array(4, 1)), TrailingMinusNumbers:=True
            
            Sheets.Add After:=Sheets(Sheets.Count)
            Sheets("Feuil1").Name = "COORDINATES"
            Sheets.Add After:=Sheets(Sheets.Count)
            Sheets("Feuil2").Name = "VERTICES"
        
            B = Cherch1("[COORDINATES]", 1)
            'peu tester Si retour de B = False c'est pas trouver
            B = Cherch1("[VERTICES]", 2)
        End Sub
        
        Public Function Cherch1(Ch As String, Index As Integer) As Boolean
        Dim Lig As Long, Lig2 As Long
        Dim Cherch As Variant, Index As Integer
            Cherch = Ch
            Sheets("Blabla").Select
            Index = ActiveSheet.Index + Index
             For Lig = 1 To [A65536].End(xlUp).Row
                If Cells(Lig, 1) = Cherch Then
                    Lig2 = Cells(Lig, 1).End(xlDown).Row
                    Rows(Lig & ":" & Lig2).Copy Sheets(Index).Range("A" & Sheets(Index).[A65536].End(xlUp).Row)
                    Cherch1 = True
                    Exit Function
                End If
             Next Lig
        End Function
        

        Mais vu que tu renomme les feuilles serait plus évident de mettre les noms des feuilles plutôt que leur index, si tu veux je remet le code modifier pour utiliser les noms.
        1. Oui je veux bien mais je ne comprends pas trop la différence entre l'index des feuilles et leurs noms.

          J'ai corrigé un petit truc dans le code que tu m'as donné :
          Public Function Cherch1(Ch As String, Ind As Integer) As Boolean
          Dim Lig As Long, Lig2 As Long
          Dim Cherch As Variant, Index As Integer
              Cherch = Ch
              Index = Ind
          


          Maintenant ça marche pour les copies :)
          1. Contributeur
            L'index c'est le N° d'ordre de la feuille, dépend du placement.
            sheets(Index)
            Avec le nom tu est certain d'être toujours avec la bonne feuilles.
            Sheets("VERTICES") quel que soit sa position.
            Il y a encore moyen d'optimiser ce code avec quelques renseignements supplémentaire.
            Ton fichier texte comporte combien (+-) de "Nom" ?
            Tu crée à chaque fois une nouvelle feuille ?

            Pour enregistrer tes fichiers, 1 fichier par pages ou un seul fichier ?
            Note : Peut être sauver en texte et lu en csv avec séparateur Espace
            Fini pour le moment.. Promenade
            A+
            1. Mon fichier texte comporte 28 Noms, [coordinates] et [vertices] sont les 24 et 25 ème
              Je sais pas trop comment répondre à :
              "Tu crée à chaque fois une nouvelle feuille ?"
              J'ouvre excel, je lance la macro qui ouvre mon fichier texte (1ere Feuille) et ensuite la macro crée 2 feuilles supplémentaires qui servent à la copie.

              Pour enregistrer mes fichiers, il me faudrait un fichier texte pour chaque feuille. Il me faut comme séparateur des tabulations.

              Bon j'ai un problème avec la lecture de mon fichier texte avec le logiciel de conversion... Je vais essayer de régler ça aujourd'hui mais c'est pas gagné...

              j'ai vu qu'il était possible de faire apparaitre des "boutons" mais je n'ai pas trop compris leur utilisation...
              Serait-il possible d'en faire apparaitre un pour pouvoir choisir le fichier .txt à ouvrir en début de macro ?
              Ca éviterait de toujours devoir retourner dans le code...
              Mais je sais pas si c'est possible ! :p

              J'espère que la promenade s'est bien passée

              A+
              1. Contributeur
                Très bien merci, le temps était de la partie.
                Un fichier qui fera ce que tu souhaite, du moins je crois.
                Le classeur.xls
                Je pense que tu est avec le 2007 mais il ira aussi.
                D'abord voir le code et adapter le répertoire de destination des fichiers txt à créer.
                Et aussi le séparateur de texte.
                Le reste est automatique, clic sur le bouton de la feuille 3
                C'est nécessaire de créer les feuilles Excel ?
                A+
                1. Merci

                  Je vais tester ça de suite.
                  Pour les feuilles... Je vais dire oui.
                  Les données (coordonnées par exemple) ont parfois besoin d'être pré-traitées avant la conversion.
                  1. Contributeur
                    Alors je vais devoir modifier le classeur. Mais c'est pas un problème.
                    1. Je viens d'essayer.
                      Le bouton marche très bien :) c'est exactement ce qu'il fallait
                      mais par contre les sélections sont mauvaises.
                      Je n'ai plus les bonnes données copiées.

                      J'ai essayé de réintégrer le code (pour la copie) d'avant en changeant les variables mais j'ai une erreur... la 9 l'indice n'appartient pas à la sélection

                      Et les .csv ne conservent pas la mise en forme alors que j'ai besoin que les colonnes restent des colonnes séparées par des tabulations

                      Merci d'avance
                      1. Contributeur
                        tu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
                        1. Voilà le fichier de départ :

                          http://cjoint.com/data3/3dBoeIcHTsS.htm

                          Ensuite les deux fichiers à extraire en sortie doivent ressemble à la mis en forme pour le logiciel de conversion : (Nom X Y )
                          1. Contributeur
                            OK, j'ai fais une tite erreur,..
                            Et puisque la création des fichier texte est reportée après éventuelle modif j'ai supprimer, ont verras ça après.
                            Remplace la sub...
                            Sub Conversion()
                            Dim i As Integer, Col As Integer, g As Integer, TB
                            Dim NomFich As String, ChemFich As String, Sep As String
                            Dim Lig As Long, Lig2 As Long, Txt As String, Fich As Integer
                            Dim NomFeuill As String
                                NomFich = Application.GetOpenFilename(Title:="Sélectionnez le fichier à convertir")
                                
                                If NomFich = "Faux" Then 'pas de sélection faite
                                    Exit Sub
                                End If
                                On Error GoTo Sortie
                                Workbooks.OpenText Filename:=NomFich, Origin:= _
                                    xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
                                    , ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:= _
                                    False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1) _
                                    , Array(3, 1), Array(4, 1)) ', TrailingMinusNumbers:=True
                                On Error GoTo 0
                                
                                TB = Array("COORDINATES", "VERTICES")
                                NomFeuill = ActiveSheet.Name
                                With Sheets(NomFeuill)
                                    For Lig = 1 To .[A65536].End(xlUp).Row
                                        If .Cells(Lig, 1) Like "*" & TB(i) & "*" Then
                                            Sheets.Add After:=Sheets(Sheets.Count)
                                            ActiveSheet.Name = TB(i)
                                            Lig2 = .Cells(Lig, 1).End(xlDown).Row
                                            .Rows(Lig & ":" & Lig2).Copy Rows([A65536].End(xlUp).Row)
                                            i = i + 1: If i > UBound(TB) Then Exit For
                                       End If
                                    Next Lig
                                End With
                            Sortie2:
                            Exit Sub
                            Sortie:
                            Resume Sortie2
                            End Sub

                            Les 2 feuilles devraient êtres créée
                            1. Ca marche parfaitement !
                              Merci bcp

                              Je vais essayer de faire une sub pour l'enregistrement, avec un bouton pour sélectionner l'emplacement de sauvegarde.
                            2. Contributeur
                              OK, avec le code du classeur tu devrais pouvoir te débrouiller pour créer ces fichiers.
                              Si tu n'en sort pas revient avec ton code.
                              A+
                          2. Re,

                            J'ai réussi à créer mes 2 fichiers texte avec des : "print"

                            Par contre je n'ai pas compris comment recréer un bouton gris dans la page (comme celui présent dans la Feuil3)...
                            Et comment peut-on le déplacer et choisir sur quelle feuille il sera ?

                            En fait j'aimerai créer une nouvelle macro (qui se lance en cliquant sur le deuxième bouton) qui fonctionne un peu en sens inverse :
                            une fois les fichiers texte traités, les ouvrir avec excel copier toutes les données et les mettre à la place des données du tout premier fichier texte importé, printer la feuille mise à jour et voilà.
                            Je vais essayer d'adapter le code pour que ça marche.

                            A+
                            1. C'est bon j'ai trouvé pour les boutons !

                              Par contre là où je bloque, c'est que pour ouvrir le fichier .txt il faudrait que je puisse accéder à "ouvrir et réparer" pour pouvoir définir les séparateurs (avec les flèches).
                              Le fichier.txt a plusieurs ligne d'entete qui font que les 4 premières colonnes du fichier texte sont regroupées dans la première colonne sur excel.

                              Je sais pas si c'est très clair.

                              Merci
                          3. Contributeur
                            Non, c'est pas "très clair"
                            Rectifie sur les feuilles Excel.
                            Ensuite sauver.
                            1. Une fois mes données traitées par le logiciel de conversion,
                              j'obtiens un fichier comme celui là : https://www.cjoint.com/?3dBujlqnLdO
                              En tout j'en ai 2 : Coordinates et Vertices

                              Je voudrais ensuite ouvrir ces fichiers avec excel mais avec l'assistant d'importation pour pouvoir définir moi-même les limites de colonnes.

                              Voilà le classeur avec le code: https://www.cjoint.com/?3dBuoSZ5Wyq

                              Dans la fenètre ouvrir ouverte par la macro il n'y a pas possibilité de lancer l'assistant ... (ouvrir et réparer...)

                              je pense que ça sera plus clair avec les fichiers en question ;)
                              1. Contributeur
                                Ca commence tout doucement à m'échauffer les oreilles, tu commence avec un fichier à ouvrir et traiter et maintenant ce sont d'autres fichiers, faudrait commencer à savoir quoi ???
                                Dans le classeur que tu joint y à rien ??.
                                Le fichier que tu met n'a plus rien à voir avec le précédant ??
                                Si tu veux que je continue à t'aider décortique les opérations une à une et l'une à la suite de l'autre.
                                Sinon.. j'abandonne.
                                • 1
                                • 2