Incrémenter un enregistrement-sous

Mesdames, Messieurs bonjour,

Je découvre VBA et suis très enthousiaste mais je rencontre tout un tas de problème.

J'ai réalisé un "fichier-modèle" que j'enregistre-sous à l'aide d'une macro en fonction d'un certain nombre de variables que je renseigne dans ce fameux fichier.

Je me retrouve donc, après utilisation de la macro, avec un fichier qui s'appelle par exemple "2135_Toto_Lolo_V1", enregistré là où je le souhaite.

De la même façon, je génère aussi un fichier avec ce même fichier-modèle qui s'appellerait par exemple "3625_Tata_Lala_V1". Jusque là, tout va bien...

Mon souci est la possibilité de créer une "V2" dès lors qu'il existe une V1 (ou une V3 voire V4…) mais je n'arrive pas à utiliser la fonction DIR (sous Excel 2011 mac) et n'ai rien trouvé sur les différents forums…

Je suis sans doute passé à côté d'un truc simplissime mais, à tous ceux qui peuvent m'aider, d'avance merci !

Bonjour,

Merci de t'intéresser à mon problème. Je suis aller sur le lien mais n'arrive pas à faire le rapprochement (je débute hein…).

En fait, je ne comprends même pas le but de ce code :

Sub Sample()

MyDir = ActiveWorkbook.Path

strPath = MyDir & ":"

strFile = Dir(strPath, MacID("TEXT"))

'Loop through each file in the folder

Do While Len(strFile) > 0

If Right(strFile, 3) = "csv" Then

Debug.Print strFile

End If

strFile = Dir

Loop

End Sub

Alors si quelqu'un pouvait m'expliquer… Merci !

Bonjour à tous,

J'ai essayé cela :

Sub PRP()

Dim Extension As String

Dim Chemin As String

Dim NomOrigine As String

Dim NomFichier As String

Dim style As Integer

Dim i As Integer

i = 1

Extension = ".xlsx"

Chemin = "volumes:PRIX DE REVIENT:PRP:PRP_" & Range("F4") & ":"

NomOrigine = ActiveSheet.Range("F5") & "_" & Range("B3") & "_" & Range("F3") & "_" & "V"

NomFichier = NomOrigine & Format(i, "00") & Extension

With ActiveWorkbook

.SaveAs Filename:=Chemin & NomFichier, FileFormat:=52

If Dir(Filename) <> "" Then

MsgBox "Créer nouvelle version ?" & NomOrigine, vbCritical, Filename

For i = 1 To 10

NomFichier = NomOrigine & Format(i, "00") & Extension

If Dir(Filename) = "" Then Exit For

Next i

End If

MsgBox "Le nouveau fichier a été enregistré :" & NomFichier, vbInformation

.Close

End with

End Sub

Mais ça bug dès : If Dir(Filename) <> "" Then

Si quelqu'un quelque part a une idée, je suis preneur…

Merci !

Peut-être est-il un peu tard pour répondre à votre question, mais voici quand même une réponse:

Dir(filename) : la variable FileName n'existe pas !

FileName est le nom du paramètre de la méthode SaveAs à laquelle vous avez transmis une valeur.

Vous ne pouvez pas l'utiliser en dehors.

C'est donc :

If Dir(Chemin & NomFichier)<>"" then...

qu'il faut utiliser.

Comme je n'ai pas réussi, même tardive, toute réponse est bonne à prendre ! Donc merci.

Alors, j'ai essayé If Dir(Chemin & NomFichier)<>"" then… mais cela bug aussi.

Peut-être est-ce lié au fait que je sois sous Mac ?

En effet, sous Mac, la fonction Dir a du mal à fonctionner : il semble que la longueur du chemin soit limitée.

De plus, elle ne gère pas les caractères génériques (*, ?...) sous Mac.

Il faudrait donc utiliser la fonction Macscript(instruction) qui permet d'envoyer un script.

Voici le code que j'ai trouvé pour tester l'existence d'un fichier ou d'un répertoire.

Ce n'est pas moi qui l'ai écrit comme vous pouvez le constater, et je ne l'ai pas encore testé (je n'ai pas de Mac sous la main)

