Enregistrer fichier deja ouvert - VB/VBA/VBS - Programmation
Marsh Posté le 11-01-2010 à 13:53:41
Ce n'est pas n'importe quel fichier, mais un fichier Excel. C'est important de le préciser, car habituellement, les fichiers ouverts ne sont pas bloqués pour la mise à jour. Mais cela arrive avec Excel pour éviter que les mises à jour faites par un utilisateur ne soient perdues à cause d'un autre utilisateur qui enregsitre une feuille en ne prenant pas en compte les modifications de l'autre utilisateur, puisque ces modif étaient en mémoire et pas encore dans le fichier quand le fichier fut ouvert.
Bref, il faut demander à l'utilisateur, qui bloque le fichier Excel, de le fermer.
Ou bien ... attendre la prochaine version d'Excel, prévue mi 2010, car elle fera du cloud computing, et permettra donc de travailler à plusieurs sans ces problèmes.
Ou encore, choisir un autre logiciel, car il existe déjà certains tableurs qui font du "cloud computing", par exemple Google Spreadsheets.
Marsh Posté le 11-01-2010 à 14:11:23
1) merci d'utiliser les balises code dans ton post
2) pas cool, le code en allemand Quand on développe, c'est plutôt l'anglais qu'on utilise...
Sinon, pour ton pb, c'est parfaitement que l'OS t'empêche d'écraser un fichier ouvert. A part utiliser un petit exe qui permet de faire sauter le lock posé sur le fichier par l'OS, y'a rien à faire. Ou alors, proposer à l'utilisateur, si la sauvegarde renvoie false, de sauvegarder sous un autre nom de fichier
Marsh Posté le 11-01-2010 à 15:42:15
le fichier n'est pas ouvert par un autre utilisateur, même si c'est ouvert par moi, il me dit quand même qu'il ne peut pas.
pour rufo :
- c'est quoi les balises code ?
- je vois pas en quoi que le nom des variables soit choisi en allemand ou en anglais change quoi que ce soit
il n'y a pas moyen qu'il me renvoie la boîte de dialogue habituelle "le fichier existe deja, voulez vous ecrire par dessus ?" et qu'il force l'ecriture ?
sinon, je contournerais le probleme en lui disant de le fermer d'abord avant d'enregistrer
Marsh Posté le 11-01-2010 à 16:09:33
Le pb du code en allemand, c'est que tout le monde parle pas allemand, donc pourra pas t'aider à débugger. Alors qu'en anglais, n'importe qui qui fait un peu d'info comprendra le code...
Sinon, non, pas possible d'écraser le fichier ouvert. Par contre, en testant le code de retour de la fonction save, tu pourras afficher un msg dans une boîte de dialogue.
ps : balise [code] de ce forum pour mettre en forme ton code.
Marsh Posté le 12-01-2010 à 05:41:45
Bonjour
Oui, impossible d'appeler un fichier comme un fichier ouvert, puisque le nouveau remplace l'ancien, que serait alors l'ancien?
Il faut soit le fermer, soit le renommer d'abord, c'est logique, et sécurisant. (par contre, tu peux faire les deux dans la même macro)
A part ça, j'ai testé ta macro, et il me semble que si "filesavename = False" tu as un msg d'erreur pour
filesavename = filesavename + "xls"
Il vaudrait donc peut-être mieux mettre le
If filesavename = False Then
avant, par exemple comme ça:
Code :
|
le Right(---) te donne directement la fin du nom
D'autre part, chez moi, le "Werte_Speichertabelle" ne fonctionne pas, il vaut mieux mettre "ActiveWorkbook", comme dit Monsieur Rufo, tt le monde comprend.... même Excel!
A+
Marsh Posté le 12-01-2010 à 10:36:40
j'avais pas fait gaffe à ce bug possible, merci
et sinon, Excel comprend Werte_Speichertabelle, qui n'est pas toujours le même que Activeworkbook
Marsh Posté le 11-01-2010 à 11:51:32
Bonjour
Dans mon programme, j'ai un bouton pour sauvegarder des valeurs dans un fichier
le bouton ouvre un nouveau fichier, ecrit les valeurs, puis demande un nom de fichier a l'utilisateur
j'ai un autre bouton pour charger les valeurs d'un fichier enregistre precedemment, ou je demande egalement le nom
Mon probleme est que si l'utilisateur selectionne comme nom de fichier un fichier deja ouvert, il me sort que le fichier est deja ouvert et qu'il ne peut pas enregistrer.
Si il selectionne le meme fichier alors que celui ci n'est pas ouvert, ca fonctionne
la partie enregistrer de mon code
If Datei_gespeichert = False And Datei_geladen = False Then je verifie d'abord que c'est la premiere fois lors de cette session que j'enregistre
filesavename = Application.GetSaveAsFilename()
lang = Len(filesavename)
If Not (Mid(filesavename, (lang - 3), 4) = ".xls" ) Then
filesavename = filesavename + "xls"
End If Cette partie me gene aussi, mais c'est tout ce que j'ai trouvé pour qu'il me l'enregistre avec le bon nom et le bon format
If filesavename <> False Then
Werte_Speichertabelle.SaveAs Filename:=filesavename, FileFormat:=xlWorkbookNormal
End If
Datei_gespeichert = True
Else
Werte_Speichertabelle.SaveLa c'est pour enregistrer un fichier precedemment charge ou enregistre
End If