Poser votre question
0

macro Calc pour table dynamique : grouper des résultats numériques

posée 2019-04-10 10:34:22 +0200

Image Gravatar de michelD09

updated 2019-04-11 12:01:55 +0200

Bonjour,

j'utilise LibreOffice 6 sous ubuntu 18.04.

Dans une macro créant une table dynamique je dois grouper des dates et des valeurs numériques. Pour les dates cela fonctionne correctement avec ce code :

Dim oGroupe(0 To 1) As New com.sun.star.sheet.DataPilotFieldGroupInfo
With oGroupe(0)
      .HasAutoStart = True
      .HasAutoEnd = True
      .HasDateValues = True
      .SourceField = champs(0)
      .GroupBy = 16
      .Step = 0
End With
champs(0).CreateDateGroup(oGroupe(0))

Mais je n'arrive pas à trouver les bons paramètres pour grouper (par 2) les données d'un champ numérique. Le code suivant :

With oGroupe(1)
      .HasAutoStart = True
      .HasAutoEnd = True
      .HasDateValues = False
      .SourceField = 0
      .GroupBy = 0
      .Step = 2
End With
champs(6).CreateNameGroup(oGroupe(1))

me donne l'erreur :

variable d'objet non définie

et le code :

With oGroupe(1)
      .HasAutoStart = True
      .HasAutoEnd = True
      .HasDateValues = False
      .SourceField = champs(6)
      .GroupBy = 0
      .Step = 2
End With
champs(6).CreateNameGroup(oGroupe(1))

me donne l'erreur :

Erreur d'exécution BASIC. Une exception s'est produite : Type: com.sun.star.lang.IllegalArgumentException Message: cannot coerce argument type during corereflection call: arg no.: 0 expected: "[]string" actual: "void".

Je voudrais grouper par deux les données (qui sont des nombres entiers) de la colonne d'index 6 Quels sont les bonnes valeurs pour .GroupBy, .SourceField et .Step ? Y-a-t-il d'autres propriétés ? La méthode .CreateNamedGroup est elle la bonne ?

Merci pour votre aide.

Michel

Complément : Je joins le classeur contenant le programme (dans Stadard - Module 1)

La feuille "Base" du classeur contient la base des données à partir de laquelle je veux faire un tableau croisé dynamique.

Quand j'exécute Main telle qu'elle est (c'est à dire avec les lignes 72 à 80 mises en commentaire) cela fonctionne et on obtient le résultat dans "feuille table essai (1)"

J'ai mis dans "feuille table essai (2)" ce que je veux obtenir et que j'ai obtenu à partir de la table dynamique précédente en utilisant Données - Groupe - Plan et Groupe - Grouper par 2, après avoir sélectionné la cellule D6

Normalement je devrais pouvoir obtenir le même chose par une macro en décommentant les lignes 72 à 80 ; mais cela me donne les messages d'erreurs signalés dans mon premier message.

Remarque : les 2 feuilles sont des copies de la table dynamique originale obtenue ; pour faire les tests il faut ré-exécuter la macro Main et travailler dans la nouvelle "feuille table essai" obtenue MerciC:\fakepath\utl-application-5-pilote.ods

éditer requalifier signaler fermer fusionner supprimer

Commentaires

Bonjour

Je ne comprends pas :

Je voudrais grouper par deux les données (qui sont des nombres entiers)

Pourrais-tu éditer ta question (cliquer sur éditer directement sous ta question) pour donner des précisions, si possible avec un exemple (réduit au minimum permettant de comprendre) des données initiales et du résultat attendu ?

Cordialement

Image Gravatar de pierre-yves samynpierre-yves samyn ( 2019-04-11 07:47:13 +0200 )éditer

Désolé, pas le temps de creuser davantage ces jours-ci mais (pour te donner une piste) en tout cas cela ne peut fonctionner en l'état car CreateNameGroup n'attend pas les mêmes paramètres que CreateDateGroup.

Cordialement

Image Gravatar de pierre-yves samynpierre-yves samyn ( 2019-04-11 15:42:21 +0200 )éditer

2 Réponses

0

répondue 2019-04-12 16:18:48 +0200

Image Gravatar de pierre-yves samyn

Bonjour

Trouvé un peu de temps... Tu peux faire comme ceci (pour me simplifier la tâche je modifie directement ton résultat mais tu ne devrais pas avoir de difficulté pour intégrer dans ton programme) :

sub Group

dim oSheet, oDP, oField
dim oGroupInfo As New com.sun.star.sheet.DataPilotFieldGroupInfo

oSheet = thiscomponent.sheets.getbyIndex(1)
oDP = oSheet.getDataPilotTables.getByIndex(0)
oField = oDP.getRowFields.getByName("Durée")

With oGroupInfo
    .GroupBy = 0
    .HasAutoEnd = True
    .HasAutoStart = True
    .HasDateValues = False
    .Step = 2
End With

oField.setPropertyValue("GroupInfo", oGroupInfo)
oDP.refresh

end sub

Cordialement

éditer signaler supprimer permalien plus
0

répondue 2019-04-12 18:34:58 +0200

Image Gravatar de michelD09

updated 2019-04-12 18:35:42 +0200

Merci beaucoup pour ta disponibilité et ton efficacité.

Ça fonctionne très bien !

Comment peut on indiquer que c'est résolu sur le forum ? (Bon, j'ai trouvé !)

Cordialement,

Michel

éditer signaler supprimer permalien plus
S'identifier/S'inscrire pour répondre

Outils de question

1 follower

Stats

Posée: 2019-04-10 10:34:22 +0200

Consultée: 19 fois

Mise à jour: Apr 12