[Résolu][Base] Fermeture MsgBox relance macro ligne 0

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Eric99
Membre hOOnoraire
Membre hOOnoraire
Messages : 124
Inscription : 17 janv. 2020 10:22

[Résolu][Base] Fermeture MsgBox relance macro ligne 0

Message par Eric99 »

Bonsoir,
A l'aide de la macro ci-dessous j'effectue une sauvegarde sur une clé USB dédiée. Je m'aperçois que certaines personnes qui utilisent le logiciel oublient de connecter la clé malgré les mises en garde que j'ai noté sur :
- le Bouton "Connecter la clé USB nommée Sauvegarde..."
- la MsgBox qui s'ouvre "IMPORTANT...".

Aussi je voudrais , si c'est possible, avoir une boucle à la fermeture de la MsgBox qui reprendrait la macro à la ligne 0 et cela tant que la clé n'est pas connectée. J'ai déjà supprimé le "Exit sub" ligne 44 qui améliore mon résultat puis j'ai introduit ligne 46 la commande suivante "On Error GoTo 0" mais cela ne donne aucun résultat.

Si une solution existe auriez-vous une idée de la manière dont je dois m'y prendre ?

Merci de votre aide.
Éric

Code : Tout sélectionner

REM  *****  BASIC  ***** Nouvelle version sauvegarde vers clé USB
option explicit


' Définir ici les noms nécessaires au chemin de la clé USB et le nom du sous-répertoire des sauvegardes 
'sous la forme media/nom_ordinateur/nom_clé_USB et le sous répertoire de sauvegarde
Global Const REP_MEDIA = "media" 'sous Ubuntu ce nom regroupe l'ensemble des clés USB ou disque externes...
'Récupération du nom_ordinateur avec la fonction Environ : repUser = Environ ("USER") voir ci-dessous
Global Const REP_USB = "Sauvegarde" ' nom de la clé USB
Global Const SOUS_REP_SAVE = "SaveGestion" 'Répertoire de sauvegarde sur la clé USB

' --------------------------------------------------------- 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 repUser as string
dim buf as string, cpt as integer
dim iRet as integer, iVersion as integer

	repUser = Environ ("USER") ' récupération du nom de l'ordinateur

	' Vérifier l'accès au répertoire des sauvegardes
	iRet = acCreRep(Rep_Media & "/" & RepUser & "/" & Rep_USB & "/", SOUS_REP_SAVE) 'chemin de la sauvegarde
	if iRet = -1 then
				  	 msgBox(Chr(10) & Chr(10) & Chr(10) & "IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT" & Chr(10) & Chr(10) _
			                        & "        La clé USB intitulée 'SAUVEGARDE' n'est pas connectée." & Chr(10) & Chr(10) _
		                        	& "                                      BRANCHEZ-LA " & Chr(10) & Chr(10) _
		                        	& "      patientez jusqu'à l'ouverture de la clé puis cliquez sur OK" & Chr(10) & Chr(10) _
		                           	& Chr(10) & Chr(10) _
									&	"                                           Merci.")
		'	exit sub	'						>>>>>>> SORTIE >>>>>>>
	end if
'	On Error GoTo 0
	oDoc = thiscomponent
	repDoc = Rep_Media & "/" & RepUser & "/" & Rep_USB & "/"  'chemin de la clé USB
	repSauv = repDoc & SOUS_REP_SAVE
	
	ficNom = acGetFileName(oDoc.getParent.getUrl)
	ficExt = acGetFileExt(oDoc.getParent.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())' ancienne formule ***************
	oDoc.Parent.storeToUrl(sUrl2, tArgs()) ' nouvelle formule
	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(Rep_Media & "/" & RepUser & "/" & Rep_USB & "/", 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 = thisDatabaseDocument	' 18.3.2020
	buf = "" 				' *
	sPath = oDoc.getUrl		' 18.3.2020
	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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Eric99 le 28 juin 2022 19:02, modifié 1 fois.
LibO 24.2.1 UbuntuMATE 22.04
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Base] Fermeture MsgBox relance macro ligne 0

Message par zeguedon »

Bonjour,

Est-ce que tu peux tester sur une copie du document :

Code : Tout sélectionner

iRet = -1
Do While iRet = -1 'Tant que iRet = -1 faire ce qui suit
	iRet = acCreRep(Rep_Media & "/" & RepUser & "/" & Rep_USB & "/", SOUS_REP_SAVE) 'chemin de la sauvegarde
	if iRet = -1 Then
		msgBox(Chr(10) & Chr(10) & Chr(10) & "IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT" & Chr(10) & Chr(10) _
		& "        La clé USB intitulée 'SAUVEGARDE' n'est pas connectée." & Chr(10) & Chr(10) _
		& "                                      BRANCHEZ-LA " & Chr(10) & Chr(10) _
		& "      patientez jusqu'à l'ouverture de la clé puis cliquez sur OK" & Chr(10) & Chr(10) _
		& Chr(10) & Chr(10) _
		&	"                                           Merci.")
	end if	
Loop ' retourner à Do
à la place de :

Code : Tout sélectionner

' Vérifier l'accès au répertoire des sauvegardes
	iRet = acCreRep(Rep_Media & "/" & RepUser & "/" & Rep_USB & "/", SOUS_REP_SAVE) 'chemin de la sauvegarde
	if iRet = -1 then
				  	 msgBox(Chr(10) & Chr(10) & Chr(10) & "IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT   IMPORTANT" & Chr(10) & Chr(10) _
			                        & "        La clé USB intitulée 'SAUVEGARDE' n'est pas connectée." & Chr(10) & Chr(10) _
		                        	& "                                      BRANCHEZ-LA " & Chr(10) & Chr(10) _
		                        	& "      patientez jusqu'à l'ouverture de la clé puis cliquez sur OK" & Chr(10) & Chr(10) _
		                           	& Chr(10) & Chr(10) _
									&	"                                           Merci.")
		'	exit sub	'						>>>>>>> SORTIE >>>>>>>
	end if
@+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Eric99
Membre hOOnoraire
Membre hOOnoraire
Messages : 124
Inscription : 17 janv. 2020 10:22

Re: [Base] Fermeture MsgBox relance macro ligne 0

Message par Eric99 »

zeguedon a écrit : 28 juin 2022 00:09 Bonjour,
Est-ce que tu peux tester sur une copie du document :
Oui c'est tout à fait cela que je voulais. Merci.
LibO 24.2.1 UbuntuMATE 22.04