Code VBA - enregistrement fichier excel [Résolu]

gerardcjf 47 Messages postés mardi 3 juillet 2007Date d'inscription 26 décembre 2013 Dernière intervention - 22 nov. 2009 à 18:56 - Dernière réponse : GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention
- 30 nov. 2009 à 12:06
Bonjour,
Dans la feuille 1 d'un classeur Excel, l'utilisateur place :
? Dans la cellule1 : le lecteur ou le fichier devra s'enregistrer
? Dans la cellule 2 : j'ai le résultat d'une formule qui concatène un chiffre + un prénom
Je cherche, à partir d'un bouton « enregistrer » qui sera placer sur les feuilles 2,3,4, etc ? à créer un code vba qui me permettra d'enregistrer le classeur sous le chemin :
? Cellule1:\ « répertoire de sauvegarde »\cellule2
Par ailleurs, je souhaite qu'au cas où le fichier existe déjà , il y ait une boite de dialogue qui en informe l'utilisateur et qui lui demande si oui ou non il veut remplacer le fichier.
Et là je sèche sévère !
Je vous remercie par avance de l'aide que vous m?apporterez !
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 30 nov. 2009 à 12:06
3
Merci
Re-bonjour !

Juste pour que tu n'oubli pas de mettre "Réponse acceptée" si ton problème est résolu :)

Bonne journée, Peace :)
 

Merci GarnierFlorian 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de GarnierFlorian
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 23 nov. 2009 à 10:36
0
Merci
Salut salut !!

Bon, est-ce que tu peux être un petit peu plus clair sur ce que tu veux ?!

Dans la cellule 1 tu veux que l'utilisateur saisisse un chemin qui servira pour enregistrer le classeur ?

Et je vois pas l'intéret de créer un bouton sur les feuilles 2,3,4 etc.. ???? Si otut se passes sur la feuille 1 pourquoi ne pas placer le bouton sur celle-ci ?

Pour la sauvegarde c'est pas trop compliqué mais c'est pour la fin, alors d'abord réponds à ces petites questions et on vera après pour le reste^^

Peace :)
 
Commenter la réponse de GarnierFlorian
gerardcjf 47 Messages postés mardi 3 juillet 2007Date d'inscription 26 décembre 2013 Dernière intervention - 23 nov. 2009 à 20:21
0
Merci
Bonjour,

alors procédons dans l'ordre ...

Le lecteur est dans la cellule car j'ai une macro qui va capter des informations d'une de données qui peut être placée, selon les utilisateurs, sur C, D, E ...
La cellule 2 comme je l'ai indiqué est le résultat d'une concatenation (formule excel)
Dans le code, le chemin sera donc lecteur issu de la cellule 1\chemin fixe(qui correspond au chemin de la BDD)\contenu de la cellule 2


L'intérêt de placer le bouton sur les feuilles 2,3,4, c'est que ces feuilles font apparaitre les une après les autres (on passe de la feuille 1 à 2 puis 3 puis 4 etc ...) des élements recupérer dans la BDD que l'on altère et donc que je veux que l'on sauvegarde. Le but étant de pouvoir s'arrêter à la feuille 2 à un instant t pour reprendre à cette même feuille à un autre instant.


Voili Voilou !

D'avance merci !
@+
Commenter la réponse de gerardcjf
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 24 nov. 2009 à 10:01
0
Merci
Hello !! Bon alors je te le dis directement, je peux t'aider pour ce qui est en rapport avec le fic Excel, mais j'ai pas encore eu l'occasion de gérer de base de données en vba pour le moment !!

Tu peux aller sur ce site où tu as plusieurs rubriques là-dessus :

http://www.info-3000.com/vbvba/index.php (regarde plus vers la fin, pas de sous-titres qui indique que c'est avec Access)

Sinon, pour le reste, je pense que tu pourrais te servir de 2 cellules seulement ! Etant donné que le chemin du répertoire risque d'être fixe, il est préférrable de l'enregistrer dans une constante ?!

Et donc pour l'enregistrement c'est l'instruction suivante :

'Tu déclares la constante pour le chemin du répertoire

Public Const REPERTOIRE = ":\NomDossier\Nomdossier2"

'Je déclare juste ce classeur pour que tu comprennes l'utilisation de wb,
dim wb as Workbook

cheminrepertoire = Range("A1").Value & REPERTOIRE & "" & Range("A2").Value

wb.SaveAs Filename:=cheminrepertoire, _
        FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False


Je te rajoute également une petite fonction permettant de savoir si le répertoire où tu souhaites faire ton enregistrement existe, sinon il le crée(utilise la constante) :

'Tu y fais appel dans ta macro de la manière suivante : 
Creation_Repertoire(REPERTOIRE)

' Création d'un répertoire
Function Creation_Repertoire(repertoire As String)
    