Function FileOrFolderExistsOnMac(FileOrFolder As Long, FileOrFolderstr As String) As Boolean
'By Ron de Bruin
'30-July-2012
'Function to test whether a file or folder exist on a Mac.
'Uses AppleScript to avoid the problem with long file names
Dim ScriptToCheckFileFolder As String

    ScriptToCheckFileFolder = "tell application " & Chr(34) & "Finder" & Chr(34) & Chr(13)
    If FileOrFolder = 1 Then
        ScriptToCheckFileFolder = ScriptToCheckFileFolder & "exists file " & _
                                  Chr(34) & FileOrFolderstr & Chr(34) & Chr(13)
    Else
        ScriptToCheckFileFolder = ScriptToCheckFileFolder & "exists folder " & _
                                  Chr(34) & FileOrFolderstr & Chr(34) & Chr(13)
    End If
    ScriptToCheckFileFolder = ScriptToCheckFileFolder & "end tell" & Chr(13)
    FileOrFolderExistsOnMac = MacScript(ScriptToCheckFileFolder)
End Function

Pour tester l'existence d'un fichier le premier paramètre doit être 1, le second paramètre le chemin complet du fichier.

Pour tester l'existence d'un répertoire le premier paramètre doit être 2 (en tout cas différent de 1), le second le chemin du dossier.

Vraiment merci mais je suis une buse alors je n'arrive pas à adapter le code à ma macro…

Je ré-essayerai cet après et vous ferai un retour.

Il faut copier le code précédent dans un module, et remplacer Dir(...) par FileOrFolderExistsOnMac(...)

Exemple:

If Dir(Chemin & NomFichier) <> "" then...

devient

IF FileOrFolderExistsOnMac(Chemin & NomFichier) = True then...

Par contre, petite remarque :

Si le problème est d'enregistrer le fichier version X, le code n'est pas tout à fait correct, car vous enregistrez et ensuite vous vérifiez l'existence.

Il faut peut-être vérifier l'existence avant, et une fois le prochain numéro de version trouvé, enregistrer ?

Par exemple :

Extension = ".xlsx"
Chemin = "volumes:PRIX DE REVIENT:PRP:PRP_" & Range("F4") & ":"
NomOrigine = ActiveSheet.Range("F5") & "_" & Range("B3") & "_" & Range("F3") & "_" & "V"
NomFichier = NomOrigine & Format(i, "00") & Extension
'Affiche la boîte de message avec les boutons Oui et Non et récupère la réponse dans la variable 'Reponse'
Reponse = MsgBox("Créer nouvelle version de " & NomOrigine & " ?", vbQuestion +vbYesNo, "Sauvegarde")
'Si l'utilisateur a cliqué sur Oui
if Reponse = vbYes Then
    i = 0
    'Incrémentation de l'indice de version jusqu'à ce que le fichier n'existe pas
    Do 
         i= i+1
         NomFichier = NomOrigine & Format(i, "00") & Extension
    Loop Until FileOrFolderExistsOnMac(1, Chemin & NomFichier)=False
    'ATTENTION : vous sauvegarder au format .xlsx ce classeur (format 52 sous Mac)
    'mais ce classeur contient des macros, elles seront perdues avec ce format !
    'Pour enregistrer avec macro, l'extension doit être .xlsm et FileFormat:=53 (pour Mac)
    ThisWorkbook.SaveAs Filename:=Chemin & NomFichier, FileFormat:=52
    'vbCr = saut de ligne
    MsgBox "Le nouveau fichier a été enregistré sous :" & vbCr & NomFichier, vbInformation
end if
ThisWorkbook.Close

Encore une fois merci !

Le problème est en partie réglé mais la macro ne permet pas un enregistrement incrémenté.

Lorsque le fichier existe déjà, il ne me propose que de le remplacer et non pas une version "V02".

Et si je réponds "non", il bug, ne pouvant enregistrer.

Je m'arrache le peu de cheveux qu'il me reste...

Il semble que, en effet, la fonction FileOrFolderExistsOnMac ne prévoit pas les chemins avec des espaces, elle renvoie alors Faux pour un fichier existant.

Si j'ai bien compris, cela s'arrète toujours à la V1 : il ne reconnait pas votre fichier à cause, je pense, des espaces.

