[Calc]Sélection de plage

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

[Calc]Sélection de plage

Message par Pierre-Yves Samyn »

Bonjour

Un code dont je ne suis pas l'auteur et qui me semble devoir figurer dans cette section.

Ce sujet est issu des fils :
http://user.services.openoffice.org/fr/ ... 48#p110048
http://user.services.openoffice.org/fr/ ... =8&t=23632

Les programmes utilisant le tableur nécessitent souvent des interactions avec l'utilisateur, et parmi celles-ci la saisie de référence.

Le but est d'afficher d'un dialogue le permettant aussi bien au clavier qu'à la souris, à l'instar de ce que propose OOo :
SelectPlage.png
Ceci s'obtient par la création d'un listener dont la documentation se trouve ici :
http://wiki.services.openoffice.org/wik ... _Selection

L'exemple issu de ce fil du forum anglophone, complète cela par la gestion de l'image du bouton d'appel.

Le programme va "rechercher" dans les ressources l'image utilisée par OOo. L'URL est celle-ci :

Code : Tout sélectionner

aProps(0).Value = "private:graphicrepository/formula/res/refinp1.png"
Ce qui correspond, par exemple pour une installation standard de 3.2.1 sous XP à :

Code : Tout sélectionner

C:\Program Files\OpenOffice.org 3\Basis\share\config\images.zip\formula\res\refinp1.png
Ci-dessous le code :

Code : Tout sélectionner

REM  *****  BASIC  *****

Private oDialog As Object
Private oRangeSelectionListener As Object

Private bNotInRefMode As Boolean
Private bDialogShown As Boolean
Private nExecute As Integer


Sub RangeSelection
  DialogLibraries.loadLibrary("Standard")
  oDialog = CreateUnoDialog( _
      DialogLibraries.getByName("Standard").getByName("Dialog1"))
  
  ' position of the image is version dependent
  oGP = CreateUnoService("com.sun.star.graphic.GraphicProvider")
  Dim aProps(0) As New com.sun.star.beans.PropertyValue
  aProps(0).Name = "URL"
  aProps(0).Value = "private:graphicrepository/formula/res/refinp1.png"
  oGraphic = oGP.queryGraphic(aProps)
  btn_rangeselection = oDialog.getControl("btn_rangeselection").getModel()
  btn_rangeselection.ImagePosition = com.sun.star.awt.ImagePosition.Centered
  btn_rangeselection.Graphic = oGraphic
  
  bDialogShown = True
  bNotInRefMode = True
  
  While bDialogShown
    If bNotInRefMode Then
      If oDialog.execute() = 0 and bNotInRefMode Then bDialogShown = False
    End If
    Wait 500
  WEnd
  
  If nExecute = 1 Then
    msgbox oDialog.getControl("edit_range").getText()
  End If
  oDialog.dispose()
End Sub


' ok button pressed
Sub OKPressed
  bDialogShown = False
  nExecute = 1
  oDialog.endExecute()
End Sub

' cancel button pushed
Sub Canceled( ev )
  bDialogShown = False
  nExecute = 0
  oDialog.endExecute()
End Sub


Sub SelectDataRange( ev )
  ' datarange select button pushed
  oController = ThisComponent.getCurrentController()
  
  Dim aProps(2) As New com.sun.star.beans.PropertyValue
  aProps(0).Name = "InitialValue"
  aProps(0).Value = oDialog.getControl("edit_range").getText()
  aProps(1).Name = "Title"
  aProps(1).Value = "Select Data Range"
  aProps(2).Name = "CloseOnMouseRelease"
  aProps(2).Value = False
  
  oRangeSelectionListener = CreateUnoListener( "RangeSelection_", _
      "com.sun.star.sheet.XRangeSelectionListener")
  
  'oDialog.setVisible(False)
  bNotInRefMode = False
  oDialog.endExecute()
  
  oController.addRangeSelectionListener(oRangeSelectionListener)
  oController.startRangeSelection(aProps())
End Sub


' range selection listener
Sub RangeSelection_done( ev )
  oRange = ThisComponent.getCurrentSelection()
  'mri ev.Source
  If oRange.supportsService( "com.sun.star.sheet.SheetCellRange" ) Then
    oDialog.getControl("edit_range").setText( ev.RangeDescriptor )
  End If
  
  bNotInRefMode = True
  'oDialog.execute()
  oController = ThisComponent.getCurrentController()
  oController.removeRangeSelectionListener(oRangeSelectionListener)
End Sub
Sub RangeSelection_aborted( ev )
  'oDialog.setVisible(True)
  oController = ThisComponent.getCurrentController()
  oController.removeRangeSelectionListener(oRangeSelectionListener)
  bNotInRefMode = True
End Sub
Sub RangeSelection_disposing( ev )
End Sub

Vous ne pouvez pas consulter les pièces jointes insérées à ce message.