Automatisation enregistrement sur Word

Antonio Grassi

Membre enregistré
22 Juillet 2013
5
0
74
Bonjour, je suis tout nouveau ici, je ne sais même pas si je suis au bon endroit et je ne connais pas encore le fonctionnement de ce forum, mais: je suis à la recherche d'un moyen pour automatiser une action très répétitive que je réalise plusieurs fois par jour. Voici ce que je veux automatiser: j'ai un fichier word, .doc, assez lourd que je veux enregistrer à la demande avec une seule touche de mon clavier (ça je sais le faire) et où systématiquement l'action enregistre une copie nouvelle du fichier avec un nouveau nom (la date et l'heure, ou chiffre avec incrementation) sans avoir à le taper à la main à chaque fois et en gardant intacte la version antérieur.
Ma configuration: mac os 10.6.8, word 2004. Merci d'avance. Antonio
 
Bonjour et bienvenue sur les forums de MacGénération !

Je ne suis pas en mesure de faire des tests et vérifications actuellement mais, pour ma part, je ferais ça par le biais d'une macro affectée à un bouton dans une barre d'outils ou/et à un raccourci clavier.

Ceci dit, selon l'utilisation que tu peux être amené à en faire, les sauvegardes Time Machine peuvent suffire, sans aucun effort ou manip spécifique.

Rappel en passant : fais gaffe avec les documents longs régulièrement modifiés, tu peux te trouver un jour avec un document corrompu et difficilement récupérable. Il peut être prudent de fractionner le document avec le système de "Document-maître" et des "sous-documents".
 
Time machine est une bonne idée, merci, mais pas très pratique. Ce que je cherche existe pour OpenOffice, c'est une macro, mais malheureusement je ne suis pas capable de la traduire pour Word, et c'est Word qu'il me faut…
Voici la macro OpenOffice:
Bloc de code:
REM  *****  BASIC  *****
option explicit

' --------------------------------------------------------------------
' Module "aMain", procédure "sub main"
' pour compatibilité avec mon raccourci clavier (CTRL MAJ M)
' --------------------------------------------------------------------
sub main()
	acIncrementSave_v2
end sub

' Définir ici le nom du sous-répertoire des sauvegardes
  const SOUS_REP_SAVE = "zxSaveIncr"