Je cherche encore, et vous tiens au courant (j'ai, moi aussi, besoin que cela fonctionne).

J'ai testé la fonction sur un Mac.

Elle fonctionne très bien, et les espaces ne posent pas de problème.

Il faut peut-être vérifier votre syntaxe ?

Exécutez votre code pas à pas pour vérifier les valeurs de Chemin, NomOrigine et NomFichier...

Votre chemin commence par "volumes:" ? N'est-ce pas "Macintosh HD:" plutôt ?

Bonjour,

J'ai creusé de mon côté.

Le chemin "Volumes:…" ne pose pas de problème (enregistrement direct sur serveur).

A priori, les espaces non plus.

Avec les codes suivants (en large partie ceux que vous m'avez donnés) :

Extension = ".xlsx"

Chemin = "volumes:PRIX DE REVIENT:PRP:"

NomOrigine = ActiveSheet.Range("F4") & "_" & Range("B2") & "_" & Range("F2") & "_" & "V"

NomFichier = NomOrigine & Format(i, "00") & Extension

'Affiche la boîte de message avec les boutons Oui et Non et récupère la réponse dans la variable 'Reponse'

Reponse = MsgBox("Créer une nouvelle version de " & NomOrigine & " ?", vbQuestion + vbYesNo, "Sauvegarde")

'Si l'utilisateur a cliqué sur Oui

If Reponse = vbYes Then

'Incrémentation de l'indice de version jusqu'à ce que le fichier n'existe pas

Do

i = i + 1

NomFichier = NomOrigine & Format(i, "00") & Extension

Loop Until FileOrFolderExistsOnMac(1, Chemin & NomFichier) = False

'ATTENTION : vous sauvegarder au format .xlsx ce classeur (format 52 sous Mac)

'mais ce classeur contient des macros, elles seront perdues avec ce format !

'Pour enregistrer avec macro, l'extension doit être .xlsm et FileFormat:=53 (pour Mac)

ThisWorkbook.SaveAs Filename:=Chemin & NomFichier, FileFormat:=52

'vbCr = saut de ligne

MsgBox "Le nouveau fichier a été enregistré sous :" & vbCr & NomFichier, vbInformation

End If

ThisWorkbook.Close

J'obtiens bien une V01 et une V02 en relançant la macro.

En revanche, si je la relance et qu'une V02 existe, il ne propose pas de V03 mais me confirme l'existence de la V02 et propose de la remplacer…

Peut-être le problème se situe-t-il au niveau des déclaratifs :

Sub PRP()

Dim Extension As String

Dim Chemin As String

Dim NomOrigine As String

Dim NomFichier As String

Dim style As Integer

Dim i As Integer

i = 1

Là, je suis carrément à court d'idées...

Et je suis donc encore une fois preneur des vôtres !


Rectificatif :

En déclaratif, c'est i = 0 (et non i = 1 sinon, la première version est identifiée V02) et la macro permet d'obtenir une V01.

En revanche, relancer la macro ne permet pas de V02 en cas d'existence de V01.

Une boîte apparaît me disant que la V01 existe déjà et proposant de la remplacer.

Si je clique "Oui", une nouvelle V01 est crée (qui remplace donc la précédente) et si je clique "Non", ça bug...

J'ai testé le code, et cela fonctionne parfaitement.

Il doit donc y avoir une erreur dans la syntaxe de la fonction FileOrFolderExistsOnMac pour qu'elle ne renvoie pas le bon résultat.

Avez-vous essayez de tester en pas à pas ?

J'ai copié votre fonction FileOrFolderExistsOnMac (mais je l'avoue, sans rien comprendre…) dans un module à part.

Donc je ne devrais pas avoir de souci de ce côté là…

Je vais chercher encore mais c'est plutôt désespérant, surtout si ça fonctionne pour vous !

Oui, cela fonctionne pour moi, mais j'enregistre au format extension = ".xlsm", FileFormat:=53

Essayez de lancer votre code en pas à pas :

Cliquez entre le Sub et le End sub de votre procédure, appuyez sur F8

(ou cliquez sur le bouton Pas à Pas détaillé de la barre d'outils debogage.)

La ligne en jaune est la ligne en cours : elle n'est pas encore exécutée.

Chaque fois que vous appuyez de nouveau sur F8 (ou bouton Pas à Pas), la ligne est exécuté et passe à la ligne suivante.

Cela vous permet de vérifier les valeurs de vos variables : en plaçant le curseur sur une variable (pas besoin de cliquer) vous obtenez une infobulle vous donnant sa valeur.

Vous pouvez aussi utiliser la fenêtre Exécution (Menu Affichage - Fenêtre Exécution) et taper dans cette fenêtre les instructions pour vérifier les valeurs :

? NomOrigine (tapez Entrée pour valider) vous affichera la valeur de la variable NomOrigine

? Chemin & NomFichier vous affichera le résultat

? FileOrFolderExistsOnMac(Chemin & NomFichier) vous affichera ce que renvoie la fonction (True or False)

(? = print)

Pour info : la fonction FileOrFolderExistsOnMac crée un script de type AppleScript et l'envoie au Mac grâce à la fonction MacScript.

Le script appelle l'application Finder du Mac (tell application "Finder") et lui demande si le fichier ou le dossier existe

(exists file/folder "chemin")

La réponse est vrai ou faux.

Rechercher des sujets similaires à "incrementer enregistrement"