[VBA] Enregistrement feuille excel dans un répertoire

Enregistrement feuille excel dans un répertoire [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 14-06-2013 à 13:46:42    

Bonjour à tous,  
 
 
Etant mordu de macro, je sollicite à nouveau ce forum pour un petit soucis qui me semble vraiment bête mais je cale depuis ce matin...
Je souhaite enregistrer une feuille Excel ( une feuille et pas le classeur entier) dans un répertoire à choisir par soi-même ( en gros on a accès à un menu et on choisi l'emplacement où sauvegarder ). La feuille est enregistrée en format .asc .
 
Voila mon code :
 

Code :
  1. Dim XXX As String
  2. Dim nom As String
  3. nom = InputBox("Nom du fichier à enregistrer", "Titre", XXX)
  4.     MsgBox XXX
  5.     'ouverture de la fenêtre de choix du répertoire
  6. Set objShell = CreateObject("Shell.Application" )
  7. Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1& )
  8. 'Si l'utilisateur annule sans choisir
  9. If objFolder Is Nothing Then
  10. 'message
  11.     MsgBox "Abandon opérateur", vbCritical, "Annulation"
  12. Else 'sinon
  13.     'Lieu = répertoire choisi
  14.     Enregistrement = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
  15.    
  16.    Sheets("somme" ).SaveAs Enregistrement
  17.      
  18.     End If


 
 
Là où je bloque c'est que je veux via la Inputbox, attribuer le nom de la feuille à enregistrer mais ce nom de fichier n'est pas conserver lors de l'enregistrement dans le répertoire...de plus la messagbox ne m'affiche pas le contenu rentrer dans la Inputbox mais affiche juste "Faux"...
Je ne parviens pas à correctement écrire la dernière instruction qui serait d'enregistrer dans le répertoire précédemment choisi en format.asc...
 
 
Je vais essayer de revoir la procédure SaveAs car la clé est là et de comprendre mon erreur dans la Inputbox/MsgBox
 
Merci si vous pouviez m'éclairer car c'est un problème de formulation des instructions ..

Reply

Marsh Posté le 14-06-2013 à 13:46:42   

Reply

Marsh Posté le 14-06-2013 à 14:28:20    

 
           Bonjour,
 
           dans la ligne n°20, où se trouve donc le nom du fichier ?‼   Il y a quoi dans la variable Enregistrement ? …
 
           Mieux, voir du côté de la méthode  GetSaveAsFilename  ouvrant une fausse boîte de dialogue Enregistrer sous
           (comme dans l'exemple de la méthode  SaveAS  du reste …) remplaçant dès lors bien avantageusement
           la fonction InputBox et l'objet BrowseForFolder !
 

Code :
  1. Sub Demo()
  2.     FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  3.     If FicSav <> False Then MsgBox FicSav
  4. End Sub


           Voir aussi  - au cas où -  l'aide des instructions  ChDrive  et  ChDir  …


Message édité par Marc L le 14-06-2013 à 14:48:55
Reply

Marsh Posté le 14-06-2013 à 14:51:58    

Merci à nouveau Marc L !
 
J'ai tout remplacé par votre simple procédure et cela fonctionne, mais le soucis est que je ne retrouve plus le fichier .Autrement dit, lorsque je vais dans le répertoire, celui est vide (comme si l'enregistrement était nulle)alors que lors du lancement de la macro cela a bien été enregistré ...
 
ps: je viens de voir que votre instruction a été édité


Message édité par macrosoucis le 14-06-2013 à 14:53:27
Reply

Marsh Posté le 14-06-2013 à 14:57:39    

Rien n'a évolué ...L'enregistrement se fait mais pourtant le répertoire dans lequel j'ai enregistré est vide .
 
Juste ce code enregistre tout le classeur ou alors uniquement une feuille spécifique ? Car c'est ce dernier qu'il me faudrait ...
 
Mais bon c'est sûr que ça allège énormément et c'est bien plus efficace que mon code !

Reply

Marsh Posté le 14-06-2013 à 15:09:49    

 
           En lisant l'aide de la méthode  GetSaveAsFilename  et comme je l'ai indiqué,
           c'est une fausse boîte de dialogue ne renvoyant donc qu'un nom de fichier !
 
           Et surtout consulter l'aide de la méthode  SaveAs  !
 
           Sans boule de cristal, je ne puis voir votre code …


Message édité par Marc L le 14-06-2013 à 15:11:50
Reply

Marsh Posté le 14-06-2013 à 15:22:13    

Merci !J'ai suivi votre piste sur la méthode SaveAs et ça marche pour l'enregistrement ! Mais tout le classeur a été enregistré ...je souhaiterais uniquement la feuille "somme"...
 
Mon code:

Code :
  1. FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  2.     If FicSav <> False Then MsgBox FicSav
  3. Sheets("somme" ).SaveAs Filename:=FicSav


 
Malgré que je précise la feuille, il m'enregistre tout le classeur...
 
Synopsis: J'ai un classeur excel avec 5 feuilles, je veux enregistrer juste la feuille "somme" dans un répertoire donné à choisir .
 
Merci beaucoup déjà de m'avoir orienter sur la bonne piste !

Reply

Marsh Posté le 14-06-2013 à 15:39:27    

 
           Exact !   Je viens de tester :  l'intégralité du classeur est sauvegardé au lieu d'uniquement la feuille …
 
           Donc voir du côté de la méthode  Copy  associée à l'objet Worksheets créant un nouveau classeur comportant une seule feuille …
 
           La ligne n°3 du code doit se trouver dans la ligne n°2 juste après le Then,
           le MsgBox n'était là qu'à titre de démonstration pour vérifier la valeur renvoyée par GetSaveAsFilename


Message édité par Marc L le 14-06-2013 à 16:07:53
Reply

Marsh Posté le 17-06-2013 à 10:15:26    

Bonjour,
 
Affaire "presque" résolue !!
 
Mon code :
 

Code :
  1. Set objworkbooksource = ActiveWorkbook
  2.   choix = InputBox("Type d'analyse: somme, median ou moyenne", "Titre", XXX)
  3. MsgBox choix
  4.   Worksheets("choix" ).Copy
  5.   Set objWorkbookCible = ActiveWorkbook
  6.   ActiveWorkbook.SaveAs objworkbooksource.Name & "_" & objworkbooksource.Worksheets("choix" ).Name
  7.   FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  8.     If FicSav <> False Then Sheets("choix" ).SaveAs Filename:=FicSav
  9.   ActiveWorkbook.Close


Ca bloque à la ligne 4...
Je voudrais que le contenu que je rentre dans ma inputbox soit le nom de la feuille sur laquelle agir par la suite...je bloque à cette dernière étape ...
 
 
 
Ah oui et aussi je voulais apporter une précision sur une partie du code que vous aviez établi il y a une semaine de cela:

Code :
  1. While Fichier <> ""
  2.         Workbooks.OpenText Dossier & Fichier, 932, 1, xlDelimited, Tab:=True, _
  3.                   FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
  4.  
  5.         [A75:A150].Copy Dest.Cells(1, 1)
  6.         If Application.CountA("B75:B150" ) Then
  7.             colonne = colonne + 1
  8.             [B75:B150].Copy Dest.Cells(1, colonne)


Je n'arrive pas à préciser dans le code que les données doivent être copiées dans la feuille "résultats" ....car étant donné que je dispose de plusieurs feuilles dans ce classeur, il arrive parfois que ce code soit copié sur plusieurs feuilles, ce qui est normal vu que c'est pas précisé dans le code. J'ai essayé de l'inclure à toutes les sauces sans succès....
 
Merci !!


Message édité par macrosoucis le 17-06-2013 à 10:47:21
Reply

Marsh Posté le 17-06-2013 à 11:28:37    

 
           Premier code :
 
           - la ligne n°5 ne sert à rien …
 
           - La variable choix définie en ligne n°2  " remplaçant du texte "  ne doit surtout pas être entre guillemets dans les lignes 4, 6 & 8 ‼
             Entre guillemets ce n'est pas une variable mais simplement le texte "choix" …
 
           - Est-ce normal que le nouveau classeur soit sauvegardé deux fois de suite en ligne n°6 & 8 ?   :ouch:  
 
           Encore une fois, traduire le code en langage courant pour vérifier s'il correspond à la logique de départ  …
 
           Quant au second code, la feuille de destination est représentée par la variable  Dest  définie en ligne n°7 de mon code
           Elle peut aussi être remplacée par le nom de la feuille en dur si elle ne change jamais …
 

Reply

Marsh Posté le 17-06-2013 à 13:19:10    

J'ai apporté les modifications que vous avez évoquées et cela fonctionne parfaitement !!
 
Oui j'avais même pas remarqué ( précipitation ?) que je sauvegardais 2 fois le classeur  [:crokychips] ...
 
Je me rends (enfin ?) compte aussi que la touche F1 est TRÈS importante pour un débutant !
 
Pareil pour le code 2, la solution était évidente ...
 
 
Merci vraiment Marc L !

Reply

Marsh Posté le 17-06-2013 à 13:19:10   

Reply

Marsh Posté le 17-06-2013 à 14:14:42    

 
          De rien et félicitations !
 
          Et aujourd'hui, jour de bac de philo, j'ose me permettre :  De la sémantique à la technologie …
 

Reply

Marsh Posté le 20-06-2013 à 15:51:14    

Bonjour à vous,
 
Je ne parviens pas à ajouter une toute petite modification mais qui a de l'importance sur le code que j'ai cité ici même:
 

Code :
  1. Set objworkbooksource = ActiveWorkbook
  2.   choix = InputBox("Type d'analyse: somme, median ou moyenne", "Titre", XXX)
  3. MsgBox choix
  4.   Worksheets(choix ).Copy
  5.   Set objWorkbookCible = ActiveWorkbook
  6.   FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  7.     If FicSav <> False Then Sheets(choix ).SaveAs Filename:=FicSav
  8.   ActiveWorkbook.Close


 
Le code fonctionne pas de soucis mais j'aimerais pouvoir enregistrer 2 ou 3 feuilles de mon classeur ( imaginons les feuilles somme et median). J'ai vu dans l'aide que l'on pouvait utilisé la fonction Array telle que la ligne 4 du code devienne:

Code :
  1. Worksheets(Array(choix )).Copy


et que je rentre dans la Inputbox : somme, median
 
Et bien cela ne fonctionne pas...merci de votre aide je pense que c'est tout bête mais je ny parviens pas..

Reply

Marsh Posté le 20-06-2013 à 19:38:41    

 
           Bonjour,
 
           vu le code qui n'est pas le bon, du coup j'ai un gros doute !
 
           Les feuilles doivent être enregistrées ensemble dans un nouveau classeur ou bien chacune dans un classeur distinct ?


Message édité par Marc L le 20-06-2013 à 19:39:26
Reply

Marsh Posté le 20-06-2013 à 22:22:14    

macrosoucis a écrit :

J'ai vu dans l'aide que l'on pouvait utilisé la fonction Array telle que la ligne 4 du code devienne:

Code :
  1. Worksheets(Array(choix )).Copy


et que je rentre dans la Inputbox : somme, median
Et bien cela ne fonctionne pas...merci de votre aide je pense que c'est tout bête mais je ny parviens pas..


            C'est normal que cela ne fonctionne pas car Array(choix) crée un tableau d'un seul et unique indice égal à "somme, median"
            et comme aucune feuille n'est dénommée "somme, median" …
 
            Donc la variable "texte" choix doit être transformée en "tableau" :                 Worksheets(Split(Choix, "," )).Copy
            et là cela fonctionne si aucun espace n'est saisi entre les noms de feuille !
 
            Si l'espace après la virgule est nécessaire, il faut alors modifier le délimiteur dans la fonction Split
  

Reply

Marsh Posté le 21-06-2013 à 09:21:09    

Bonjour Marc L,
 
Merci encore une fois de votre réponse !
Tout d'abord je ne comprends pas pourquoi vous dites que le code n'est pas le bon ? Car cela fonctionne chez moi...
 
 

Citation :

Donc la variable "texte" choix doit être transformée en "tableau" :                 Worksheets(Split(Choix, "," )).Copy  
            et là cela fonctionne si aucun espace n'est saisi entre les noms de feuille !


 
 
Oui c'est exactement cela ! Je souhaite enregistrer l'ensemble dans un même classeur et non pas dans un classeur distinct pour chaque feuille . Pour l'espace c'est pas bien grave, je ferais attention à ne pas en mettre  :)  (ps: merci de m'avoir expliquer pourquoi la fonction Array ne fonctionnait pas )
 
Le soucis c'est maintenant propagé à la ligne 8 ...je ne comprends pas pourquoi cela ne marche pas :

Code :
  1. If FicSav <> False Then Worksheets(Split(choix, "," )).SaveAs Filename:=FicSav


 
J'ai un message d'erreur: propriété ou méthode non gérée par cet objet ...
 
 
 

Reply

Marsh Posté le 21-06-2013 à 09:45:08    

 
           C'est normal car c'est bien ce que je disais :  ce n'est pas le bon code ‼
 
           Il y a toujours la ligne ne servant à rien …
 
           Le  .Copy  crée quoi ?
 
           Cf mon message du 14-06 à 15h39 :  un nouveau classeur.     Et c'est donc lui qu'il faut sauvegarder …


Message édité par Marc L le 21-06-2013 à 09:50:00
Reply

Marsh Posté le 21-06-2013 à 10:29:48    

Le problème est résolu !  
Merci encore de m'avoir si bien orienté vers la solution !!
 
J'ai remplacé l'expression Worksheets(Split(Choix, "," )) citée précédemment à la ligne 8 par tout simplement ActiveWorkBook et cela marche!!
Je me suis dit que c'est évident qu'il s'agit tout bêtement de la fenêtre active à enregistrer...
Oui j'ai supprimé la ligne 5 ( qui ne l'est plus), c'est vrai qu'elle servait à rien !
 
