Rémi B | 10 Apr 20:40
Picon
Favicon

Function utilisant comme variables de plages de cellules

Bonjour,

Je m'arrache un peu les cheveux avec ma fonction...

Je souhaite faire une fonction Basic qui calcule une moyenne pondérée. 
Facile, la moyenne pondérée ! Il suffit de multiplier le coef par la 
note, d'ajouter le tout et de diviser par la somme des coefficients. 
C'est vrai... Sauf si une cellule devant contenir la note est vide ou 
contient du texte (absent par exple).

Ce "problème" se résout avec une base de SI(ESTNUM();;).

L'objectif ici est de créer une fonction faisant cela qui prendrait en 
argument des plages de cellules définies par l'utilisateur pour quelque 
chose comme =MOYPOND(A1:C1;A2:C2) avec en premier les coeff et en 
deuxième les notes. Je précise que ce ne sera pas toujours A1:C1, cela 
peut être aussi autre chose suivant l'utilisateur.

Tout mon problème consiste en la définition de cette fonction et donc 
récupération des données de chaque zone de cellule dans un tableau (je 
pense que c'est la bonne méthode ?).

J'ai testé :
Function MoyPond(plage_coeff as new com.sun.star.sheet.XCellRangeData, 
plage_notes as new com.sun.star.sheet.XCellRangeData) as Single

plage_coeff.getDataArray() me renvoie une erreur

Le code suivant fonctionne :

(Continue reading)

Rémi B | 10 Apr 23:41
Picon
Favicon

Re: Function utilisant comme variables de plages de cellules

Re,

J'ai un peu avancé dans ma fonction de moyenne pondérée.
Le problème demeure au niveau du type de variable... Si un cellule est 
vide, elle est interprétée comme contenant 0 (un absent a donc 0 !).

Il ne faut pas alors un type Variant, mais que mettre alors pour que 
"vide" soit bien "vide" et pas "0" ? Peut-être suis-je ne train de faire 
fausse route ?

Voici le code qui fonctionne bien en dehors de ce cas (toute critique 
bienvenue !)
Function MoyPond(plage_coeff as Variant, plage_notes as Variant) as 
Variant
total_notes_prod_coeff = 0
somme_coeff = 0
For i = Lbound(plage_coeff(),2) to UBound(plage_coeff(),2)
	if Not(IsEmpty(plage_notes(1,i))) Then
		If IsNumeric(plage_notes(1,i)) Then
		total_somme_prod_note_coeff = total_somme_prod_note_coeff 
+ plage_coeff(1,i)*plage_notes(1,i)
		somme_coeffs = somme_coeffs + plage_coeff(1,i)
		End If
	End If
next
If somme_coeffs > 0 Then
MoyPond = total_somme_prod_note_coeff/somme_coeffs
Else
MoyPond = "absent"
End if
(Continue reading)

Bernard Marcelly | 11 Apr 11:49
Picon
Favicon

Re: Re: Function utilisant comme variables de plages de cellules

Message de Rémi B  date 2008-04-10 23:41 :
> J'ai un peu avancé dans ma fonction de moyenne pondérée.
> Le problème demeure au niveau du type de variable... Si un cellule est 
> vide, elle est interprétée comme contenant 0 (un absent a donc 0 !).
> 
> Il ne faut pas alors un type Variant, mais que mettre alors pour que 
> "vide" soit bien "vide" et pas "0" ? Peut-être suis-je ne train de faire 
> fausse route ?
> 

Bonjour,
Je suppose que tu as installé Xray. Essaie cette fonction de test:

function tata(v)
   xray v
end function

Mettre dans une cellule =tata(B10) et modifier la cellule B10.
Si la cellule contient du texte, v est un string
Si la cellule est vide, v est un double de valeur zéro.
Donc : impossible de distinguer une cellule vide d'une valeur zéro.

    Bernard
Rémi B | 11 Apr 14:25
Picon
Favicon

Re: Function utilisant comme variables de plages de cellules

Le Fri, 11 Apr 2008 11:49:32 +0200, Bernard Marcelly a écrit :

> Message de Rémi B  date 2008-04-10 23:41 :
>> J'ai un peu avancé dans ma fonction de moyenne pondérée. Le problème
>> demeure au niveau du type de variable... Si un cellule est vide, elle
>> est interprétée comme contenant 0 (un absent a donc 0 !).
>> 
>> Il ne faut pas alors un type Variant, mais que mettre alors pour que
>> "vide" soit bien "vide" et pas "0" ? Peut-être suis-je ne train de
>> faire fausse route ?
>> 
>> 
> Bonjour,
> Je suppose que tu as installé Xray. Essaie cette fonction de test:
> 
> function tata(v)
>    xray v
> end function
> 
> Mettre dans une cellule =tata(B10) et modifier la cellule B10. Si la
> cellule contient du texte, v est un string Si la cellule est vide, v est
> un double de valeur zéro. Donc : impossible de distinguer une cellule
> vide d'une valeur zéro.

D'accord merci. :-s
Il n'y a donc pas de moyen pour faire la distinction ? 
Au début je m'étais égaré dans du 
function tata (v as new new com.sun.star.sheet.XCellRangeData,...)
Pas d'espoir de ce côté là ? 
Merci.
(Continue reading)

Bernard Marcelly | 11 Apr 15:32
Picon
Favicon

Re: Re: Function utilisant comme variables de plages de cellules

Message de Rémi B  date 2008-04-11 14:25 :

> D'accord merci. :-s
> Il n'y a donc pas de moyen pour faire la distinction ? 
Je pensais avoir été clair ...

> Au début je m'étais égaré dans du 
> function tata (v as new new com.sun.star.sheet.XCellRangeData,...)
> Pas d'espoir de ce côté là ? 
Aucun non plus.

    Bernard
Francois Gatto | 11 Apr 16:38

Re: Re: Function utilisant comme variables de plages de cellules

Re,

Bernard Marcelly a écrit :
> Message de Rémi B  date 2008-04-11 14:25 :
> 
>> D'accord merci. :-s
>> Il n'y a donc pas de moyen pour faire la distinction ? 
> Je pensais avoir été clair ...
> 
>> Au début je m'étais égaré dans du function tata (v as new new 
>> com.sun.star.sheet.XCellRangeData,...)
>> Pas d'espoir de ce côté là ? 
> Aucun non plus.
> 
>    Bernard

