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 !
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.
-
ContributeurJe 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.-
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... -
-
-
ContributeurBon.. 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.
-
ContributeurLe 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.-
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
-
-
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+ -
ContributeurC'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.
-
Verti_Z.txt : https://www.cjoint.com/?3dBwqvovT5o
-
ContributeurBon, 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 ?
-
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 -
ContributeurCa 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. -
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 ;) -
ContributeurNon, c'est pas "très clair"
Rectifie sur les feuilles Excel.
Ensuite sauver. -
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+-
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
-
-
Ok !
Merci bcp pour l'aide ;) -
ContributeurOK, 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
-
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 ) -
Contributeurtu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
-
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 -
ContributeurAlors je vais devoir modifier le classeur. Mais c'est pas un problème.
-
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. -
ContributeurTrè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
Suivant