' --------------------------------------------------------- 23/08/2009
' Sauvegarder ce document sous un nom composé de :
' <nom_de_ce_doc> + "_" + <numéro_de_sauvegarde>
' --------------------------------------------------------------------
' VERSION 2. - Le numéro de sauvegarde est obtenu ici par
' récupération du numéro de la précédente sauvegarde incrémentée.
' --------------------------------------------------------------------
' DEPENDANCES : 
' Fonctions acGetFileExt, acGetFilesList, acDecoupePath, acThisRep
' acCreRep
' --------------------------------------------------------------------
sub acIncrementSave_v2()
dim oDoc as object
dim tArgs(0) as new com.sun.star.beans.PropertyValue
dim sUrl1 as string, sUrl2 as string
dim ficExt as string, ficNom as string
dim repDoc as string, repSauv as string
dim buf as string, cpt as integer
dim iRet as integer, iVersion as integer

	' Vérifier l'accès au répertoire des sauvegardes
	iRet = acCreRep(acThisRep, SOUS_REP_SAVE)
	if iRet = -1 then
		msgBox("ECHEC création répertoire """ & SOUS_REP_SAVE & """" _
			& "Ce répertoire n'existe pas, et ne peut pas être créé." _
			& "Créez-le manuellement avant de recommencer.", 16, _
			"####   Fonction acCreRep   ####")
		exit sub	'						>>>>>>> SORTIE >>>>>>>
	end if

	oDoc = thiscomponent
	repDoc = acThisRep
	repSauv = repDoc & SOUS_REP_SAVE
	
	ficNom = acGetFileName(oDoc.getUrl)
	ficExt = acGetFileExt(oDoc.getUrl)
	
	' Chemin des fichiers déjà sauvegardés, à rechercher
	buf = convertFromUrl(repSauv & "/" & ficNom)

	' Numéro de la dernière sauvegarde
	iVersion = acGetIncrement(buf)
	if (iVersion = 0) then
'		msgBox("Aucune sauvegarde incrémentée, on part de zéro")
	else
'		msgBox("Index de la nouvelle sauvegarde : " & iVersion)
	end if

	sUrl2 = repSauv & "/" & ficNom _
		& "_" & cStr(iVersion) & "." & ficExt	
		
	oDoc.storeToUrl(sUrl2, tArgs())
	msgBox("Document sauvegardé sous " & chr(13) _
		 & acDecoupePath(convertFromUrl(sUrl2), 50)
end sub

'---------------------------------------------------------- 20/08/2009
' Cherche les fichiers 'nomFic' + "_" + 'valeur'
' Retourne la valeur maxi incrémentée de 1
'---------------------------------------------------------------------
function acGetIncrement(nomFic) as integer
dim bufTmp as string
dim selDeb as integer, selFin as integer
dim iRef as integer, i as integer
dim sNum as string

	iRef = -1
	nomFic = nomFic & "_*" 
	bufTmp = dir(nomFic, 0)
	do while (len(bufTmp))
		'chercher "_" à partir de la fin
		for i = len(bufTmp) to 1 step -1
			if (mid(bufTmp,i,1) = "_") then
				selDeb = i+1
				exit for
			end if
		next i
		selFin = instr(selDeb, bufTmp, ".")
		sNum = mid(bufTmp,selDeb, selFin-(selDeb-1))
		i = val(sNum)
		if (i > iRef) then iRef = i
		' Au suivant
		bufTmp = dir()
	loop 
	acGetIncrement = iRef +1
end function

'---------------------------------------------------------------------
' Vérifier l'accès au répertoire des sauvegardes
'---------------------------------------------------------------------
sub verifSousRep()
dim iRet as integer

	iRet = acCreRep(acThisRep, SOUS_REP_SAVE)
	if iRet = -1 then
		msgBox("ECHEC création répertoire """ & SOUS_REP_SAVE & """", 16, _
			"* acCreRep *")
	elseif iRet = 0 then
		msgBox("Le répertoire """ & SOUS_REP_SAVE & """ existe déjà !",, _
			"* acCreRep *")
	elseif iRet = 1 then
		msgBox("Répertoire """ & SOUS_REP_SAVE & """ créé !",, _
			"* acCreRep *")
	else
		msgBox("Status retourné """ & iRet & """ inattendu !",, _
			"* acCreRep *")
	end if
end sub

'******************************************************* 07/11/08 ***
'*** Retourne l'extension du fichier, sans le point 
'*** Ex. : buf = acGetFileExt(oDoc.getUrl)
'********************************************************************
function acGetFileExt(sUrl As String) As String
Dim cpt As Integer
Const POINT = "."
	for cpt = Len(sUrl) to 1 step -1
		if Mid(sUrl, cpt, 1) = POINT then
			acGetFileExt = Mid(sUrl, cpt+1)
			exit function
		end if
	next cpt
	' Si pas de POINT, on retourne tout
	acGetFileExt = sUrl
end function

'******************************************************* 07/11/08 ***
'*** Retourne le nom du fichier avec son extension 
'*** Ex. : buf = acGetFileName(oDoc.getUrl)
'********************************************************************
function acGetFileName(sUrl As String) As String
Dim cpt As Integer
Const SLASH = "/"
	for cpt = Len(sUrl)  to 1 step -1
		if Mid(sUrl, cpt, 1) = SLASH then
			acGetFileName = Mid(sUrl, cpt +1)
			exit function
		end if
	next cpt
	' Si pas de SLASH, on retourne tout
	acGetFileName = sUrl
end function

'---------------------------------------------------------- 12/07/2009
' Retourne bufIn avec les codes de contrôle balisés
' --------------------------------------------------------------------
function acDumpBuf(bufIn as string) as string
dim cpt as long
dim car as string
dim bufOut as string

	for cpt = 1 to len(bufIn)
		car = mid(bufIn,cpt,1)
		if ((car < " ") or (car > "~")) then
			bufOut = bufOut & "<" & asc(car) & ">"
		else
			bufOut = bufOut & car
		end if
	next cpt
	acDumpBuf = bufOut
end function

' --------------------------------------------------------- 12/07/2009
' Découpe un chemin afin de pouvoir 
' l'afficher ensuite sur deux (ou trois) lignes
' --------------------------------------------------------------------
function acDecoupePath(sPath as string, iMax as integer) as string
dim cpt as integer, cptSep as integer, lgr as integer
dim tPos() as integer, iCoupe as integer
dim buf as string, bufTmp as string, bufOut as string


	if (len(sPath) = 0) then exit function
	acDecoupePath = convertFromUrl(sPath) ' Par défaut

	' Pour avoir un affichage propre,
	' je reconvertis dans la syntaxe de l'OS
	' et j'ajoute un séparateur de fin pour le découpage
	buf = convertFromUrl(sPath) & getPathSeparator
	
	' Mémoriser positions des séparateurs dans tPos()
	for cpt = 1 to len(buf)
		bufTmp = mid(buf,cpt,1)
		if ((bufTmp = "/") or (bufTmp = "\")) then 
			cptSep = cptSep + 1
			redim preserve tPos(cptSep)
			tPos(cptSep) = cpt
		end if
	next cpt

	iCoupe = 1
	for cpt = lBound(tPos) to uBound(tPos)
		lgr = 1 + tPos(cpt) - iCoupe
		if (lgr > iMax) then
			' Longueur dépassée, retour au séparateur précédent
			lgr = 1 + tPos(cpt-1) - iCoupe
			if (lgr < 1) then exit function	' >>>>>>> SORTIE >>>>>>>
			
			bufTmp = mid(buf, iCoupe, lgr-1) & chr(13) & "     "
			bufOut = bufOut & bufTmp
			iCoupe = tPos(cpt-1)
		end if
	next cpt
	
	' Ajouter ce qui reste
	bufOut = bufOut & mid(buf, iCoupe, tPos(cptSep)-iCoupe)
	acDecoupePath = bufOut
end function

' --------------------------------------------------------- 24/08/2009
' Retourne l'Url du répertoire de ce document
' y compris le dernier séparateur (/)
' --------------------------------------------------------------------
function acThisRep() As String
dim oDoc as object			' 24/08/09
dim sPath as string, buf As string
dim cpt as integer
const SLASH = "/"
	
	oDoc = thisComponent	' 24/08/09
	buf = "" 				' *
	sPath = oDoc.getUrl		' *
	for cpt = Len(sPath) to 1 step -1
		if Mid(sPath, cpt, 1) = SLASH then
	    	buf = Left(sPath, cpt)
			exit for
	    end if
	next
	acThisRep = buf
end function

' --------------------------------------------------------- 23/08/2009
' Créer le répertoire sRep2 dans sRep
' --------------------------------------------------------------------
function acCreRep(sRep as string, sRep2 as string) as integer
dim buf as string
	buf = dir(sRep & sRep2,16)
	if (buf = "") then	
		on error goto errMkDir
		mkDir sRep & sRep2
		on error goto 0
		acCreRep = 1	' sRep2 créé
	else
		acCreRep = 0	' sRep2 existe déjà
	end if
exit function
errMkDir:
	on error goto 0
	acCreRep = -1	' Echec
	exit function
end function

MERCI BEAUCOUP
 
Dernière édition par un modérateur:
Comme vu, je ne suis pas en situation de faire des tests et essais actuellement. En ce qui me concerne, il va falloir patienter quelques jours, désolé...
 
Je ne vois pas ce que Time Machine a de "peu pratique", tu récupères la version de ton fichier à la date que tu veux, sans même à devoir te préoccuper du nom de fichier (du moins d'un quelconque N° d'incrémentation) de la même manière que tu le ferais de la version courante depuis le Finder, le seul problème, c'est que tu n'as qu'une semaine pour récupérer les sauvegardes horaires, et un mois pour les journalières, mais bon &#8230;
 
Assez d'accord avec Pascal 77 , TM est une voie simple

et d'ailleurs tu peux aussi envisager de raffiner en construisant des scripts persos une macro word
ou
autre angle niveau mac
du genre des scripts OSX , par exemple Applescript ou automator, pour des actions de duplication- deplacement renommage de fichiers
 
Merci Pascal et Aliboron
J'ai essayé Time Machine mais c'est vrai que pour ce que je vais faire ça ne colle pas trop. Compliqué à expliquer ici. J'ai aussi essayé de refaire la macro de OpenOffice sur Word, mais je ne me connais pas assez. Dommage, c'est exactement ce qui me faudrait… Une question: comment faire insérer la fonction "date et heure" sur le nom d'un fichier au moment de l'enregistrement? Ou idem pour un fonction d'incrémentation du type a+(n+1)?
Merci beaucoup tout de même
 
Re bonjour
Voici une autre macro que j'ai trouvé sur internet, mais je n'arrive pas à la faire tourner:
Bloc de code:
Sub DvpSauvegardeIncrementaleAuto()
    aDateSauve = Date
    aTimeSauve = Time
    aSuffixeDeDate = Trim(Str(Year(aDateSauve))) + "-"
    If Month(aDateSauve) < 10 Then
        aSuffixeDeDate = aSuffixeDeDate + "0" + Trim(Month(aDateSauve)) + "-"
    Else
        aSuffixeDeDate = aSuffixeDeDate + Trim(Month(aDateSauve)) + "-"
    End If
    If Day(aDateSauve) < 10 Then
        aSuffixeDeDate = aSuffixeDeDate + "0" + Trim(Day(aDateSauve)) + "-"
    Else
        aSuffixeDeDate = aSuffixeDeDate + Trim(Day(aDateSauve)) + "-"
    End If
    If Hour(aTimeSauve) < 10 Then
        aSuffixeDeDate = aSuffixeDeDate + "0" + Trim(Hour(aTimeSauve)) + "-"
    Else
        aSuffixeDeDate = aSuffixeDeDate + Trim(Hour(aTimeSauve)) + "-"
    End If
    If Minute(aTimeSauve) < 10 Then
        aSuffixeDeDate = aSuffixeDeDate + "0" + Trim(Minute(aTimeSauve))
    Else
        aSuffixeDeDate = aSuffixeDeDate + Trim(Minute(aTimeSauve))
    End If
 
    '// Cas du document jamais sauvegardé
    If (ActiveDocument.Path = "") And (InStr(ActiveDocument.Name, "Document") = 1) And (InStr(ActiveDocument.Name, ".") = 0) Then
        ActiveDocument.SaveAs2 FileName:="Doc" + aSuffixeDeDate + ".docx", FileFormat:=wdFormatXMLDocument
        Exit Sub
    End If
 
 
    '// Cas du document sauvegardé mais qui ne finit pas une date et/ou une heure correctes
    If (ActiveDocument.Path <> "") And (InStr(ActiveDocument.Name, ".") > 0) Then
        aName = Mid$(ActiveDocument.Name, 1, InStr(ActiveDocument.Name, ".") - 1)
        If Len(aName) < Len("2013-07-24-00-00") Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        aNameDeRecup = Mid$(aName, 1, Len(aName) - Len("2013-07-24-00-00"))
        aDateATester = Mid$(aName, Len(aName) - Len("2013-07-24-00-00") + 1)
        If (InStr(aDateATester, "-") = 0) Or (Val(aDateATester)) > 2099 Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        aDateATester = Mid$(aDateATester, InStr(aDateATester, "-") + 1)
        If (Val(aDateATester)) > 12 Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        aDateATester = Mid$(aDateATester, InStr(aDateATester, "-") + 1)
        '// Ici on ne teste pas la validité du jour du mois mais uniquement si la plage correspond à une valeur de n'importe quel mois
        If (Val(aDateATester)) > 31 Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        aDateATester = Mid$(aDateATester, InStr(aDateATester, "-") + 1)
        If (Val(aDateATester)) > 23 Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        aDateATester = Mid$(aDateATester, InStr(aDateATester, "-") + 1)
        If (Val(aDateATester)) > 59 Then
            MsgBox "Nom de fichier incorrect", vbOKOnly + vbCritical
            Exit Sub
        End If
        '// Donc ici on a un fichier dont le nom est contenu dans aNameDeRecup suivi d'une chaine du type "2013-07-24-00-00" ==> donc on considere que c'est bon
 
        ActiveDocument.SaveAs2 FileName:=ActiveDocument.Path + "\" + aNameDeRecup + aSuffixeDeDate + ".docx", FileFormat:=wdFormatXMLDocument
        Exit Sub
    End If
End Sub
 
Dernière édition par un modérateur:
Bonjour
Merci pour tout. J'ai trouvé ce qui n'allait pas, j'ai patogé un peu, mais c'est bon, ça marche, j'ai l'enregistrement automatique avec la date et l'heure du moment de l'enregistrement, ça marche très bien sur Word 2004 peut-être d'autres.

Ça s'appel "Registro", la voici:

Bloc de code:
Sub Registro()
ActiveDocument.SaveAs FileName:=Format(Date, "dd") & "/" & Format(Date, "mm") & "/" & Format(Date, "yyyy") & "–" & Format(Time, "hh") & "h/" & Format(Time, "nn") & ".doc"
End Sub
La question est résolue.
Merci à tous

Sub Registro()
ActiveDocument.SaveAs FileName:=Format(Date, "dd") & "/" & Format(Date, "mm") & "/" & Format(Date, "yyyy") & "–" & Format(Time, "hh") & "h/" & Format(Time, "nn") & ".doc"
End Sub