Bon, je m'étais un peu laissé entrainer sur une voie alambiquée ;-)

En fait, le test simple qui détermine le caractère de viditude :-D
sera du genre :
oCell = oSheet.getCellRangebyName("B10")
if oCell.Type = com.sun.star.table.CellContentType.EMPTY then
	msgbox "cellule vide"
	else
	msgbox "cellule non vide"
endif

A consulter un exemple (page 129) sur le Guide de programmation de 
StarOffice 8 pour BASIC ici :
http://dlc.sun.com/pdf/819-1328/819-1328.pdf
(Continue reading)

Bernard Marcelly | 11 Apr 20:35
Picon
Favicon

Re: Re: Function utilisant comme variables de plages de cellules

Message de Francois Gatto  date 2008-04-11 16:38 :

> Je crois tout de même que l'on peut faire une distinction (relative au contexte présenté).
> 
> En effet, si la cellule est vide, les [pseudo-]propriétés suivantes le sont également :
> String = ""  pseudo-prop            
> Formula = ""  pseudo-prop            
> FormulaLocal  ""            
> 
> alors, que si la cellule est alimentée, elles le sont aussi.
> 
> Dans le cas de Rémi, je pense que cela peut être un moyen (une astuce) de contourner la difficulté.
> 
> Francois Gatto 

> 
> Bon, je m'étais un peu laissé entrainer sur une voie alambiquée ;-)
> 
> En fait, le test simple qui détermine le caractère de viditude :-D
> sera du genre :
> oCell = oSheet.getCellRangebyName("B10")
> if oCell.Type = com.sun.star.table.CellContentType.EMPTY then
>     msgbox "cellule vide"
>     else
>     msgbox "cellule non vide"
> endif
> 
> A consulter un exemple (page 129) sur le Guide de programmation de 
> StarOffice 8 pour BASIC ici :
> http://dlc.sun.com/pdf/819-1328/819-1328.pdf
(Continue reading)

Mathias Michel | 12 Apr 01:46
Picon

Re: Re: Function utilisant comme variables de plages de cellules

