Prendre des données dans un fichier actif.

Prendre des données dans un fichier actif. - VB/VBA/VBS - Programmation

Marsh Posté le 06-07-2006 à 10:15:07    

:hello:  Bonjour à tous,
j'ai fait une recherche mais j'ai rien trouvé de concret.
 
Je dois faire un programme en VBA sous excel qui doit, selon ce qu'il y a dans un fichier précédement ouvert avec le programme (on l'appellera "A" ), récupérer des données dans un autre fichier (appellons le "B" ).
Le problème est que le fichier B se trouve dans une base de donnée.
Pour me faciliter la vie et pour faciliter celle des prochains utilisateurs, j'aimerai pouvoir demander l'ouverture d'un fichier B et récupérer ses données dès son activation.

Pouvez-vous m'aider, s'il vous plaît, à trouver un code qui puisse prendre le nom par exemple du fichier actif et pouvoir le traiter sans lenteur?

 
Je sais pas si je suis très clair, alors je vais résumer en schématisant avec des étapes :
 
1°) demande d'ouverture du fichier A (qui se trouve dans le PC).
 
2°) vérification de celui ci.
 
3°) demande d'ouverture d'un fichier B (sur la base de donnée ou autre part).
 
4°) dès son activation, prendre son nom pour pouvoir le traiter.
 
5°) Prendre donnée d'u fichier B.

Reply

Marsh Posté le 06-07-2006 à 10:15:07   

Reply

Marsh Posté le 06-07-2006 à 10:18:55    

As-tu besoin d'aide sur les 5 étapes que tu nous a citées ou bien seulement sur celles en gras ?
pour le nom d'un fichier tu as activeworkboook.name qui te retourne le nom du fichier...
on peut t'aider sur tous les points, mais tu veux automatiser le tout ? passer par un formulaire ou juste sur un clic de bouton ?? ton fichier B sera-t-il toujours le meme (meme nom) ? etc...

Reply

Marsh Posté le 06-07-2006 à 12:05:06    

voici un lien ou tu trouveras pas mal de réponses :
http://www.excelabo.net/xl/fichiers.php

Reply

Marsh Posté le 06-07-2006 à 14:11:59    

Salut Jp, salut Damien.
Merci pour vos réponse déjà. Jp je veux juste de l'aide sur l'étape 4 et 5.
J'ai déjà une boite de dialogue qui me demande donc d'ouvrir le fichier A et ensuite j'ai une autre boite qui me demande d'ouvrir un fichier B.
Ca serait plus simple si mon fichier B porte toujours le même nom mais le truc c'est qu'il n'a pas toujours ce nom et qu'en plus il ne se trouve pas sur le PC de l'utilisateur.
L'utilisateur va ouvrir ce fichier dans une BD et j'aimerai alors qu'à l'ouverture, je récupère le nom.
 
D'ailleur j'avais essayer avec activeworkbook, mais ça me donne le nom du fichier A et non du B.
 
Damie, Excellabo j'ai essayé mais j'ai du mal chercher car je n'ai rien vu.

Reply

Marsh Posté le 06-07-2006 à 14:17:05    

