[Résolu][Calc] NB.SI provoque une erreur de parenthèse

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Nanabozo974
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 09 juil. 2014 17:22
Localisation : -20.925634 : 55.454481

[Résolu][Calc] NB.SI provoque une erreur de parenthèse

Message par Nanabozo974 »


La modération vous a écrit: "macro" est inutile dans un titre puisque vous êtes dans la section... Macro.
Veillez à ne pas employer de terme implicite à l'avenir.

Bonjour à tous,

ma demande va certainement sembler simpliste, et d'aucuns me diront d'effectuer des recherche (ce que j'ai déjà fait !), mais je souhaite transformer un tableau rempli de fonction NB.SI et NB.SI.ENS, en quelque chose de plus léger à l'aide de macro.

J'ai donc lu et relu la manière d'utiliser d'appeler les fonctions en macro, mais je bloque dès le début. J'ai systématiquement le message "erreur de parenthèse".

J'ai essayé d'utiliser une méthode empirique pour arriver à mes fins, mes cela n'a fait qu'empirer ! :fou:

Voici donc le code que j'ai pour le moment.

Code : Tout sélectionner

Option Explicit
Option VBASupport 1

'Déclaration de variables communes à toutes les bibliothèques

	Global MonDocument As Object
	Global LesFeuilles As Object
	Global MaFeuille As Object
	Global MaFeuille_Fiche_SEI As Object
	Global MaFeuille_Statistiques As Object
	Global MaCellule As Object
	Global MonCurseur As Object
	Global MaColonne As Object
	Global MaLigne As Object
	Global MaZone As Object
	Global Bibli As Object
	Global Dlg As Object
	Global MonDialogue As Object
	Global Fonction1 As Object
	Global Fonction2 As Object
	
	Global Service As String
	Global Villa As String
	Global Declarant As String
	Global Categorie As String
	Global Evenement As String
	Global Date1 As Date
	Global Date2 As Date
	
	Global Fiche_Service As Long
	Global Fiche_Villa As Long
	Global Fiche_Declarant As Long
	Global Fiche_Categorie As Long
	Global Fiche_Evenement As Long
	
	Global MaZone_Service As Object
	Global MaZone_Villa As Object
	Global MaZone_Declarant As Object
	Global MaZone_Categorie As Object
	Global MaZone_Evenement As Object
	
Sub Statistiques

	MonDocument = thisComponent
	LesFeuilles = MonDocument.Sheets
	MaFeuille_Fiche_SEI = LesFeuilles.GetByName("SUIVI FICHE SEI")
	MaFeuille_Statistiques = LesFeuilles.GetByName("STATISTIQUES")
	
	MaZone_Service = MaFeuille_Fiche_SEI.GetCellRangeByName("C3:C1000")
	MaCellule = MaFeuille_Statistiques.GetCellRangeByName("A2")

Dim OAccess As Object
	
	OAccess = CreateUnoService("com.sun.star.sheet.FunctionAccess")
	Fonction1 = OAccess.callFunction("COUNT.IF")
	
	Fiche_Service = Fonction1(MaZone_Service;MaCellule)
	
	Msgbox(Fiche_Service)
	
End Sub
Je vous remercie de votre précieuse aide.

Amicalement
Ce matin j'ai appris que la France est un pays riche. Les pauvres de France seront heureux de l'apprendre (Coluche)
Il n'y a pas de pire tyrannie que de vouloir le bien d'autrui... (Kant)
OpenOffice 4.1.1 sur Windows 7
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 17:05

Re: [Calc] Utiliser NB.SI dans une macro

Message par ThierryT »

Bonjour,

C'est normal car tu définis Fichier1 comme étant un Objet et tu l'utilises pour faire un appel de fonction :aie:

Code : Tout sélectionner

Global Fonction1 As Object

Code : Tout sélectionner

Fiche_Service = Fonction1(MaZone_Service;MaCellule)
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Nanabozo974
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 09 juil. 2014 17:22
Localisation : -20.925634 : 55.454481

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par Nanabozo974 »

Merci de ta réponse.

En fait, je me suis inspiré de ce fil https://forum.openoffice.org/fr/forum/v ... 15&t=14625 pour pouvoir essayer d'effectuer ce que je cherche. Du coup, je ne vois pas en quoi avoir défini Fonction1 comme objet est la source d'erreur...

Merci de l'aide en tout cas.

Amicalement
Ce matin j'ai appris que la France est un pays riche. Les pauvres de France seront heureux de l'apprendre (Coluche)
Il n'y a pas de pire tyrannie que de vouloir le bien d'autrui... (Kant)
OpenOffice 4.1.1 sur Windows 7
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 17:05

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par ThierryT »

Je te recommande la lecture de ce fil pour les fonctions : Procédures et Fonctions
et celui là pour les variables (notamment pour le type objet) : Type de variables
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Nanabozo974
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 09 juil. 2014 17:22
Localisation : -20.925634 : 55.454481

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par Nanabozo974 »

Merci pour ces éclairages.

Pour une meilleure lisibilité, j'ai donc décaler Fonction1 dans une Function à part.

Mais j'ai toujours le même souci...

Et j'avoue que je ne comprend pas comment on définit dans la fonction COUNTIF les variables nécessaires à son exécution (plage de cellule et critère).

Voici là où j'en suis, mais je suis toujours pas plus avancé...

Code : Tout sélectionner

Option Explicit
Option VBASupport 1

'Déclaration de variables communes à toutes les bibliothèques

	Global MonDocument As Object
	Global LesFeuilles As Object
	Global MaFeuille As Object
	Global MaFeuille_Fiche_SEI As Object
	Global MaFeuille_Statistiques As Object
	Global MaCellule As Object
	Global MonCurseur As Object
	Global MaColonne As Object
	Global MaLigne As Object
	Global MaZone As Object
	Global Bibli As Object
	Global Dlg As Object
	Global MonDialogue As Object
'	Global Fonction1 As Object
	Global Fonction2 As Object
	
	Global Service As String
	Global Villa As String
	Global Declarant As String
	Global Categorie As String
	Global Evenement As String
	Global Date1 As Date
	Global Date2 As Date
	
	Global Fiche_Service As Long
	Global Fiche_Villa As Long
	Global Fiche_Declarant As Long
	Global Fiche_Categorie As Long
	Global Fiche_Evenement As Long
	
	Global MaZone_Service As Object
	Global MaZone_Villa As Object
	Global MaZone_Declarant As Object
	Global MaZone_Categorie As Object
	Global MaZone_Evenement As Object
	
Sub Statistiques

	MonDocument = thisComponent
	LesFeuilles = MonDocument.Sheets
	MaFeuille_Fiche_SEI = LesFeuilles.GetByName("SUIVI FICHE SEI")
	MaFeuille_Statistiques = LesFeuilles.GetByName("STATISTIQUES")
	
	MaZone_Service = MaFeuille_Fiche_SEI.GetCellRangeByName("C3:C1000")
	MaCellule = MaFeuille_Statistiques.GetCellRangeByName("A2")

	Fiche_Service = Fonction1(MaZone_Service(0);MaCellule())
	
	Msgbox(Fiche_Service)

End Sub

Function Fonction1()

Dim OAccess As Object
	
	OAccess = CreateUnoService("com.sun.star.sheet.FunctionAccess")
	Fonction1 = OAccess.callFunction("COUNT.IF")

End Function
Ce matin j'ai appris que la France est un pays riche. Les pauvres de France seront heureux de l'apprendre (Coluche)
Il n'y a pas de pire tyrannie que de vouloir le bien d'autrui... (Kant)
OpenOffice 4.1.1 sur Windows 7
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 17:05

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par ThierryT »

Bonjour,

Avec un peu plus de recherche, regarde ces liens :
Fonctions utilisation de paramètres
Pour le reste, je te conseille l'achat de ce livre pour apprendre la programmation Basic : Programmation Basic
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Nanabozo974
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 09 juil. 2014 17:22
Localisation : -20.925634 : 55.454481

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par Nanabozo974 »

Merci de m'orienter vers des fils, mais désolé, je ne comprend toujours pas quelle est la syntaxe pour la fonction NB.SI. :marto:

J'arrive à un résultat avec COUNTA, mais0 je le souhaite avec COUNTIF en effet, à terme j'aurais plusieurs condition imbriquée.

Mais vraiment, je comprend pas et je n'y arrive pas. Aussi, je remercie par avance tout ceux qui voudront bien m'aider à me sortir de cette impasse...
Ce matin j'ai appris que la France est un pays riche. Les pauvres de France seront heureux de l'apprendre (Coluche)
Il n'y a pas de pire tyrannie que de vouloir le bien d'autrui... (Kant)
OpenOffice 4.1.1 sur Windows 7
Avatar de l’utilisateur
ThierryT
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 467
Inscription : 10 nov. 2012 17:05

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par ThierryT »

Les fils servent à orienter les personnes vers des solutions concernant leur problématique.
Mais à priori, cela ne te suffit pas.

Et pourtant :
Dans le premier fil, il est écrit :
Des variables peuvent être transmises aux procédures et aux fonctions. Les éléments SUB ou FUNCTION doivent être déclarés pour accepter des paramètres :
Sub SubName(Parameter1 As Type, Parameter2 As Type,...)
Code de programme
End Sub
Dans ton cas, tu fais appel à une fonction Fonction1 avec des paramètres :

Code : Tout sélectionner

Fiche_Service = Fonction1(MaZone_Service(0);MaCellule())
Les paramètres sont MaZone_Service(0) et MaCellule(0) tous les deux de type Objet.
La fonction Fonction1 doit donc être définie comme

Code : Tout sélectionner

Fonction1(Zone As Object, Cellule As Object)
sinon, il y aura une erreur générée lors de l'appel de cette fonction.

Dans le deuxième fil, il est précisé que :
La méthode callFunction de ce service appelle une fonction Calc
(son nom interne est en premier argument, les arguments de la fonction sont en
deuxième argument), puis renvoie le résultat simplement comme résultat de notre
fonction.
Tu écris :

Code : Tout sélectionner

Fonction1 = OAccess.callFunction("COUNT.IF")
Où se trouve le deuxième argument de la fonction dans ta macro ?
Il est précisé aussi que :
il faut retenir que le deuxième argument de callFunction est une liste
(un tableau unidimensionnel). Chaque élément de la liste est un argument pour la
fonction Calc. Un argument de fonction Calc peut admettre une valeur ou une série
de valeurs ; la série de valeurs se traduit en un tableau uni ou bidimensionnel.
l'appel de la fonction doit être de la forme :

Code : Tout sélectionner

Fonction1 = OAccess.callFunction("COUNT.IF",liste())
avec le tableau liste défini correctement.
Sans fichier exemple, personne ne pourra le définir pour toi.

Je te joins le lien pour la fonction COUNTIF et les paramètres nécessaires : Fonction COUNTIF

Sinon en ce qui me concerne, pour les appels aux fonctions Calc, j'utilise plus aisément cette fonction en lui passant les bons paramètres :

Code : Tout sélectionner

' Fonction permettant de faire appel à une fonction de Calc
' Exemple : Fonction Max => JT_CalcExecute ("MAX", Array(1,2,6,8))
'----------------------------------------------------------------
Function JT_CalcExecute (functionName$, args())
   Dim oAccess As Object
 
   If IsNull(oAccess) Then oAccess = CreateUnoService("com.sun.star.sheet.FunctionAccess")
   JT_CalcExecute = oAccess.callFunction (functionName,args())
End Function
Une question complémentaire : en quoi tu penses pouvoir alléger les calculs et/ou les traitements en remplaçant les fonctions NB.SI par cette macro ?
LibreOffice 6.1.3.2 x64 / AOO 4.1.5 (x86) sous Windows 8.1 (x64)
Java 8.x (x64 et x86), Firefox, Thunderbird,....

“Celui qui aime à apprendre est bien près du savoir.” (Confusius)
Comment baliser Résolu
Nanabozo974
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 09 juil. 2014 17:22
Localisation : -20.925634 : 55.454481

Re: [Calc] NB.SI provoque une erreur de parenthèse

Message par Nanabozo974 »

Bonjour,

Merci beaucoup pour ces éléments. Je vais en prendre connaissance et les étudier de prêt pour bien comprendre le fonctionnement.

En fait, j'ai un tableau de 50 lignes sur 20 colonnes, ou dans quasiment chacune des colonnes, il va y avoir des fonctions. Il s'agira de NB.SI.ENS, imbriquer les unes dans les autres. Cela va jusqu'à 10 fonctions. Par expérience, cela alourdi considérablement le document, et ralentit notamment son ouverture. De plus, c'est pour moi aussi l'occasion d'essayer (avec peine pour le coup) de continuer mon apprentissage sur la programmation.

Merci encore, et je reviendrais dès que j'ai pu avancer, et espérer conclure.

Amicalement
Ce matin j'ai appris que la France est un pays riche. Les pauvres de France seront heureux de l'apprendre (Coluche)
Il n'y a pas de pire tyrannie que de vouloir le bien d'autrui... (Kant)
OpenOffice 4.1.1 sur Windows 7