Macro sous Calc différence de résultats entre exécution directe et exécution en mode pas à pas

Bonjour,

je n’obtiens pas le même résultat lorsque j’exécute une macro en mode direct
(appelée par un bouton) et en mode débogage (pas à pas) par l’appui sur la
touche F8.

Dans le premier cas les colonnes ne sont pas masquées et la zone
d’impression est trop importante, cela imprime toute les colonnes

Dans le deuxième cas les colonnes sont cachées et la zone d’impression est
alors correcte

Avez-vous une idée ?

Ci-dessous la macro en question

sub Print_P1_P3

' Definition des variables

dim MonDocument as object, MesFeuilles as Object

dim MaFeuille as Object, MaCellule as Object

dim MaZone as Object, MesColonnes as Object, UneColonne as Object

dim Dispatcher as object

dim NombreLigne as Integer

dim AdresseColonnes as String, AdressePrint as String

dim Props1(1) as new com.sun.star.beans.PropertyValue

dim Props2(1) as new com.sun.star.beans.PropertyValue

dim Props3(3) as new com.sun.star.beans.PropertyValue

dim Props5(0) as new com.sun.star.beans.PropertyValue

dim AdrZones(1) As New com.sun.star.table.CellRangeAddress

' Initialisation des variables de la feuille

MonDocument = ThisComponent

MesFeuilles = MonDocument.Sheets

MaFeuille = MesFeuilles.getByName("1er trimestre")

MonDocument = ThisComponent.CurrentController.Frame

Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

' Sélection de la première cellule

Props5(0).Name = "ToPoint"

Props5(0).Value = "$A$1"

Dispatcher.executeDispatch(MonDocument, ".uno:GoToCell", "", 0, Props5())

' Détermination du nombre de ligne à imprimer

NombreLigne = 0

Do

NombreLigne = InputBox("Donne moi le nombre d'élèves de la classe !")

Loop While Not NombreLigne >0

NombreLigne = NombreLigne * 2 + 4

' Masquage des colonnes inutiles

MonDocument = ThisComponent

AdresseColonnes = "$C$1:$BV$" & NombreLigne

MaZone = MaFeuille.getCellRangeByName(AdresseColonnes)

MesColonnes = MaZone.Columns

MesColonnes.IsVisible = False

' Impression de la zone désirée

AdressePrint = "$A$1:$DF$" & NombreLigne

MaZone = MaFeuille.getCellRangeByName(AdressePrint)

AdrZones(0) = MaZone.RangeAddress

MaFeuille.PrintAreas = AdrZones()

'Définition du format de page

Dim PageStyleFamille as Object, PageStyle as Object

PageStyleFamille=MonDocument.StyleFamilies.getByName("PageStyles")

PageStyle=PageStyleFamille.getByName("PageStyle_1ère Période")

with PageStyle

   .ScaleToPagesX=1 'nombre de page horizontales

   .ScaleToPagesY=1 'nombre de page verticales

   .IsLandscape=true 'orientation de la page

   .width=29700

   .height=21000

end with

' Paramétrage final de l'impression

MonDocument = ThisComponent.CurrentController.Frame

Props3(0).Name = "Copies"

Props3(0).Value = 1

Props3(1).Name = "RangeText"

Props3(1).Value = "1"

Props3(2).Name = "Collate"

Props3(2).Value = false

Props3(3).Name = "Wait"

Props3(3).Value = True

Dispatcher.executeDispatch(MonDocument, ".uno:Print", "", 0, Props3())

' Ré-afichage des colonnes

MonDocument = ThisComponent

MaZone = MaFeuille.getCellRangeByName(AdresseColonnes)

MesColonnes = MaZone.Columns

MesColonnes.IsVisible = True

' Sélection de la nouvelle cellule

MonDocument = ThisComponent.CurrentController.Frame

Props5(0).Name = "ToPoint"

Props5(0).Value = "$A$1"

Dispatcher.executeDispatch(MonDocument, ".uno:GoToCell", "", 0, Props5())

' Sélection de la cellule de la dernière semaine de la page précédente

MonDocument = ThisComponent

MaCellule = MaFeuille.getCellRangeByName("$BN$5")

MonDocument.currentController.Select(MaCellule)

' Placement du curseur sur la bonne cellule

MonDocument = ThisComponent.CurrentController.Frame

Props1(0).Name = "By"

Props1(0).Value = 1

Props1(1).Name = "Sel"

Props1(1).Value = false

Dispatcher.executeDispatch(MonDocument, ".uno:GoRight", "", 0, Props1())

Props2(0).Name = "By"

Props2(0).Value = 1

Props2(1).Name = "Sel"

Props2(1).Value = false

Dispatcher.executeDispatch(MonDocument, ".uno:GoLeft", "", 0, Props1())

end sub

Merci de votre réponse

Georges Eckstein
Windows 7 et LibreOffice 3.5.5.3

Bonjour,

je n’obtiens pas le même résultat lorsque j’exécute une macro en mode direct
(appelée par un bouton) et en mode débogage (pas à pas) par l’appui sur la
touche F8.

Dans le premier cas les colonnes ne sont pas masquées et la zone
d’impression est trop importante, cela imprime toute les colonnes

Dans le deuxième cas les colonnes sont cachées et la zone d’impression est
alors correcte

Avez-vous une idée ?

Ci-dessous la macro en question

[...]

Bonjour Georges,

Sans regarder le code je dirai que c'est lié à la fenêtre (document) qui est active lors de l'exécution en mode pas à pas.

Si le programme utilise la fenêtre du débugger comme fenêtre courante les objets instanciés ne sont plus les bon.
et certaine méthode ne fonctionne plus.

C'est assez opaque quand tu utilise l'enregistreur de macro par contre,
mais c'est clairement visible quand tu programme tout à la main.

Tu as alors un message "méthode inexistant" la plupart du temps (si je ne me trompe pas).

Vérifie cette partie si tu connais le code, il y a de grand chance que le pb viennent de là.

Samuel

Bonjour

Je ne reproduis pas.

En revanche je constate que tu déclares

dim AdrZones(1) As New com.sun.star.table.CellRangeAddress

mais que tu n'affectes que :
AdrZones(0) = MaZone.RangeAddress

L'élément 0 n'est pas défini lorsque tu fais :
MaFeuille.PrintAreas = AdrZones()

Tu risque donc d'obtenir un résultat non souhaité dans ta zone
d'impression. Exemple :
$A$1:$DF$20;$A$1

Si tu n'as effectivement besoin que d'un élément il faut bien sûr
définir ainsi :
dim AdrZones(0) As New com.sun.star.table.CellRangeAddress

Cordialement
Pierre-Yves

Suite...

L'explication, dans le cas de "grands" tableaux peut venir du fait
que les colonnes soient réaffichées par le programme avant que
l'impression (ici lancée par dispatcher) ne soit effective...
d'où la prise en compte des colonnes dans l'impression.

Passer par le dispatcher n'est pas aussi performantque via l'API.

La solution est de remplacer l'impression "dispatcher" par l'impression
API.

Cordialement
Pierre-Yves

Un très grand merci pour le temps passé à trouver le petit souci
d'impression
Grâce à l'aide précieuse de Pierre-Yves Samyn tout fonctionne à merveille

Bien cordialement

Georges Eckstein