pour l'active workbook, tu dois l'utiliser une fois ton fichier B chargé, tu fais un minimize de ta fenetre de fichier A, et là tu auras le fichier B normalement. La fonction (dont je n'ai pas le nom sous la main) qui sert à faire appel à un explorateur de fichier s pour sélectionner le fichier B te retourne le nom du fichier... non ?

Reply

Marsh Posté le 06-07-2006 à 14:18:05    

pour le nom tu peux aussi utiliser : Workbooks(x).Name
donc Workbooks(1).Name pour le fichier A et Workbooks(2).Name pour le fichier B à condition que tu n'ai que ces deux fichiers d'ouvert
 

Reply

Marsh Posté le 06-07-2006 à 15:13:45    

jpcheck a écrit :

pour l'active workbook, tu dois l'utiliser une fois ton fichier B chargé, tu fais un minimize de ta fenetre de fichier A, et là tu auras le fichier B normalement. La fonction (dont je n'ai pas le nom sous la main) qui sert à faire appel à un explorateur de fichier s pour sélectionner le fichier B te retourne le nom du fichier... non ?


 
Un minimize du fichier A? Oui mais ça risque d'être un peu risqué si l'utilisateur a plusieurs fichiers d'ouverts, non? Pour l'explorateur je peux l'utiliser pour le fichier A mais pas pour le B car le B est sur BD.
 

DamienCYS a écrit :

pour le nom tu peux aussi utiliser : Workbooks(x).Name
donc Workbooks(1).Name pour le fichier A et Workbooks(2).Name pour le fichier B à condition que tu n'ai que ces deux fichiers d'ouvert


 
Je vais peut-être essayer ça. Mais par-contre c'est le même problème il faut pas en avoir plusieurs d'ouverts.
 
 
Une chose aussi : Comment prendre le nom du fichier B au bon moment?
Si j'envois une Msgbox et que je prends tout de suite le workbook(2) je risque d'avoir une erreur si l'utilisateur ne l'ouvre pas tout de suite.
J'ai essayé avec une boucle qui tourner tant que le nom du fichier B ne changeait pas mais ça fait ramer le programme.
 

Reply

Marsh Posté le 06-07-2006 à 15:19:24    

Tu listes tous les fichiers ouverts dans une listbox, et tu demandes à ton utilisateur de cliquer sur le fichier B.
==> Pas d'erreur à l'activation et nom du fichier B connu.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-07-2006 à 15:23:56    

Et en mettant un évenement à l'ouverture du fichier B pour qu'il envoi son nom au fichier A
 
Private Sub Workbook_Open()
  Application.Run "'Fichier A.xls'!PasserNom" ThisWorkbook.name
End Sub
 
et dans la fonction PasserNom appartenant à fichier A tu récupèrer le nom, à voir s'il ne faut vérifier avant si fichier A est ouvert sinon tu ne pourras pas ouvrir Fichier b sans fichier a

Reply

Marsh Posté le 06-07-2006 à 15:32:28    

JihemAir a écrit :

Tu listes tous les fichiers ouverts dans une listbox, et tu demandes à ton utilisateur de cliquer sur le fichier B.
==> Pas d'erreur à l'activation et nom du fichier B connu.


 
Salut JMR,
Pas bète ça. Mais alors comment faire pour lister tous les noms des fichiers ouverts? Et à quel moment? Il faudrait que la macro bloque sur cette fonction parce que si l'utilisateur ne l'ouvre pas tout de suite ça va tourner en rond.
 

DamienCYS a écrit :

Et en mettant un évenement à l'ouverture du fichier B pour qu'il envoi son nom au fichier A
 
Private Sub Workbook_Open()
  Application.Run "'Fichier A.xls'!PasserNom" ThisWorkbook.name
End Sub
 
et dans la fonction PasserNom appartenant à fichier A tu récupèrer le nom, à voir s'il ne faut vérifier avant si fichier A est ouvert sinon tu ne pourras pas ouvrir Fichier b sans fichier a


 
Pas bète non plus mais le fichier doit pouvoir être ouvert sans le fichier A. Donc je ne pense pas que ce soit la bonne solution (en plus j'ai 38 fichiers B... Si je dois rajouter un bout de code à chacun ça va être long).
 

Reply

Marsh Posté le 06-07-2006 à 15:32:28   

Reply

Marsh Posté le 06-07-2006 à 15:35:26    

Tu peux créer une macro complémentaire, avec un bouton dans la barre des tâches, il est tjs présent dès que Excel est ouvert. L'utilisateur lance la macro si besoin en cliquant dessus.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-07-2006 à 15:55:09    

JihemAir a écrit :

Tu peux créer une macro complémentaire, avec un bouton dans la barre des tâches, il est tjs présent dès que Excel est ouvert. L'utilisateur lance la macro si besoin en cliquant dessus.


 
Oui c'est une solution. Mais il faut que l'utilisateur créer un bouton dans son fichier excel. Si il ne le fait pas ça va bugguer et comme il y a plusieurs utilisateurs il faut faire un manuel etc...
 
Je vais être plus clair sur le déroulement de mon programme, ça noua aidera surement à trouver une solution tous ensemble:
 
Mon fichier A contient une liste de 38 pays et pour chaque pays il y a plusieurs données. Dans ma macro je fais une boucle du début du fichier jusqu'à la fin pour demander à l'utilisateur d'ouvrir un fichier B en rapport avec le pays où se trouve le pointeur de la boucle.  
exemple bète : je démarre du haut du fichier jusqu'en bas, j'attéri sur la France hop je lance une msgbox pour demander d'ouvrir un fichier B français.
 
Donc je veux que quand la msgbox apparrait, l'utilisateur ouvre un fichier B français, ça me donne le nom du fichier et pour que je puisse fouiller ce fichier B.

Reply

Marsh Posté le 06-07-2006 à 16:00:30    

Application.Dialogs(xlDialogOpen).Show
 
Ben ta msgbox, tu la transforme en DialogBox qui permet à ton utilisateur d'aller ouvrir son fichier et tu récupères le nom du fichier B!!


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-07-2006 à 16:12:50    

Code :
  1. Sub test()
  2. Dim strName
  3. Application.Dialogs(xlDialogOpen).Show
  4. strName = ActiveWorkbook.Name
  5. MsgBox strName
  6. End Sub


 
 
ça devrait marcher...


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-07-2006 à 16:20:12    

JihemAir a écrit :

Application.Dialogs(xlDialogOpen).Show
 
Ben ta msgbox, tu la transforme en DialogBox qui permet à ton utilisateur d'aller ouvrir son fichier et tu récupères le nom du fichier B!!


 
Oui ok, mais les fichiers sont sur une BD un peu spécifique à mon entreprise. Et je peux pas y accéder avec l'explorateur de fichier.

Reply

Marsh Posté le 06-07-2006 à 16:22:35    

Et comment tu fais pour récupérer ton fichier B sur cette BD en VBA ?

Reply

Marsh Posté le 06-07-2006 à 16:34:44    

Paul Hood a écrit :

Et comment tu fais pour récupérer ton fichier B sur cette BD en VBA ?


 
Je fais pas justement.  :lol:  
 
Vu qu'on peut ouvrir ce fichier en allant sur cette BD par un logiciel et que ce fichier s'affiche sous excel, comme sous windows, je me demandais si on pouvais pas prendre le nom d'un fichier qu'on venait d'ouvrir.

Reply

Marsh Posté le 06-07-2006 à 16:37:05    

ben si ton fichier est ouvert, excel connait son nom, pkoi n'utilises tu pas les fonctions qu'on t'a proposées ?

Reply

Marsh Posté le 06-07-2006 à 16:40:54    

Workbooks(Workbooks.Count).Name te donne le nom du dernier fichier excel ouvert.

Reply

Marsh Posté le 06-07-2006 à 17:19:03    

Paul Hood a écrit :

Workbooks(Workbooks.Count).Name te donne le nom du dernier fichier excel ouvert.


 
Voilà c'est ça que j'attendais. je vais essayer ça ce soir et je vous tiens au courant demain matin. Par-contre je pense rencontrer toujours le même problème :
 
Quand est-ce que je dois faire ça... C'est vrai si je fais ça tout de suite après le msgbox il va me donner le nom de mon fichier A... Bon on verra bien merci beaucoup tout le monde, @ demain.

Reply

Marsh Posté le 07-07-2006 à 09:31:51    

:pt1cable: Bonjour à tous.
Bon voilà j'ai essayé, et ça ne me donne toujours pas ce que je veux : ça me donne le nom du fichier A.
 
J'avais dans l'idée d'ouvrir le fichier B avant de cliquer sur le bouton "ok" de la msgbox qui me demande d'ouvrir ce dernier mais ça me bloque l'ouverture et le fichier B ne s'ouvre qu'à la fin de mon programme.
 
Quelqu'un a une solution pour que je puisse ouvrir ce fichier B pendant le déroulement du programme?

Reply

Marsh Posté le 07-07-2006 à 09:53:48    

En fait tu veux connaître le nom du fichier avant de l'ouvrir sans connaître son nom avant...ca va être dur ...

Reply

Marsh Posté le 07-07-2006 à 10:04:30    

attends Paul, je sais que c'est pas facile à comprendre ce que je veux mais ne fais pas d'ironie inutile s'il te plaît.
 
Ce que je veux c'est connaitre le nom d'un fichier que je viens d'ouvrir, c'est tout.
En faisant par exemple une msgbox pour demander l'ouverture, d'ouvrir le fichier B, cliquer sur ok et hop là j'ai son nom. Vous êtes pas obligé de répondre mais si vous le faite ça m'aiderai beaucoup dans mon travail.
 

Reply

Marsh Posté le 07-07-2006 à 10:11:27    

DamienCYS a écrit :

Et en mettant un évenement à l'ouverture du fichier B pour qu'il envoi son nom au fichier A
 
Private Sub Workbook_Open()
  Application.Run "'Fichier A.xls'!PasserNom" ThisWorkbook.name
End Sub
 
et dans la fonction PasserNom appartenant à fichier A tu récupèrer le nom, à voir s'il ne faut vérifier avant si fichier A est ouvert sinon tu ne pourras pas ouvrir Fichier b sans fichier a


 
 
Vu ce que tu veux je pense que la solution que je t'avais déja proposée est adaptée car tu est sur de récupérer le bon nom dès son son ouverture, un simple "on error resume next" avant le passage du nom te permet d'éviter les erreurs si fichier A n'est pas ouvert et ensuite tu fais des copier-coller  dans tes 38 fichiers B, le code est le même quel que soit ton fichier B.

Reply

Marsh Posté le 07-07-2006 à 10:16:44    

Le problème c'est pas qu'on est obligé ou pas de répondre, le probème c'est qu'on comprend pas (enfin moi) ce que tu veux faire.
 
Si tu fais
   Workbooks(Workbooks.Count).Name
juste après que ton fichier B soit ouvert, tu dois récupérer son nom.
 
Sinon l'autre solution c'est de balancer ton code (si c'est pas trop gros)
A toi de voir.

Reply

Marsh Posté le 07-07-2006 à 10:50:58    

Paul Hood a écrit :

Le problème c'est pas qu'on est obligé ou pas de répondre, le probème c'est qu'on comprend pas (enfin moi) ce que tu veux faire.
 
Si tu fais
   Workbooks(Workbooks.Count).Name
juste après que ton fichier B soit ouvert, tu dois récupérer son nom.
 
Sinon l'autre solution c'est de balancer ton code (si c'est pas trop gros)
A toi de voir.


 
Oui mais quand est-ce que je dois mettre ce code pour récupérer le nom? Puisque n'importe où où je le mets ça me donne le nom du fichier A et impossible d'ouvrir le B pendant le déroulement de mon programme.
 
Damien, ta solution me plaît mais je ne l'utiliserai uniquement si je ne trouve pas d'autre alternative. Je te remerci beaucoup de ton aide.

Reply

Marsh Posté le 08-07-2006 à 07:47:05    

Il faut peut-être laisser le temps au fichier de s'ouvrir avant de récupérer son nom en utilisant :

DoEvents


avant le code pour ouvrir le fichier B
Epéna

Reply

Marsh Posté le 10-07-2006 à 10:39:12    

Merci Epena, je vais essayer ça tout de suite

Reply

Marsh Posté le 11-07-2006 à 10:37:06    

:pt1cable:  non ça ne marche toujours pas.
Pas le temps d'ouvrir mon fichier B et donc ça me donne le nom de mon fichier A
 
voici mon code :

         fichierB = ""
         Do
         DoEvents
         fichierB = Workbooks(Workbooks.Count).name
         Loop Until fichierB <> ""

 
J'aimerai que le programme bloque à DoEvents pour que j'ai le temps d'ouvrir mon fichier B. Avec le debuggueur ça marche très bien sinon.

Reply

Marsh Posté le 11-07-2006 à 10:46:43    

T'as qu'a faire une boucle du style
CptFic = workbooks.count
"ouvre ton fichier B"
Do while CptFic= workbooks.count
loop
FichierB= workbooks(workbooks.count).name

Message cité 1 fois
Message édité par Paul Hood le 11-07-2006 à 10:47:36
Reply

Marsh Posté le 11-07-2006 à 11:48:37    

Merci Paul mais ton code ne marche pas, Excel ce bloque (écran figé) à l'éxécution de ce dernier.
je comprends pas pourquoi d'ailleurs. :fou:

Reply

Marsh Posté le 11-07-2006 à 11:50:41    

Paul Hood a écrit :

T'as qu'a faire une boucle du style
CptFic = workbooks.count
"ouvre ton fichier B"
Do while CptFic= workbooks.count
loop
FichierB= workbooks(workbooks.count).name


c'est une boucle infini
cptfic=workbooks.count
tu tournes en rond... Mais il a juste dit "une boucle du style" donc c'est à toi de le mettre à ta sauce ^_^()

Reply

Marsh Posté le 11-07-2006 à 12:02:08    

Si la boucle se fige c'est que  
- soit le fichier B est ouvert au moment où tu fais : CptFic = workbooks.count (avant la boucle). Le compteur tient déjà compte du fichier B.
 - soit le fichier B n'est jamais ouvert puisque le compteur n'augmente jamais.

Reply

Marsh Posté le 11-07-2006 à 13:34:14    

:(  
Je comprends plus rien. C'est une boucle infinie quoi que je fasse. Que faire? Demander l'ouverture du fichier B dans la boucle? Je sais plus.

Reply

Marsh Posté le 11-07-2006 à 13:37:37    

Ton fichier B s'ouvert dans excel ou dans une visionneuse ?

Reply

Marsh Posté le 11-07-2006 à 14:25:10    

il s'ouvre dans excel... Enfin il s'ouvre mais je ne le vois pas car mon écran se fige.

Reply

Marsh Posté le 11-07-2006 à 15:52:47    

Paul Hood a écrit :

Si la boucle se fige c'est que  
 - soit le fichier B n'est jamais ouvert puisque le compteur n'augmente jamais.


 
tant que l'utilisateur ne clique pas sur Ok le fichier B n'est pas ouvert et donc le compteur n'augmente pas
 
par contre j'ai repensé à ce que je te disait sur l'évenement workbook activate du fichier B
 
tu peux faire la même chose dans l'évenement deactivate du fichier A
 
met ce code dans l'objet ThisWorkbook du fichier A
 
Private Sub Workbook_Deactivate()
  MsgBox Workbooks(Workbooks.Count).Name
End Sub
 
je l'ai testé et dès que j'ouvre un autre fichier et que je valide la première boite de dialogue une deuxième me donne bien le nom du fichier que je vient d'ouvrir

Reply

Marsh Posté le 13-07-2006 à 13:40:55    

Bon les gars ça ne marche toujours pas. Soit ça me prend le nom de mon fichier A ou soit ça bloque l'ordi.  
Tant pis pour l'instant je cherche autre chose, je chercherai plus en détail quand j'aurai fini. Mais je vous remerci tout de même pour avoir essayé.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed