Calc MAcro : tester le contenu d'une cellule qui contient une formule

Bonjour,

Après recherches sur forum, cette liste, faq et aide... relecture du livre de Laurent... Je coince sur un truc qui me semble hyper basic.

Je souhaite tester le contenu d'une cellule pour lancer un traitement.
Concrètement : Critere = Toto
Si cellule="toto" alors traitement

MAIS, la cellule ne contient pas toto mais une fonction SI qui écrit toto ou autre chose. (du vide)

Si j'utilise
     maCelluleTest=maFeuille.getCellRangeByName("I3")

si I3 contient texte : .string
si I3 contient numérique : .value

Mais je ne trouve pas comment tester le résultat de mon contenu.
si I3.formula, j'obtiens bien la fonction SI mais pas son résultat.

Je craque un peu :wink:
Merci de votre aide.

Marie-Jo

Bonjour,

Tu es sure que le .string (ou le .value selon les cas) ne contient pas le résultat ? Chez moi c'est bien le cas
le .formulalocal contient la formule.

Claude

-------- Message original --------
*Sujet: *[INTERNET] [fr-users] Calc MAcro : tester le contenu d'une cellule qui contient une formule
*Pour : *Liste Users LibO <users@fr.libreoffice.org>

Bonjour Marie-Jo

Si tu veux tester le texte affiché par une cellule calculée, c'est bien
la propriété string qu'il faut utiliser.

Si cela ne fonctionne pas dans ton cas c'est peut-être parce que
tu fais ce que tu écris :

Marie jo Libo wrote

Concrètement : Critere = Toto
Si cellule="toto" alors traitement

toto est différent de Toto

Tu peux par exemple convertir en minuscule de cette façon :

if lcase(maCelluleTest.string) = "toto" then

Cordialement
Pierre-Yves

Bonsoir,

Merci pour cette confirmation. Je vais donc voir ou est le problème.
Pas dans la casse malheureusement :wink:
La récupération du .string me renvoie inlassablement 0 :frowning:

Marie-Jo

Bonsoir,

je me suis piqué au jeu de trouver une réponse, pour m'exercer.

Le code ci-dessous est-il correct dans un cas analogue à celui de Marie-Jo ?

Sub lirecell
dim v_doc as object, v_feuille as object, v_cellTest as object, v_cellNum as object, v_valueT as variant, v_valueN as variant
v_doc=ThisComponent
v_feuille=v_doc.sheets.getbyname("Feuille1")
v_cellTest=v_feuille.getCellRangeByName("B2")
v_valueT=v_CellTest.Type
if v_valueT=1 then
msgbox "La cellule contient un nombre"
elseif v_valueT=2 then
msgbox "La cellule contient du texte"
else
v_valueT=v_cellTest.value 'ligne de contrôle de la variable
msgbox "La cellule ne contient rien"
end if
End Sub

Ne sachant pas encore coder les "Case" en LibreOffice Basic, la méthode est assez rustique.

Lucien

Avant de me coucher…

Le problème m'ayant aiguisé l'appétit, j'ai continué un peu pour aboutir à quelque chose de plus propre

Code Basic

Sub LireCellBis
'=======variables========
dim v_2doc as object, v_2feuille as object, v_2cellTest as object
Dim v_2cellString as string, v_2valueT as variant, v_2cellType as variant
v_2doc=ThisComponent
v_2feuille=v_2doc.sheets.getbyname("Feuille1")
v_2cellTest=v_2feuille.getCellRangeByName("B2")
v_2valueT=v_2CellTest.Value
v_2cellType=v_2CellTest.Type 'pour voir
v_2cellString=v_2CellTest.String
'========================
Select Case v_2valueT
Case 1
msgbox "La cellule contient un nombre"
Case 2
msgbox "La cellule contient du texte"
Case 0
msgbox "La cellule contient l'expression : " +""""+v_2CellTest.string+""""
End Select
End Sub

Fichier exemple
http://cjoint.com/?0KlaqNFmZDP

Lucien

Bonjour,

Une idée comme çà tu es bien sure de tester sur la bonne feuille ?

Si tu rajoutes dans ta macro, tu seras sure d'être sur la bonne cellule dans la bonne feuille

msgbox maCelluleTest.absolutename

Claude

Bonjour

Si le problème ne vient pas de la casse et si tu récupères toujours zéro
c'est peut-être en raison du type de tes variables. Ci-dessous un
exemple pour illustrer.

dim oClasseur as object
dim oFeuille as object
dim MauvaisExemple as integer
dim BonExemple as string

oClasseur = thisComponent
oFeuille = oClasseur.Sheets.getByName("Feuille1")
oCell = oFeuille.getCellRangeByName("A1")

MauvaisExemple = oCell.string
msgbox MauvaisExemple

BonExemple = oCell.string
msgbox BonExemple

lutch wrote

Le code ci-dessous est-il correct dans un cas analogue à celui de Marie-Jo
?