Le 11/04/08, Bernard Marcelly<marcelly <at> club-internet.fr> a écrit :
>
>  Elle était: comment savoir si une cellule (ou une zone) passée en argument
> d'une fonction pour Calc, est une cellule vide ou une cellule avec zéro?
>  Comme on ne récupère que la valeur de la cellule, mais pas l'objet cellule,
> on ne peut pas faire ce que tu proposes. Contrairement à Excel.
>
Oui, mais comme nous disposons des coordonnées de la cellule (ligne,
colonne), il est possible d'aller écupérer l'objet en question, non?
Même si c'est un peu lourd...

PS : pour ma gouverne, cela signifie que le not(IsEmpty) dans la
fonction de Rémy ne sert à rien ?

Bonne nuit :-)
Rémi B | 14 Apr 11:14
Picon
Favicon

Re: Function utilisant comme variables de plages de cellules

Le Sat, 12 Apr 2008 01:46:14 +0200, Mathias Michel a écrit :

> Le 11/04/08, Bernard Marcelly<marcelly <at> club-internet.fr> a écrit :
>>
>>  Elle était: comment savoir si une cellule (ou une zone) passée en
>>  argument
>> d'une fonction pour Calc, est une cellule vide ou une cellule avec
>> zéro?
>>  Comme on ne récupère que la valeur de la cellule, mais pas l'objet
>>  cellule,
>> on ne peut pas faire ce que tu proposes. Contrairement à Excel.
>>
> Oui, mais comme nous disposons des coordonnées de la cellule (ligne,
> colonne), il est possible d'aller écupérer l'objet en question, non?
> Même si c'est un peu lourd...
> 
> PS : pour ma gouverne, cela signifie que le not(IsEmpty) dans la
> fonction de Rémy ne sert à rien ?

Oui, à rien du tout. Dans une fonction calc, on ne récupère que le 
contenu de la cellule (0 si vide, 0 si... 0, autre nbre si c'est autre 
nbre) pas l'objet cellule sur lequel on peut éventuellement tester la 
viditude ;-) (que l'on me corrige si je me trompe).

Je vais essayer d'intégrer le test proposé par F.Gatto dans ma boucle.

Merci à tous pour vos réponses !
@+
Rémi
(Continue reading)

Francois Gatto | 12 Apr 08:21

Re: Re: Function utilisant comme variables de plages de cellules

Bernard Marcelly a écrit :

> 
> Oui, mais ce n'était pas la question :-)

Mais à une question diverses réponses, voire solutions.

> Elle était: comment savoir si une cellule (ou une zone) passée en 
> argument d'une fonction pour Calc, est une cellule vide ou une cellule 
> avec zéro?
> Comme on ne récupère que la valeur de la cellule, mais pas l'objet 
> cellule, on ne peut pas faire ce que tu proposes. Contrairement à Excel.
> 
>    Bernard

D'où ma précision "je pense que cela peut être un moyen (une astuce) de 
contourner la difficulté"

Francois
Francois Gatto | 11 Apr 16:18

Re: Re: Function utilisant comme variables de plages de cellules

Bonsoir Bernard,

Bernard Marcelly a écrit :
> Message de Rémi B  date 2008-04-10 23:41 :
>> J'ai un peu avancé dans ma fonction de moyenne pondérée.
>> Le problème demeure au niveau du type de variable... Si un cellule est 
>> vide, elle est interprétée comme contenant 0 (un absent a donc 0 !).
>>
>> Il ne faut pas alors un type Variant, mais que mettre alors pour que 
>> "vide" soit bien "vide" et pas "0" ? Peut-être suis-je ne train de 
>> faire fausse route ?
>>
> 
> Bonjour,
> Je suppose que tu as installé Xray. Essaie cette fonction de test:
> 
> function tata(v)
>   xray v
> end function
> 
> Mettre dans une cellule =tata(B10) et modifier la cellule B10.
> Si la cellule contient du texte, v est un string
> Si la cellule est vide, v est un double de valeur zéro.
> Donc : impossible de distinguer une cellule vide d'une valeur zéro.
> 
>    Bernard

Je crois tout de même que l'on peut faire une distinction (relative au 
contexte présenté).

(Continue reading)


Gmane