VBA Macro Excel

Résolu/Fermé
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011 - 25 mars 2011 à 23:16
 F_PC - 29 mars 2011 à 16:16
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 !



A voir également:

28 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 mars 2011 à 09:03
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 mars 2011 à 11:34
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 14:28
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 14:41
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 14:51
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 29/03/2011 à 13:47
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...
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
26 mars 2011 à 11:13
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 mars 2011 à 11:22
Fonctionne pas ou bien génère une erreur ?
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
26 mars 2011 à 11:26
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
26 mars 2011 à 11:26
Mais aucune erreur n'est générée
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
26 mars 2011 à 12:17
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 mars 2011 à 12:32
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
26 mars 2011 à 17:25
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 12:44
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 13:14
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 13:23
Alors je vais devoir modifier le classeur. Mais c'est pas un problème.
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 13:33
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 13:55
tu peu déposer une fichier txt ? sur Cjoint.com et mettre le lien dans un poste suivant.
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 14:05
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 14:58
Ok !
Merci bcp pour l'aide ;)
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 19:34
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
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 20:01
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
27 mars 2011 à 20:03
Non, c'est pas "très clair"
Rectifie sur les feuilles Excel.
Ensuite sauver.
0
Fillot_PC Messages postés 18 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 28 mars 2011
27 mars 2011 à 20:16
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