Mon code:

Code :
  1. Set objworkbooksource = ActiveWorkbook
  2.   choix = InputBox("Type de spectre à choisir: somme, median ou moyenne", "Titre", XXX)
  3.   MsgBox choix
  4.   Worksheets(Split(choix, "," )).Copy
  5.  
  6.     FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  7.     If FicSav <> False Then ActiveWorkbook.SaveAs Filename:=FicSav
  8.   ActiveWorkbook.Close


 

Reply

Marsh Posté le 21-06-2013 à 11:33:42    

 
           Bien !
 
           Et la ligne n°1, sert-elle dans la suite du code ?           Et la ligne n°3 n'a-t-elle plus lieu d'être ?
 
           Dans le cas où le fichier ne soit pas sauvegardé, que se passe-t-il alors avec la ligne n°8 ?
 
           Eh oui, une question demandant de sauvegarder le fichier alors qu'elle a déjà été posée via la méthode GetSaveAsFilename ! …
 
           En lisant l'aide de la méthode  Close  associée à un objet Workbook,
           on s'aperçoit qu'elle est capable à la volée de sauvegarder ou pas le classeur, et même de demander un nom de fichier !
           Mais s'agissant de fichiers .asc  (?)  dans ce cas mieux vaut conserver GetSaveAsFilename
           et passer les bons paramètres à Close quel que soit le cas de figure, faisant donc d'une pierre deux coups :

Code :
  1. '    Set objworkbooksource = ActiveWorkbook
  2.     choix = InputBox("Type de spectre à choisir: somme, median ou moyenne", "Titre", XXX)
  3. '    MsgBox choix
  4.     Worksheets(Split(choix, "," )).Copy
  5.    
  6.     FicSav = Application.GetSaveAsFilename(, "Fichier ,*.asc" )
  7.    
  8.     ActiveWorkbook.Close IIf(FicSav <> False, True, False), FicSav

 

Reply

Marsh Posté le 24-06-2013 à 10:39:48    

Merci Marc L de vos explications !! J'en prends note sans modération !

Reply

Sujets relatifs:

Leave a Replay

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