VBA Macro Excel

Résolu
Fillot_PC Messages postés 18 Statut Membre -  
 F_PC -
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

  • 1
  • 2
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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Fillot_PC Messages postés 18 Statut Membre
       
      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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. F_PC
       
      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. F_PC
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fillot_PC Messages postés 18 Statut Membre
     
    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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Fonctionne pas ou bien génère une erreur ?
    0
  8. Fillot_PC Messages postés 18 Statut Membre
     
    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. Fillot_PC Messages postés 18 Statut Membre
       
      Mais aucune erreur n'est générée
      0
  9. Fillot_PC Messages postés 18 Statut Membre
     
    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
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  11. Fillot_PC Messages postés 18 Statut Membre
     
    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
  12. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  13. Fillot_PC Messages postés 18 Statut Membre
     
    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
  14. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Alors je vais devoir modifier le classeur. Mais c'est pas un problème.
    0
  15. Fillot_PC Messages postés 18 Statut Membre
     
    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
  16. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    tu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
    0
  17. Fillot_PC Messages postés 18 Statut Membre
     
    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
  18. Fillot_PC Messages postés 18 Statut Membre
     
    Ok !
    Merci bcp pour l'aide ;)
    0
  19. Fillot_PC Messages postés 18 Statut Membre
     
    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. Fillot_PC Messages postés 18 Statut Membre
       
      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
  20. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Non, c'est pas "très clair"
    Rectifie sur les feuilles Excel.
    Ensuite sauver.
    0
  21. Fillot_PC Messages postés 18 Statut Membre
     
    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