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
    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. 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...
    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
  2. Contributeur
    Bon.. récapitulons,
    Au départ tu à le fichier cormes.essai.inp
    Tu copie les données qui sont sous COORDINATES pour les convertir en laissant la possibilité de le rectifier. (idem pour VERTICES)
    Tu crée le fichier.txt COORDINATES pour conversion.
    En sortie tu à le fichier COORDINATES _Z que tu réinsère à la même place dans le fichier cormes.essai.inp
    Si oui, tu m'a fait faire des cabrioles :-) pour y arriver !!
    Tu dis et je rectifie les séquences.
    1. Oui c'est exactement ça !
      :D

      "Lol" Pour les cabrioles... !
      Merci
  3. Contributeur
    Le code ci-dessus formate les fichiers _z
    Les coller dans le fichier..
    cormes.essai.inp sur la première feuille, respectivement sous [COORDINATES] et [VERTICES]
    Oui, mais juste sous les titres [COORDINATES] et [VERTICES] ou en fin de rubrique ?
    Sous [COORDINATES] et [VERTICES] les titres sont sur les colonnes A,B et C et les données sur B,C et D ?
    Où ??
    Remet les 2 fichiers [COORDINATES] et [VERTICES] .. BRUT
    ceux que tu a mis sont déjà traiter.
    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. Bonjour,

      Dans cormes.essai.inp :

      [A] [B] [C]
      [COORDINATES]
      ;Node X-Coord Y-Coord
      --- >Collez ici les données de COORDINATES_Z.txt

      [VERTICES]
      ;Node X-Coord Y-Coord
      --- >Collez ici les données de VERTICES_Z.txt

      A la place des anciennes données utilisées dans la première macro. Les données formatées dans les fichiers_Z.txt sont sur les colonnes [A] [B] [C] et doivent être collées dans les mêmes colonnes [A] [B] [C] dans le fichier cormes.essai.inp

      Les fichiers COORDINATES.txt et VERTICES.txt sont des fichiers vide à la base. Ils se remplissent avec la première macro :

      http://cjoint.com/?3dDkk47NkZS
  4. Bonsoir,

    Le lien suivant c'est un .zip avec tous les fichiers pour faire marcher la macro.
    Vous pourrez ainsi comprendre pourquoi je vous ai posé toutes ces questions !
    Il y a un fichier read me pour expliquer le déroulement et pour expliquer la suite :
    https://www.cjoint.com/?3dCvxJIqZJE
    J'espère que ça marchera chez vous.

    Merci d'avance

    A+
    1. Contributeur
      C'est le séparateur qui est modifier..
      Sub Ouvre2()
      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
      
          Workbooks.OpenText Filename:=NomFich _
              , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
              :=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, Semicolon:= _
              False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array( _
              1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, _
              1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1))
          Columns("A").Delete
          For Lig = 1 To 1000
              If Cells(Lig, 1) = "Nom" Then Exit For
          Next Lig
          Rows("1:" & Lig).Delete
        '  For Lig = 1 To [A65536].End(xlUp).Row - 1
        '      Txt = ""
        '  Next Lig
      
      End Sub

      Pour la suite, tu veux ajouter dans un fichier qui existe déjà ?
      Explique.
        1. Et juste les 3 premières colonnes m'intéressent où il y a des données (pas l'entète) :
          à partir de la ligne en desous de Nom E N jusqu'à l'avant dernière.
          Le nombre des lignes sélectionnées peut varier en fonction du tout premier fichier texte.
      1. Contributeur
        Bon, maintenant c'est plus clair, mais c'est pas possible d'enregistrer le fichier Verti_z.txt sur Cjoint, je pourrais faire un copier/coller mais c'est pas certain que les séparateurs soient correct.
        Compresse ton fichier en zip et reposte le.
        Quel sont les parties qui t'intéresse ?
        1. Ok ok ! Je m'explique :

          En fait j'ai attaqué une nouvelle macro.
          C'est la suite du projet mais je n'y avais pas réfléchi encore hier car je voulais déjà que la première marche :

          Macro 1 :
          - Ouvrir fichier texte (par ex :Network.inp)
          - Copier le groupe de données COORDINATES dans une autre feuille du même nom
          - Copier le groupe de données VERTICES dans une autre feuille du même nom
          - Extraire un fichier texte par feuille avec les noms respectifs
          - plus des petites transformations que j'ai rajouté par simplicité pour l'utilisateur

          Ca c'est bon ca marche et bcp grâce à toi !

          Ensuite je convertis les données des fichiers textes : COORDINATES.txt et VERTICES.txt avec un logiciel qui me génère 2 nouveaux fichiers textes COORD_Z.txt et VERTI_Z.txt.

          Maintenant Macro 2 (qui est en gros l'inverse de la première)
          - ouvrir les fichiers textes (et ça là que je bloque pour qu' excel respecte les colonnes (cf fichier joint précédemment : Verti_z.txt )
          - Copier les données de ces 2 fichiers textes (après les avoir épurés des en têtes et bas de page) dans le fichier de départ Network.inp en l'enregistrant Network_z.inp

          Désolé d'être confus, j'espère que c'est mieux
          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. 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
                Non, c'est pas "très clair"
                Rectifie sur les feuilles Excel.
                Ensuite sauver.
                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+
                  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
                2. 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+
                3. 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
                    tu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
                    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
                        Alors je vais devoir modifier le classeur. Mais c'est pas un problème.
                        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
                            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
                            • 2