Copier des donnees entre 2 balises vers Excel - VB/VBA/VBS - Programmation
Marsh Posté le 16-09-2008 à 02:11:35
Essaie peut-être avec la fonction InStr, pour rechercher la position de ta Chaine1 d'abord, puis re avec Chaine2, et enfin la différence entre les 2 ?
Marsh Posté le 16-09-2008 à 10:57:46
Merci pour cette info. Mais je n'ai pas trouve de moyen de ne selectionner que le morceau de chaine situe entre chaine 1 et chaine 2.
Mais du coup, comment faut-il ouvrir le fichier avec GetOpenfileName pour qu'il le stocke en tant que chaine?
Marsh Posté le 16-09-2008 à 11:10:34
Idoine a écrit : Essaie peut-être avec la fonction InStr, pour rechercher la position de ta Chaine1 d'abord, puis re avec Chaine2, et enfin la différence entre les 2 ? |
En gros, fais un InStr sur chaine1, stock le resultat dans la variable, tu fais de meme pour le deuxieme, puis utilise mid(text, var_chaine1, var_chaine2-var_chaine1)
Marsh Posté le 16-09-2008 à 13:32:58
Ok merci!
J'ai teste, du coup, le script suivant :
Sub LireFichierTexte()
Dim Prenom, Nom, Age
' Ouvre le fichier en lecture
CeFichier = Application.GetOpenFilename("Output Files (*.output), *.output" )
If VarType(CeFichier) = vbBoolean Then
Exit Sub
Else
Position_chaine1 = InStr(CeFichier, MACHIN2)
If Position_chaine1 = 0 Then
MsgBox ("Pas trouvé !" )
Else
MsgBox ("Trouvé à la position " & Position_chaine1)
End If
End If
End Sub
et ce en utilisant le fichier suivant :
tata,MACHIN1,24
tete,MACHIN2,25
titi,MACHIN3,26
toto,MACHIN4,27
mais ce gros malin me retourne "Trouvé à la position 1", ce qui ne me plait pas (vu que MACHIN2 est pas en position 1...).
Du coup, j'ai teste en mettant InStr(CeFichier, MACHIN2, vbTextCompare) mais la j'ai droit a un message d'erreur : "Incompatibilite de type"!
Donc je comprends pas la!
Marsh Posté le 19-09-2008 à 10:50:18
Question idiote, t'as bien mis des doubles quotes autour de MACHIN2 dans l'Instr ..?
Marsh Posté le 19-09-2008 à 11:33:59
Et si je dis non, il se passe quoi?
Je viens de faire la modif. La reponse est "pas trouve" quand je precise pas le type de comparaison et toujours le meme probleme de type quand je lui precise le vbTextCompare.
(Pour info, le script et le doc de test sont des copier-coller de ceux employes!)
Il existerait pas une commande qui me permettrait de connaitre le type de la variable CeFichier (savoir si c'est une chaine de caracteres par exemple cart si c'en est pas une, ca expliquerait bien des choses...)
En tout cas merci, j'avance petit a petit (et en plus j'apprends, que demander de plus! Ah si, je sais : un script qui fonctionne! )
Marsh Posté le 19-09-2008 à 11:54:56
J'ai reussi à faire tourner ceci :
Code :
|
Si cela peut t'aider a trouver une solution a ton probleme...
Marsh Posté le 19-09-2008 à 12:03:40
Merci, je vais tester ca (et essayer de comprendre!) des que j'aurai un peu de temps!!
Marsh Posté le 26-09-2008 à 10:26:41
Effectivement, ca marche mieux!
Mais j'ai une petite question : a quoi sert le Chr(13) (ligne 8)? Je comprends pas trop.
Puisque ca marche avec ton code, je me dis que le probleme vient de mon ouverture de fichier (bah oui, ca parait logique!).
Le truc est que je souhaiterais eviter de devoir me cogner le changement d'emplacement du fichier a chaque fois que je veux exploiter un fichier (vu qu'ils sont rarement dans le meme dossier et qu'ils ont jamais le meme nom...).
Du coup la commande GetOpen... me paraissait correspondre a mes attentes. Mais il semble que je ne puisse pas exploiter le resultat (en tout cas pas comme je l'ai fait!).
Sinon, est-il possible de stocker dans une variable l'emplacement du fichier trouve avec une commande du type Getopen (ou autre fonction me permettant de rechercher un fichier avec une commande du type "explorer" que je ne connais pas! Faut dire que je connais pas grand chose! ) et j'appelle ensuite ma variable dans ta commande open normale...
(Je sais pas si j'ai ete tres clair la )
Je continue a chercher mais suis preneur de toute idee...
Merci d'avance!
Marsh Posté le 26-09-2008 à 10:36:29
malaka a écrit : Mais j'ai une petite question : a quoi sert le Chr(13) (ligne 8)? Je comprends pas trop. |
En fait, "Chr(13)" correspond au caractere de saut de ligne, chr étant une fonction qui permet de reproduire des caracteres spéciaux (saut de ligne, tabulation...)
malaka a écrit : Le truc est que je souhaiterais eviter de devoir me cogner le changement d'emplacement du fichier a chaque fois que je veux exploiter un fichier (vu qu'ils sont rarement dans le meme dossier et qu'ils ont jamais le meme nom...). |
créé par exemple une textbox que tu rempliras avec l'adresse du fichier, et tu remplace le "Open "c:\emplacement\de\ton\texte.txt"" Par une variable Emplacement_Fichier, a laquelle tu attribueras juste avant la valeur de la textbox : Emplacement_fichier = sheets(feuille).textbox.caption
Je ne l'ai pas testé sur cette fonction, mais ca marche dans toutes celles que j'utilise...
Marsh Posté le 26-09-2008 à 13:18:06
Malaka, si tu veux avoir une boîte de dialogue intégrée de choix de fichier (genre Ouvrir), tu peux utiliser l'objet FileDialog. Tu as 4 types, Choix de fichier, Choix de dossier, Ouvrir, et Enregistrer sous.
Tu peux changer les propriétés des boîtes, les titres, dossiers par défaut, nom de bouton.
Ex pour choisir un fichier dans le dossier C:\Essai :
Code :
|
Marsh Posté le 26-09-2008 à 13:58:13
@ Idoine : Merci beaucoup pour ton code, il m'a permit d'ameliorer une de mes macros pour mon travail... Ma note de stage te remercie
Marsh Posté le 26-09-2008 à 14:01:12
Moonschild a écrit : @ Idoine : Merci beaucoup pour ton code, il m'a permit d'ameliorer une de mes macros pour mon travail... Ma note de stage te remercie |
Marsh Posté le 26-09-2008 à 14:50:50
Nickel, je vais tester ca! Merci beaucoup!
(entreverrai-je le bout du tunnel avec ce code de ******???)
Marsh Posté le 29-09-2008 à 15:36:57
Euuuuh je vais sans doute passer pour un gros blaireau, mais je n'arrive pas a utiliser ton code Idoine!
Dois-je inserer ce bout de code dans le mien ou dois-je creer un bouton dont le traitement correspond a ton code? En gros comment je fais pour l'utiliser??? (bah oui je suis un assiste et alors?)
Sincerement, je suis paume la!
Merci d'avance!
Marsh Posté le 29-09-2008 à 15:44:00
Utilise un bouton...
Au pire, si tu veux te la jouer, tu l'entre dans une fonction, et apres tu mets dans ton thisworkbook un
Application.OnKey "{F2}", "Nom_De_ta_fonction"
Comme ca au prochain demarrage, tu ouvriras la boite d'un simple coup sur la touche F2... Ca fait carrement le gourou de la macro xD (J'ai collé sur le cul mon maitre de stage avec ca moi (enfin surtout grace a idoine))
PS: as-tu rempacé le "c:\Essai\" par ton dossiers a afficher a l'ouverture de la boite de dialogue?
Marsh Posté le 29-09-2008 à 16:05:12
Merci pour cette info (au fait, le bouton, c'est un bete CommandButton? )! Mon probleme est que des que je clique sur le bouton (Cf code ci-apres), j'ai un probleme de syntaxe! Il semble ne pas connaitre la fonction "Set fdChoix as FileDialog"
Code :
|
Du coup, meme si je remplace c:\..., ca change pas grand chose, vu qu'il va pas jusque la!
Marsh Posté le 29-09-2008 à 16:31:52
Oui j'connais ca, en fait, c'est parce que ce code est fait pour aller dans le thisworkbook, du coup, vu que tu le mets ailleurs, il faut mettre application.application.... Tiens, voila mon code, pour ouvrir le dossier contenant le fichier xl qui contient la macro (attention si tu le copies, j'ai activé la multi ouverture, et je l'ai adapté pour ouvrir les .xls)
Code :
|
Apres, t'as plus qu'a le refaire a ta sauce, j'espere que cela t'aidera...
Marsh Posté le 29-09-2008 à 16:41:24
Merci, ca m'a permis de trouver la feinte! Il suffit de remplacer
Set fdChoix as FileDialog
par
Dim fdChoix as FileDialog
et apres tout fonctionne (sans avoir application.Application.File...)
Bon, essayons d'avancer dans cette macro! (Bon c'est pas gagné, je reviendrai surement poser mes questions vu que les reponses sont efficaces et pertinentes!)
Grand merci a vous deux!
Marsh Posté le 29-09-2008 à 16:42:48
N'hesite pas à reposter si tu as besoin d'aide
Bon courage pour la suite
Marsh Posté le 29-09-2008 à 17:29:40
Merci pour cette invitation! Du coup, je pose encore une question (stupide bien entendu! )
Je voudrais afficher dans une TextBox la valeur de la variable strNomFichier. Seul probleme, c'est que si je mets TextBox1.value = strNomFichier (ou TextBox1.Text =...) ca marche pas! J'ai teste de mettre le resultat dans le private sub de ma zone de texte, ca marche pas (idem si TextBox1.Value ou Text = ... se trouve dans la commande de mon bouton de choix de fichier), mais rien n'y fait!
Mon objectif etant de creer une interface utilisateur, je voulais un bouton pour choisir le fichier et afficher le chemin choisi dans une zone de texte et un bouton pour traiter le resultat.
Le probleme, c'est que, si mes souvenirs sont bons, les variables ne sont valables que dans le Sub ou elles sont definies... Puis-je les mettre au tout debut du userform pour qu'elles soient definies en global et du coup me servir dans les differents boutons, zones de texte, ... avec a chaque fois la meme valeur?
Merci!
Ou peut-etre que tout simplement il faut pas que j'utilise de zone de texte (ne servirait-elle qu'a entrer du texte et pas a en afficher??? ) mais un autre objet qui ne me vient pas a l'esprit...
Marsh Posté le 29-09-2008 à 17:36:08
Remplace le workbook.open... Par un sheets(feuille_où_y'a_la_textbox).nom_de_ta_textbox.value = strNomFichier
Comme ca la variable possede toujours la bonne valeur
Si tu veux appeler une fonction a partir d'une autre et lui injecter une valeur tu ecris "call MaFonction(variable_que_t'importe)" pour l'appel de la fonction, et tu declare la fonction en "function MaFonction(byval variable_que_t'importe as Type_de_ta_variable) "
Désolé si j'suis hors sujet ou pour les possibles fautes, étant en conf-call internationale, s'pas simple de se concentrer sur les deux en meme temps
Marsh Posté le 29-09-2008 à 17:42:04
Bah je veux bien, mais je fais comment? J'ai pas de sheets ou de workbook.open (je fais ca directement dans excel pour l'instant...)
Marsh Posté le 29-09-2008 à 17:52:26
Tout le code que je t'ai donné est a copier dans les macro vba, donc a utiliser dans le macro editor (alt+F11)...
Le plus simple, fait une textbox, puis fait un bouton sur excel, et, en mode creation, double clic sur le bouton, et copie le tout... Ensuire, dans le code, tu as vers la fin une ligne commencant par "workbook.open"... remplace la par me.textbox1.value = strNomFichier
Marsh Posté le 29-09-2008 à 17:55:25
Ok, je verrai ca demain (youhou, enfin je rentre chez moi!)
Bonne nuit (oups, pardon, c'est que c'est tard 18h pour moi!)
Bonne soiree donc...
Marsh Posté le 29-09-2008 à 17:56:16
Tres bien, a demain alors
Marsh Posté le 29-09-2008 à 20:12:32
Honte à moi pour l'erreur d'écriture, c'est ça quand on commence par écrire, puis qu'on se décide pour le copier-coller !
Erreur corrigée !
Marsh Posté le 30-09-2008 à 09:40:27
Bonjour!
Alors j'ai bien modifier le code et j'arrive enfin a afficher le nom du fichier ouvert dans ma textbox! (Ca c'est fait!)
Par contre, comment lorsque je veux utiliser mon deuxieme bouton, il connait pas ma variable de chemin vu qu'elle est definie dans un autre bouton (autre sub donc).
Comment je peux faire appelle a cette variable (pas fonction) du coup?
en plus, vu que mon userform1 est pas lie a une feuille...enfin, bref, on se comprends (enfin j'espere )
Marsh Posté le 30-09-2008 à 09:44:22
Une solution warior à la "va-y-que-j'te-pousse", c'est d'entrer la valeur de ta variable dans une cellule non visible (genre cells(500,500) ) puis de la récuperer lorsque t'appui sur ton deuxieme bouton...
Marsh Posté le 30-09-2008 à 09:59:00
Bah oui, mais je prefere faire un truc propre (et surtout independant de toute feuille excel (j'aimerais essayer de compiler ca en .exe derriere, histoire de faire un truc inbidouillable et faire chier plein de monde comme ca!
Marsh Posté le 30-09-2008 à 10:01:00
Attend, j'capte un truc... au final, tu veux aussi recuperer le chemin pour ton fichier/dossier dans ta deuxieme fonction quoi...? Si c'est le cas, pourquoi tu recuperes juste pas la valeur de ta textbox? (J'pense pas que ce soit ca, mais c'est l'impression que ton post d'avant me donne)
Marsh Posté le 30-09-2008 à 10:10:40
oh que j'ai honte de moi
Effectivement, je dois recuperer le meme chemin (donc, vu qu'il est ecrit dans la textbox, j'ai juste a stocker la valeur de cette boite!)...
Personne aurait un trou a me pretter pour que j'aille m'y cacher svp?
Bah du coup, ca marche nickel comme ca! Va falloir que je me reveille moi, ca m'evitera de me prendre la tete pour rien!
Marsh Posté le 30-09-2008 à 10:24:30
malaka a écrit : ca m'evitera de me prendre la tete pour rien! |
On en est tous plus ou moins au meme point, c'est souvent les petits détails qui nous bloquent des heures
Marsh Posté le 30-09-2008 à 10:34:07
Nouvelle question : pourquoi les icones a gauche de ma fenetre de selection de fichier ne fonctionnent-elles pas? je ne peux passer que par le menu deroulant!
(Si vous avez besoin du code, je le mets..., mais je voulais pas surcharger le post)
Marsh Posté le 30-09-2008 à 10:35:35
Etonnant, sachant que le mien fonctionne...
Une version d'excel qui gere mal ces 4 icones peu etre?
Marsh Posté le 30-09-2008 à 14:05:34
en fait, il semble que des fois ca marche et d'autres pas! Bizarre!!!
En testant mon debut de programme sur un fichier habituel, il s'avere que c'est super long (forcement, les fichiers sont tres volumineux et comme il copie toutes les lignes...).
Quelqu'un sait comment accelerer tout ca?
Sinon, faudra le decouper a la main, mais bon, je preferais eviter (bah oui, je suis tres faineant! )
Marsh Posté le 30-09-2008 à 15:08:58
A la limite, dans les conditions de ton while, rajoute un or, un truc du genre "Do While ((Not EOF(1)) and (instr(Line Input #1, "Machin_qui_delimite_la_fin_du_truc_a_copier" ) = 0)) "
Qui s'arretera a la premiere condition fausse
Marsh Posté le 30-09-2008 à 15:28:31
Oui mais ca m'arrange pas! Je m'explique : je prends un fichier que je veux exploiter. Bah la premiere ligne qui m'interesse est a la ligne 827409 et le fichier en compte 830222 au total! Donc m'arreter avant la fin n'est pas tres utile (malheureusement!)...
Desole, mais merci quand meme!
Je pense a un truc la! (miracle!!! ) : adpater ta solution a la condition suivante:
tant que je n'ai pas trouve la balise 1, je copie rien
Ca doit etre faisable ca non? Du coup, c'est juste de la lecture, ce qui prend moins de temps et je recupere ainsi directement les donnees que je veux... (Enfin, je dis peut etre des conneries la!)
Bon, comme ca devient un peu trop different de mon sujet d'origine, j'ouvre un nouveau post!
Marsh Posté le 15-09-2008 à 14:50:27
Bonjour,
Comme tout bon débutant, j'ai un petit soucis (sinon je serais pas la!).
Je souhaiterai creer une macro sous Excel qui m permette d'aller lire un fichier et de copier les données qui se trouvent entre deux chaines de caracteres donnees.
Simple me direz-vous (ou peut-etre pas!).
En fait, pour mon boulot, un logiciel genere des fichiers ".output" (histoire de compliquer le probleme, c'est pas des '.txt" ), et je souhaite ne recuperer qu'une partie de ce fichier. La seule chose bien, c'est que ce je souhaite recuperer se trouve toujours entre deux chaines de caracteres que je connais.
Un petit exemple etant toujours plus clair, mon fichier est organise comme suit:
blabla
blabla
Chaine1
donnees
donnees
Chaine2
blabla
blabla
Alors, pour commencer simplement, j'ai deja essaye d'ouvrir un fichier avec une fenetre type ouvrir et de traiter un fichier. Jusque-la j'y arrive (difficilement certes, mais bon!)!!!
Voici le code employe:
Sub LireFichierTexte()
Dim Prenom, Nom, Age
' Ouvre le fichier en lecture
CeFichier = Application.GetOpenFilename("Text Files (*.txt), *.txt" )
If VarType(CeFichier) = vbBoolean Then
Exit Sub
Else
Workbooks.OpenText Filename:=CeFichier, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=True, _
Space:=False, Other:=False, FieldInfo:=Array(1, 1)
End If
End Sub
J'ai envisage la fonction Split, mais ca devient lourd car il faut que je stocke tout le contenu de mon fichier dans une chaine... (et puis surtout, je sais pas comment extraire juste la ch&ine qui m'interesse )
Bon j'espere avoir ete clair (j'en doute mais bon, on sait jamais!)
Merci d'avance pour toute info qui me permettrait d'avancer!