Bonsoir Laurence,

De visu ton code à l'air pas mal, et peut-être pourrais-tu le structurer un peu différemment pour qu'il offre une lecture plus aisée car ta soumission en intéressera quelques uns.

Par ailleurs, je t'invite à consulter cet excellent exemple qui t'apporteras sans doute des idées, notamment dans la possibilité de sélectionner une plage à la souris.

http://homepages.paradise.net.nz/hillview/OOo/MyDataPilot.sxc

Le code est ancien mais démonstratif ;)

Merci pour tes scripts.

Francois Gatto

BOTTIN Laurence - DGMT/SG/AG2 a écrit :
Bonjour,

Je vous transmets 2 macros, qui permettent de créer et de mettre à jour un pilote de données.

Je les aie testés et elles fonctionnent, j'ai essayé de traduire les commentaires anglais pour que la compréhension en soit facilitée. merci de me faire part de vos commentaires.



Sub    MajPiloteDonnees()
    Dim oCalc As object
    Dim oFeuille As Object
    Dim oPilotDonnees As Object
    Dim oPilotDonDesc As Object
    Dim monPilotDonn As Object
    Dim Ranges
    Dim NomFeuilData
dim newrange As new com.sun.star.table.CellRangeAddress 'une plage de données
    Dim LigneDeb
    Dim ColonneDeb
    NomFeuilData=("feuille1")
    LigneDeb = 0
    ColonneDeb = 0
    oCalc = ThisComponent
    'mon pilote est sur la 3ème feuille
    oFeuille = oCalc.getSheets().getByIndex(2)
    oPilotDonnees = oFeuille.getDataPilotTables()
monPilotDonn = oFeuille.getDataPilotTables().getbyname("DataPilotExample")

    'on récupère la plage de données
    ranges = monPilotDonn.getSourceRange ()
    actualrange = ranges(0)
    Feuille = actualrange.sheet
    ColonneDeb = actualrange.StartColumn
    ColonneFin = actualrange.EndColumn
    ligneDeb = actualRange.StartRow
    LigneFin = actualRange.EndRow
    'on compte le nombre de ligne de la nouvelle plage de données
    'sur laquelle on veut faire pointer le diagramme
    NbLignes = F_LongueurTable(NomFeuilData, LigneDeb, ColonneDeb)
    'on définit la zone de données utilisée pour actualiser le diagramme :
    newRange.sheet = Feuille
    newRange.StartColumn = ColonneDeb
    newRange.EndColumn = ColonneFin
    newRange.startRow = ligneDeb
    newRange.EndRow = ligneDeb + NbLignes - 1
'on applique les propriétés de la nouvelle plage à la plage de données du graphique
    ranges(0) = newRange
    monPilotDonn.setSourceRange(ranges)
    monPilotDonn.refresh()
End sub


Sub CreerPiloteDonnees()
   ' create a new DataPilot
   Dim oDoc As Object
   Dim xSheet As Object
   ' get doc and sheet
   oDoc = ThisComponent
   xSheet = oDoc.getSheets().getByIndex(0)
   'on récupère la collection des pilotes de données
   Dim xDPTables As Object
   xDPTables = xSheet.getDataPilotTables()
   ' on créer un descripteur de table de données
   Dim xDPDesc As Object
   xDPDesc = xDPTables.createDataPilotDescriptor()
   'on ignore les lignes vides
   xDPDesc.IgnoreEmptyRows=True
   ' donner les coordonnées de la zone de cellule
   Dim aSourceAddress As New com.sun.star.table.CellRangeAddress
   aSourceAddress.Sheet = 0
   aSourceAddress.StartColumn = 0
   aSourceAddress.StartRow = 0
   aSourceAddress.EndColumn = 12
   aSourceAddress.EndRow = 19
   'on applique les coordonnées de la zone de cellule au descripteur
   xDPDesc.setSourceRange(aSourceAddress)
' on récupère la collection de champs du descripteur de pilote de données
   Dim xFields As Object
   xFields = xDPDesc.getDataPilotFields()
   'on défini les propriétés de chaque champs
   Dim aFieldObj As Object
   ' Déclarer la 2ème colonne comme champs de colonne (catégorie)
   aFieldObj = xFields.getByIndex(1)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.COLUMN)
   aFieldObj.setName("Catégorie")
    ' Déclarer la 1ère colonne comme champs de ligne (mouvement)
   aFieldObj = xFields.getByIndex(0)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.ROW)
   aFieldObj.setPropertyValue("Function", 1)
    'Déclarer la 3ème colonne comme champs de ligne  (libellé)
   aFieldObj = xFields.getByIndex(2)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.ROW)

   ' déclarer le champs de données nombre (on compte le nombre de noms)
   aFieldObj = xFields.getByIndex(3)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.DATA) aFieldObj.setPropertyValue("Function", com.sun.star.sheet.GeneralFunction.COUNT)
   'déclarer le champs de données somme des JB
   aFieldObj = xFields.getByIndex(5)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.DATA) aFieldObj.setPropertyValue("Function", com.sun.star.sheet.GeneralFunction.SUM)
   'déclarer le champs de données age moyen
   aFieldObj = xFields.getByIndex(10)
aFieldObj.setPropertyValue("Orientation", com.sun.star.sheet.DataPilotFieldOrientation.DATA) aFieldObj.setPropertyValue("Function", com.sun.star.sheet.GeneralFunction.AVERAGE)
   'on définit la plage de cellule où sera créé le pilote de données
   Dim aDestAddress As New com.sun.star.table.CellAddress
   aDestAddress.Sheet = 2
   aDestAddress.Column = 0
   aDestAddress.Row = 0
   'on créé le nouveau pilote de données (nom , emplacement , description)
   xDPTables.insertNewByName("DataPilotExample", aDestAddress, xDPDesc)
End Sub


Function F_LongueurTable(vp_strNomFeuilData As String, Optional vp_start As Variant, Optional vp_col As Variant) As Long
'Date création: 12/10/2001 Auteur: CEO
'Date modification 12/01/2007 Auteur : DGMT/SG/AG2 - LB
    Dim vl_strNomFeuilData As String
    Dim vl_start As Long
    Dim vl_col As Long
    Dim i As Long
    Dim lesFeuilles as Object
    Dim maFeuille as Object
    Dim toto as string
    Dim maCellule as Object

On Error GoTo Erreurs
    vl_start = CLng(vp_start)
    vl_col = CLng(vp_col)


    i = vl_start

    maFeuille = thisComponent.sheets.getByName(vp_strNomFeuilData)
    maCellule = maFeuille.getCellByPosition( vl_col, i)
    toto = maCellule.String
    While toto <> ""
        i = i + 1
        maCellule=maFeuille.getCellByPosition(vl_col, i)
            toto = maCellule.String
    Wend
    F_LongueurTable = i - vl_start

    Exit Function
Erreurs:
    erreur_num=err()
    erreur_txt=error(erreur_num)
    erreur_ligne = Erl()
MsgBox(vl_projet & " :" & Chr(10) & Chr(10) & "erreur n° " + erreur_num + " à la ligne " + erreur_ligne + chr(13) + erreur_txt, 1 + 16, " F_LongueurTable")

End Function

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Répondre à