gerardcjf
Messages postés47Date d'inscriptionmardi 3 juillet 2007StatutMembreDernière intervention26 décembre 2013
-
22 nov. 2009 à 18:56
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011
-
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 !
A voir également:
Vba enregistrer fichier
Code vba excel pour ajouter un enregistrement - Meilleures réponses
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011 23 nov. 2009 à 10:36
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^^
gerardcjf
Messages postés47Date d'inscriptionmardi 3 juillet 2007StatutMembreDernière intervention26 décembre 2013 23 nov. 2009 à 20:21
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.
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011 24 nov. 2009 à 10:01
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 :
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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
gerardcjf
Messages postés47Date d'inscriptionmardi 3 juillet 2007StatutMembreDernière intervention26 décembre 2013 24 nov. 2009 à 20:44
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 !!
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011 26 nov. 2009 à 14:44
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 !
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011 26 nov. 2009 à 14:58
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^^
gerardcjf
Messages postés47Date d'inscriptionmardi 3 juillet 2007StatutMembreDernière intervention26 décembre 2013 29 nov. 2009 à 17:23
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
GarnierFlorian
Messages postés129Date d'inscriptionmardi 27 mai 2008StatutMembreDernière intervention26 juillet 2011 30 nov. 2009 à 10:18
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é"^^