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
    1. 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
      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
        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.
          0
        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+
          0
      2. Contributeur
        Je ne sais pas si tout sera juste n'ayant pas les fichiers réel mais je pense que le principe est bon.
        Nouveau classeur
        J'ai laisser un stop dans la dernière sub, avec explication.
        A+
        Toute la connaissance du monde ne peu tenir dans une seul tête (moi)
        Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
        NOTE : Je ne répond pas aux MP pour les questions techniques.
        1
        1. MERCI BEAUCOUP BEAUCOUP ! :D
          Et dire qu'avant je le faisais à la main !
          C'est vraiment génial !!!

          Juste une dernière question, quelle est la syntaxe pour que Workbooks(cormes.essai.inp) devienne Workbooks(NomFich) ? Je m'explique : dans la 3 ème sub il y a Workbooks(cormes.essai.inp) or j'aimerais que la macro reprenne le premier fichier ouvert. En effet le nom du premier fichier sera différent à chaque fois.
          J'ai essayer Workbooks(NomFich), Workbooks("NomFich"),Workbooks(NomWK & NomFich) mais sans succès...
          0
        2. C'est bon !
          J'ai réussi à m'en sortir !

          Bon je re teste tout avec différents cas et je te tiens au courant

          A+ et encore merci
          0
      3. 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
        
        0
        1. Contributeur
          Fonctionne pas ou bien génère une erreur ?
          0
          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.
            0
            1. Mais aucune erreur n'est générée
              0
          2. 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 :)
            0
            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+
              0
              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+
                0
                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+
                  0
                  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.
                    0
                    1. Contributeur
                      Alors je vais devoir modifier le classeur. Mais c'est pas un problème.
                      0
                      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
                        0
                        1. Contributeur
                          tu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
                          0
                          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 )
                            0
                            1. Ok !
                              Merci bcp pour l'aide ;)
                              0
                              1. 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+
                                0
                                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
                                  0
                              2. Contributeur
                                Non, c'est pas "très clair"
                                Rectifie sur les feuilles Excel.
                                Ensuite sauver.
                                0
                                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 ;)
                                  0
                                  • 1
                                  • 2