Macro exécutée au chargement d'un doc

Bonjour,

Suite à une perte de fichiers, la récupération de données m’a rendu des fichiers nommés de façon abstraite (file000233.xlsx). J’ai donc besoin de renommer tous les fichiers d’après les valeurs de certaines cellules (nom du client, numéro de facture).
J’ai une macro qui fonctionne si j’ouvre moi-même les fichiers et que je lance la macro pour chacun d’entre eux.
Ayant plusieurs milliers de fichiers, j’ai besoin d’exécuter le script sur un dossier entier, ou encore automatiquement à l’ouverture des fichiers.
Si j’assigne cette même fonction au chargement du document (via outils-personnaliser-événements), j’obtiens au lancement de la macro une erreur 'Erreur d’exécution BASIC. Valeur de propriété incorrecte" à la première ligne, celle de la définition de la fonction.

La méthode n’est-elle pas bonne, ou dois-je modifier le script pour qu’il fonctionne sur l’événement "chargement du document terminé’ ?

Précision : La macro est enregistrée dans “Mes macros et boîtes de dialogue” et non dans chaque document.

Merci pour toute aide éventuelle, je suis pauvre en Basic libreOffice… B-)

function getFullRep(sPath As String) As String
Dim cpt As Integer
Dim buf As String
Const SLASH = "/"
   buf = ""
   for cpt = Len(sPath) to 1 step -1
      if Mid(sPath, cpt, 1) = SLASH then
          buf = Left(sPath, cpt)
         exit for
       end if
   next
   getFullRep = buf
end function
 
Sub Main
 
Dim oDoc as Object
Dim sG2 as String
Dim sO2 as String
Dim sO as String
Dim sPathBackupFolder as String
 
Dim filespec As string
Dim laDate As String
Dim myfilename As String
Dim oFeuille As Object
Dim sNomFeuille As String
 
oDoc = ThisComponent
 
sPathBackupFolder = getFullRep (oDoc.location)
 
oFeuille = oDoc.getCurrentController().getActiveSheet()
 
sNomFeuille = oFeuille.getName()
laDate = Format(Now(),"YYMMDDhhmmss")
 
If oFeuille.GetCellRangeByName("G14").String <>"" Then
sG2 = oFeuille.GetCellRangeByName("G14").String
sO2 = oFeuille.GetCellRangeByName("A15").String
	else
sG2 = oFeuille.GetCellRangeByName("G15").String
sO2 = oFeuille.GetCellRangeByName("A16").String
	End If
sO = Replace(sO2, "Facture N°", "")
 
'Chemin et nom de fichier composé
myfilename = sPathBackupFolder+sG2+" - "+sO+" - "+laDate+".ods"
 
'Enregistrer sous
dim document   as object
dim dispatcher as object
 
' ----------------------------------------------------------------------
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
' ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = ConvertToUrl(myfilename) 'On converti le chemin
args1(1).Name = "FilterName"
args1(1).Value = "calc8"
 
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
oDoc.store
oDoc.close(True)
End Sub

bonjour !

j’ai fait un essai comme vous l’avez décrit (évènement au chargement de document enregistré dans “Mes macros …”) … j’ai mis un message dans la macro … et cela fonctionne parfaitement !

pouvez-vous décrire votre configuration ? (Système opérationnel, version de L.O. ou autre)

bonne journée
Philippe

Mais si j’utilise votre macro … cela plante L.O. !!!

je suis sous Windows 7 avec la dernière version L.O.

Hum … j’ai bien cru avoir tout perdu avec ce plantage !!!

Une chose m’inquiète un peu … c’est que vous fermer à la fin le fichier que vous êtes entrain d’ouvrir ! …
En enlevant cette dernière ligne de votre macro, cela fonctionne parfaitement (pour autant que je puisse juger car le fichier que j’utilise pour tester n’a rien à voir avec vos factures !)

Bonne continuation,
Philippe

Mais cela va être compliqué de maintenir ouverts beaucoup de tableur à la fois !

Vous pourriez avoir une variable global “tableurAnterieur” …

’ au début des macros
global docAnterieur as oobject
’ … quelque part dans Main (à la fin par exemple)
if not isNull(docAnterieur) then docAnterieur.close(true)
docAnterieur = oDoc

j’ai testé et ici ça a marché … il n’y a que le dernier tableur qui reste ouvert !
Philippe

Bonjour @Fletch

Puisque tu dois travailler sur un dossier mon conseil serait de “boucler” sur ce dernier (voir l’aide) pour ouvrir chaque document via l’instruction loadComponentFromURL. Tu pourras dès lors réaliser ce que tu souhaites.

Cordialement

Si c’est pour renommer des fichiers, pourquoi ne pas passer par du powershell qui lirait un CSV ?

en effet on doit pouvoir

  • créer un tableau de strings
  • boucle sur les tableurs
    • ouvrir chaque tableur
      • récupérer les infos du tableur pour former le nom correct
    • fermer le tableur ouvert
    • écrire la commande “ren … …” dans le tableau de strings
  • enregistrer le tableau de strings dans un fichier .bat
  • exécuter le .bat

Bonjour,

Merci à tout le monde pour vos conseils et suggestions qui m’ont aidé à trouver une solution fonctionnelle.
Et désolé du retour un peu tardif, j’ai eu peu de temps cette semaine pour gérer ça, et ai un peu tourné en rond encore sur des détails de syntaxe.

Du coup, j’ai un peu nettoyé le code comme suit :

function renomme

Dim oDoc as Object
Dim sClientCell as String
Dim sFactureCell as String
Dim sFactureNr as String
Dim sChemin as String
Dim sDate As String
Dim sFichierNom As String
Dim oFeuille As Object
Dim sFeuilleNom As String

oDoc = ThisComponent

' Chemin en dur, suffisant pour mon opération
sChemin = "file:///C:/Users/oim/Desktop/factures/"

oFeuille = oDoc.getCurrentController().getActiveSheet()
sFeuilleNom = oFeuille.getName()

'servira d'identifiant unique pour le nom de fichier, en cas de doublon de numéro de facture
sDate = Format(Now(),"YYMMDDhhmmss")
 
' récupère les valeurs utiles
sClientCell = oFeuille.GetCellRangeByName("G13").String
sFactureCell = oFeuille.GetCellRangeByName("A14").String

' extrait le numéro de facture de la cellule concernée
sFactureNr = Replace(sFactureCell, "Facture N°", "")
sFichierNom = sChemin+sFactureNr+" - "+sClientCell+" - "+sDate+".xlsx"


Dim oDocument   as Object
Dim oDispatcher as Object

oDocument   = oDoc.CurrentController.Frame
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args1(1) as New com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = ConvertToUrl(sFichierNom)
args1(1).Name = "FilterName"
args1(1).Value = "calc8"

oDispatcher.executeDispatch(oDocument, ".uno:SaveAs", "", 0, args1())
oDoc.store
oDoc.close(True)
End function

Cette macro est appelée par un petit batch système (windows) :

@echo off
cd C:\Program Files\LibreOffice\program\

for /r "C:\Users\oim\Desktop\source\" %%i in (*.xlsx) do (
scalc.exe  %%i macro:///Standard.Module1.renomme()

)

C’était en fait plus simple que je ne l’avais envisagé au départ, mais le tout était de trouver une méthode ‘propre’.

Merci tout plein !