Il est recommandé d'utiliser les constantes:
http://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1table.html#affea688ab9e00781fa35d8a790d10f0e

Par exemple :
select case oCell.Type
  case com.sun.star.table.CellContentType.EMPTY
    msgbox "cellule vide"
  case com.sun.star.table.CellContentType.TEXT
    msgbox "texte"
  case com.sun.star.table.CellContentType.VALUE
    msgbox "nombre"
  case com.sun.star.table.CellContentType.FORMULA
    msgbox "formule"
end select

Cordialement
Pierre-Yves

Bonjour Lucien, bonjour à tous,

Merci pour tes tests, le repas n'est pas terminé :wink: Je ne souhaite pas tester le type mais 2 cellules entre elles.
Je confirme que le .string permet en effet de tester le contenu. Merci Lucien.
Je pense donc que mon problème vient de la définition des variables.

Reprenant le code de Lucien, je peux en effet tester les cellules. J'ai adapté à mon cas plus précis.

Mais la problématique est qu'il s'agit de boucler dans un tableau.
Donc, je n'utilise pas une cellule précise comme
  v_feuille.getCellRangeByName("B2")
mais la position x,y de la cellule
     v_cellNum=Mafeuille.getCellByPosition(1,j)
Et c'est là que cela ne marche plus.
J'ai avancé toutefois. La cellule me renvoie maintenant #NOM au lieu de 0. Promis, j'ai vérifié les casses et réalisé des copier-coller de tous mes noms.

Au cas où le sujet intéresserait...

Fichier ici. (celui de Lucien avec le cas boucle et le cas qui marche sans boucle)
http://cjoint.com/?DKlloMIg2hx
J'ai créé quasi le cas qui me concerne. Un feuille contenant des données. Une autre feuille qui sélectionne une personne.
La macro doit récupérer les lignes de la base qui correspondent au nom sélectionné dans la liste et boucler sur toutes les lignes.
Le but final étant un copier collage spéciale des valeurs. Mais ceci sera l'objet d'un autre fil car je n'ai rien trouvé sur le collage spécial :wink:

Merci de votre aide.

Marie-Jo

Suite...

Dans la procédure TesteCelluleDansBoucle (c'est bien celle là
qu'il faut regarder ?)

Tu affectes la feuille à la variable v_feuille

v_feuille=v_doc.sheets.getbyname("Feuille1")

Puis dans la boucle tu essaies d'atteindre une cellule via la variable
Mafeuille

v_cellNum=Mafeuille.getCellByPosition(1,j) 'commence la boucle en B4

Cordialement
Pierre-Yves

Bonjour,

la boucle fonctionne après correction de TesteCelluleDansBoucle
v_cellNum=v_feuille.getCellByPosition(1,j) 'commence la boucle en B4

merci, j'ai encore appris des choses ce matin.
Lucien

Bonjour Claude,

Cela ne venait pas de là mais merci pour la propriété, une bonne vérification en effet.
Cela marche, je ne sais pas vraiment pourquoi. Il me semble d'avoir définir en type string la cellule à tester à fait.
et la cellule que je parcours en type object (c'est pas encore limpide dans ma tête mais cela marche, merci Lucien)
En fait, ma macro marchait mieux que je ne le pensais et elle avait scratché tout mon tableau. Je ne m'en étais pas aperçue.
Et celui ci ne contenait donc plus ce que je cherchais.
Bon, je bloque sur d'autres choses mais j'avance ! :wink:
Merci

Marie-Jo

Bonjour Lucien, bonjour à tous,

Merci pour tes tests, le repas n'est pas terminé :wink: Je ne souhaite pas tester le type mais 2 cellules entre elles.
Je confirme que le .string permet en effet de tester le contenu. Merci Lucien.
Je pense donc que mon problème vient de la définition des variables.

Reprenant le code de Lucien, je peux en effet tester les cellules. J'ai adapté à mon cas plus précis.

Mais la problématique est qu'il s'agit de boucler dans un tableau.
Donc, je n'utilise pas une cellule précise comme
  v_feuille.getCellRangeByName("B2")
mais la position x,y de la cellule
     v_cellNum=Mafeuille.getCellByPosition(1,j)
Et c'est là que cela ne marche plus.
J'ai avancé toutefois. La cellule me renvoie maintenant #NOM au lieu de 0. Promis, j'ai vérifié les casses et réalisé des copier-coller de tous mes noms.

Au cas où le sujet intéresserait...

Fichier ici. (celui de Lucien avec le cas boucle et le cas qui marche sans boucle)
http://cjoint.com/?DKlloMIg2hx
J'ai créé quasi le cas qui me concerne. Un feuille contenant des données. Une autre feuille qui sélectionne une personne.
La macro doit récupérer les lignes de la base qui correspondent au nom sélectionné dans la liste et boucler sur toutes les lignes.
Le but final étant un copier collage spéciale des valeurs. Mais ceci sera l'objet d'un autre fil car je n'ai rien trouvé sur le collage spécial :wink:

Merci de votre aide.

Marie-Jo