Dim fs As Object

Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FolderExists(cheminrepertoire) = False Then
   fs.CreateFolder (cheminrepertoire)
   Creation_Repertoire = True
 Else
   Creation_Repertoire = False
End If
End Function


Sinon pour le reste je veux juste un peux plus d'explications : tu veux que le bouton de la feuille 1 te renvoi la feuille 2, celle-ci comprenant des informations de la feuille 1, et ainsi de suite jusqu'à 4; ou tu veux que le bouton de permette de faire un enregistrement pour chaque feuille ? Si c'est plutôt la deuxième proposition, alors il faudrait faire le saveAs sur une variable déclarée en tant que Worksheet.

Dim ws As Worksheet


J'espère t'avoir fait un peu avancé, déjà dis moi comment tu trouves ça et on verra pour le reste après !

Bonne journée, Peace :) 
Commenter la réponse de GarnierFlorian
gerardcjf 47 Messages postés mardi 3 juillet 2007Date d'inscription 26 décembre 2013 Dernière intervention - 24 nov. 2009 à 20:44
0
Merci
Merci !!!!!!!!!!!!!!!!
Avec cela, j'ai déjà de quoi me triturer les meninges ....
Pour le bouton "enregister" il enregistre tout le classeur ... mais l'utilisateur au fur et à mesure qu'il avance dans son dossier, fait apparaitre les feuilles 2,3,4, n et je veux que le bouton enregistrer soit present sur chaque feuille ... mais il fera toujours référence à la macro "enregistrement" (d'où le test du repertoire + fichier pour remplacer le fichier ou non)

Sinon le lien ... très sympa .... plein de codes intéressant !!


A+
Commenter la réponse de gerardcjf
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 26 nov. 2009 à 14:44
0
Merci
Salut !

Si tu as de quoi travailler, je te laisse avancer, mais n'hésite pas à me faire signe si tu as un souçis !

Autrement un petit indice pour le bouton enregistrer : si tu souhaites enregistrer seulement une feuille, crée une procédure te permettant de faire ton SaveAs sur un objet Worksheet, et non pas sur Workbook qui enregistre tout le classeur ! En fait, tu as juste as passer l'indice de ta feuille lorsque tu appelles ta procédure.

J'apporte une petite précision : la fonction Creation_repertoire permet de savoir si ton répertoire existe. Si il n'existe pas, il est créé ! Il n'y a pas de contact avec ton fichier dans cette fonction ! Pour tester l'existante du fichier :

Public Const REP_FICHIER = "C:\MesDocuments\DossierContenantFichier"
Public Const NOM_FICHIER = "NomFichier"
Public Const EXT_FICHIER = ".xls"

'Dans le module qui correspond :

cheminfichier = REP_FICHIER & "" & NOM_FICHIER & EXT_FICHIER
If ExistFile(cheminfichier) Then
    ' Test si fichier ouvert
    cheminfichier = NOM_FICHIER & EXT_FICHIER
    If Fic_ouvert(cheminfichier) Then
     MsgBox "Le fichier Excel est déjà ouvert.", vbOKOnly,"Tentative d'ouverture du fichier Excel"
    Else
     Set co_xlbook = Workbooks.Open(cheminfichier)
     co_flgfic = True
    End If
Else
    'Creation et Mise en forme du Fichier Excel
    Set xlbook = Workbooks.Add
    'La procédure suivante je te laisse la faire selon tes besoins, c'est pour mettre en forme ton fichier excel
    FormatFicExcel xlbook
    xlbook.SaveAs cheminfichier
    flgfic = True
End If


La fonction pour l'existance du fichier :

'Vérification de l'existence du fichier Excel
Public Function ExistFile(strpath As String) As Boolean

Dim fs As Object

Set fs = CreateObject("Scripting.FileSystemObject")
ExistFile = fs.FileExists(strpath)
End Function


La fonction pour tester si le fichier est ouvert où si tu dois l'ouvrir :

' Test si fichier ouvert
Function Fic_ouvert(fic_nom As String)
    
    Dim wb As Workbook
        
    MsgBox fic_nom, vbOKOnly
    
    Fic_ouvert = True
    On Error GoTo fin
    Set wb = Workbooks(fic_nom)
    Set wb = Nothing
    Exit Function
fin:
    Fic_ouvert = False
    On Error GoTo 0
End Function



Je pense que tu as de quoi travailler, donc je te laisse avancer, mais n'hésite pas à me faire signe si tu as un souçis !

Peace :)


 
Commenter la réponse de GarnierFlorian
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 26 nov. 2009 à 14:58
0
Merci
J'ai juste fais quelques petites erreurs ! J'ai appelé la variable "xl_book" par "co_xlbook" à un moment, et le flgfic ne te serviras à rien, c'est un test que je fais une appli^^

