Utiliser CurrentController.Frame pour une autre feuille ?

Bonjour,

Je dispose d’une interface graphique dans laquelle je rentre quelques données, puis, celles-ci sont copiées dans des cellules d’une feuille nommée “Contrat”.

Je souhaite ensuite que ces données soient ajoutées à un tableau des contrats en cours.
Pour faire cela, j’ai enregistré une macro. Dans celle-ci je retrouve notamment les méthodes :
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

Or, cette fonction fait que Calc effectue les modifications sur la feuille du Contrat, et non pas sur la liste des contrats en cours.

Ma question est donc : comment changer la feuille, tout en faisant fonctionner la macro enregistrée par Calc ?

Bonjour

La mémorisation de macro est en effet très limitée. Il devient rapidement nécessaire (et plus simple) de programmer “directement”.

Dans l’exemple suivant je déclare (instruction dim) deux variables oFeuilleContrat et oFeuilleListeContrats qui, comme leur nom l’indique, serviront à travailler avec deux feuilles différentes.

dim oFeuilleContrat as object, oFeuilleListeContrats as object

Avec l’instruction suivante :

oFeuilleContrat = thiscomponent.sheets.getByName("Contrats")

on va rechercher dans le classeur (thiscomponent) et la collection des feuilles (sheets) celle qui se nomme Contrats.

Avec l’instruction suivante :

oFeuilleContrat.getCellRangeByName("A1").string = "j'écris du texte"

On écrit directement dans la cellule A1 de la feuille Contrats

Avec l’instruction suivante :

oCell = oFeuilleContrat.getCellRangeByName("A2")

On utilise une variable oCell (comme les autres variables le nom est libre, hormis quelques contraintes de syntaxe) qui va nous permettre de manipuler la cellule A2 de la feuille Contrats (ici on entre une valeur dans la cellule)

Avec l’instruction suivante :

oFeuilleListeContrats.getCellRangeByName("C1").value = oCell.value

On modifie la cellule C1 de l’autre feuille en lui affectant la valeur de la cellule A2 de la première feuille…

Ci-dessous le code complet

sub EcrireFeuille

dim oFeuilleContrat as object, oFeuilleListeContrats as object
dim oCell as object

oFeuilleContrat = thiscomponent.sheets.getByName("Contrats")
oFeuilleListeContrats = thiscomponent.sheets.getByName("Liste des contrats")

oFeuilleContrat.getCellRangeByName("A1").string = "j'écris du texte"

oCell = oFeuilleContrat.getCellRangeByName("A2")
oCell.value = 2310

oFeuilleListeContrats.getCellRangeByName("C1").value = oCell.value

end sub

Voir le classeur ecrireFeuille.ods

Notre wiki regroupe différentes ressources permettant d’apprendre le langage, en particulier celle-ci.

Cordialement

Bonjour, merci beaucoup pour ta réponse très complète.

Si j’utilisais l’enregistrement de Macro c’est parce que j’insérais une ligne dans le tableau, puis copiais dedans, les formules de ligne du dessous.

J’ai fini par trouver qu’ajouter les lignes suivantes, règle le soucis de feuille active
feuille = ThisComponent.Sheets.GetByName("contrats_en_cours")
ThisComponent.CurrentController.ActiveSheet = feuille

Ensuite je remplis les cellules avec la méthode décrite dans ton message