Peace :)

 
Commenter la réponse de GarnierFlorian
gerardcjf 47 Messages postés mardi 3 juillet 2007Date d'inscription 26 décembre 2013 Dernière intervention - 29 nov. 2009 à 17:23
0
Merci
Bonsoir,

J'ai enfin réussi à coder mon enregistrement avec test de l'existence du dossier et du fichier à enregistrer ....

Merci à GarnierFlorian pour son aide précieuse !

Ci-après le code ... peut être peut on l'alléger ... en tout cas pour moi il marche (et pour l'utilisateur c'est essentiel !)

A+
Sub Sauvegarder_Classeur()

Sheets("Paramètres").Visible = True
Sheets("Paramètres").Activate
Range("B1").Select
lecteur = ActiveCell.Value

Range("F1").Select
Numpersonne = ActiveCell.Value

Range("F2").Select
Mondossier = ActiveCell.Value

Sheets("Paramètres").Visible = False

repertoire = ":\osiris\CSP\DOSSIERS"

nomchemin = lecteur & repertoire & Mondossier

ChDrive lecteur
    
    
    If Sheets("paramètres").Range("F2") = "" Then
        MsgBox "Vous n'avez pas importer de données" & Chr(10) & Chr(10) & "Enregistrement impossible !"
        Sheets("paramètres").Visible = True
        Sheets("paramètres").Activate
        Range("B8").Select
        Exit Sub
    End If
            
            Select Case Numpersonne
                Case Numpersonne = ""
                    MsgBox "Vous n'avez pas importer de données" & Chr(13) & "Enregistrement impossible !"
                    Sheets("paramètres").Range("B8").Activate
                    Exit Sub
                Case Else
                    MonFichier = nomchemin & "Outil_CSP.xls"
                    Set fs = CreateObject("Scripting.FileSystemObject")
                    If fs.FolderExists(nomchemin) = True Then
                        If fs.FileExists(MonFichier) = True Then
                            rep = MsgBox("Le classeur Outil_CSP.xls existe déjà, voulez-vous le remplacer ?", vbYesNoCancel, "    Information")
                            Select Case rep
                                Case Is = 6
                                    ChDir nomchemin
                                    Application.DisplayAlerts = False
                                    ActiveWorkbook.SaveAs Filename:="Outil_CSP.xls"
                                    Application.DisplayAlerts = True
                                Case Is = 7
                                    ChDir nomchemin
                                    MsgBox "Le fichier n'a pas été enregistré. Choisissez : Fichier Enregistrer ..., et changez le nom d'enregistrement."
                                    SendKeys "%f"
                                    SendKeys "r"
                                    Exit Sub
                                Case Is = 2
                                    MsgBox "Vous avez choisi d'annuler cette action : aucun enregistrement n'a été effectué"
                                    Exit Sub
                                Case Else
                                    MsgBox "Aucun enregistrement n'a été effectué"
                                    Exit Sub
                            End Select
                        Else
                            ChDir nomchemin
                            ActiveWorkbook.SaveAs Filename:="Outil_CSP.xls"
                        End If
                    Else
                    If fs.FolderExists(lecteur & repertoire) = False Then
                        MsgBox "Le répertoire DOSSIERS n'existe pas ! " & Chr(13) & "Ce dossier a dû être détruit ou déplacé : revoir la configuration"
                        Exit Sub
                    End If
                        MkDir nomchemin
                        ChDir nomchemin
                    MsgBox "Le classeur Outil_CSP.xls va être enregistré dans " & nomchemin, vbOKOnly, "    Information"
                    ActiveWorkbook.SaveAs Filename:="outil_CSP.xls"
                    End If
           End Select
End Sub
Commenter la réponse de gerardcjf
GarnierFlorian 129 Messages postés mardi 27 mai 2008Date d'inscription 26 juillet 2011 Dernière intervention - 30 nov. 2009 à 10:18
0
Merci
Bonjour bonjour !

Et bien je suis content d'avoir pu te rendre service :)

Par contre je vais être juste un peu chiant, mes je te conseille d'utiliser le même formalisme pour chaque élément de tes macros. Je m'explique : il faut par exemple que toutes tes variables soient en miniscule. Ce n'est pas une obligation, tu peux toutes les commencer par une majuscule, mais généralement ce sont les fonctions et les procédures qui commencent par une majuscule. En fait, ça permet ensuite pour quelqu'un qui reprend ton code de savoir si il a à faire à une variable ou une procédure. Et même pour toi si tu reviens dessus deux ans après par exemple ..;)

Et ici tu à des variables qui commencent par une majuscule et d'autres pas une miniscule ! donc il serait très rapide de confondre certains éléments.
Après c'est à toi de voir si tu voux ou non que ton code soit un peu plus "formalisé"^^

Allez bonne journée et bonne continuation :)

Peace :)
Commenter la réponse de GarnierFlorian

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.