macro LibreOffice: faire une formule à partir d'une sélection

gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 27/01/2020 à 21:06 Modifié par gaston


Bonjour,

Je découvre LibreOffice qui est un peu différent d'Excel, et je voudrais faire une macro qui permette, en ayant sélectionné des cellules contigües de la colonne A (par exemple A2:A10), d'écrire une formule utilisant cette sélection, dans la cellule juste en dessous (c.a.d. en A11). Sachant que la sélection ne sera pas toujours de 2 à 10. Puis d'aller sur la même ligne dans la colonne B écrire une autre formule
Par exemple en A11 =nbval(A2:A10) et en B11 = somme(B1:B10).
Je sais enregistrer une macro avec libre office, mais le langage ne m'est pas familier, pour l'éditer.

J'ai enregistré ceci dans un premier temps, mais il faudrait remplacer A2:A10 pour que ce puisse être la sélection active :

sub test_nbval
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = "=NBVAL(A2:A10)"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())
end sub

Est-ce que quelqu'un pourrait m'aiguiller ?
carpe diem

Répondre à ce message

Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 28/01/2020 à 03:43


Bonjour,
une piste
tu remplaces ta formule par
"=NBVAL(" & CelluleActive.CellAddress.Column & CelluleActive.CellAddress.Row & ":" & CelluleActive.CellAddress.Column & CelluleActive.CellAddress.Row+8 & ")"

ça pourrait fonctionner.
On peut aussi se pencher sur l'offset
OpenOffice et LibreOffice, c'est du pareil au même; sur cette page si tu utilises chrome, tu peux faire un clic droit et lancer la commande traduire en français, pour avoir les explications, et tu la remets en version originale si tu dois faire du copier coller

Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 29/01/2020 à 19:33


Bonjour,

Merci pour ta réponse, mais le problème est que le nombre de ligne est complètement aléatoire: (le offset me servira après, pour aller dans une cellule mitoyenne)
A dire vrai, j'ai un peu évolué dans ma recherche: je voudrais pouvoir faire une macro qui permette de faire comme la somme automatique Sigma, mais avec nbval,c.a.d. en étant positionné dans une cellule, que ça prenne en compte les lignes du dessus jusqu'au titre (et faire pareil avec somme après dans une cellule sur la même ligne)...
En fait c'est pour arriver à faire à partir d'une liste, une remise de chèques par macro, commandée par un bouton qui compte le nb de chèques et le total des montants. Tout pour un trésorier d'asso qui se noie dans un verre d'eau. Encore le total, il y arriverait mais le nbval, c'est déjà trop lui demander. [:D]
ça me servira aussi après pour autre chose.


carpe diem
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 29/01/2020 à 21:24


Bonjour,
Je n'ai pas ce logiciel parce que j'utilise Excel.
On ne peut trouver que des réponses fragmentaires
en voici une qui compte de données entrées dans une plage de cellules Le souci c'est qu'ici la plage est statique...
Pour faire ce que tu veux, il faut d'abord trouver l'adresse de la dernière cellule remplie de la colonne et ensuite, boucler sur la plage de cellules
il faut donc décortiquer les 2 fonctions suivantes
retrouver le numéro de la dernière ligne remplie
hélas ici , elle prend toute la feuille, il faut trouver la syntaxe pour ne travailler que sur une seule colonne
boucler sur une plage de données

Mais pourquoi ne pas utiliser Excel ? la syntaxe VBA est tout de même plus simple
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 29/01/2020 à 23:14


Ah ben Excel est payant et pas LibreOffice et l'association n'est pas riche, voilà pourquoi.

carpe diem
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 29/01/2020 à 23:36 Modifié par Bipbipcoyote


Bonjour,
si tu as un compte outlook (en créer un est gratuit), il y a un office gratuit dans la boite mail (les petits carrés en haut à gauche), ...

Maintenant on ne sait pas faire du VBA directement dans la version online, mais qqn qui possède une version bureau peut réaliser le fichier, il suffit alors de le télécharger dans le dossier onedrive (gratuit aussi) du compte et le vba sera fonctionnel.
Bien sûr il faut prévoir un bouton pour déclencher la macro sur la feuille ou utiliser l'événement SurOuverture (OnOpen) du classeur ou un autre, bref, l'utilisateur qui ne possède pas la version bureau ne peut pas mettre les mains dans le cambouis mais il peut encoder des données supplémentaires sans soucis

vas sur cette page fais la défiler vers le bas jusqu'au titre Applications Office on Line Gratuites, tu vas comprendre

Tu pourrais alors faire un truc comme celui-ci
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 30/01/2020 à 00:18


Bonjour,
Ah ouiiii ! J'avais oublié combien ton site est une mine pour Excel (+)
Bon j'ai pas mon ordi ce soir, donc je ne peux verifier tout de suite, (je suis sur smartphone, là) mais il semblerait que la dernière version de libreoffice peut prendre en charge le vba, si j'ai bien compris ceci:
https://help.libreoffice.org/latest/fr/text/sbasic/shared/vbasupport.html

C'est que ça manque de doc libreoffice : pas moyen de trouver un endroit avec les syntaxes expliquées, de manière compréhensible, du moins... [;(]
carpe diem
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 30/01/2020 à 01:29 Modifié par Bipbipcoyote


Bonjour,
oui, en effet difficile de trouver une documentation pour libre office... mais s'il veut bien exécuter le VBA, alors cela simplifie les choses...

Mon site n'est pas encore complet, je suis occupé à le faire de temps en temps. Je suis passé à Worpress pour qu'il soit responsive mais je dois refaire toutes les pages et j'avoue que j'ai un peu la flemme alors ça avance petit à petit

Mais pour en revenir à nos carottes... tu peux alors tester si Libre Office accepte d'exécuter une instruction VBA
Tu récupères l'adresse de la dernière cellule remplie , ici de la colonne A
Ensuite tu fais ta boucle (remarque que je considère que les données commencent sur la cellule A3

Sub calcul()
MonAdresse = Range("A3").End(xlDown).Offset(1, 0).Address
MonCompte = 0
Dim Cell As Range
For Each Cell In Range("A3:" & MonAdresse & "")
If IsNumeric(Cell) = True Then
MonCompte = MonCompte + Cell.Value
Next Cell
End If
Range("A3").End(xlDown).Offset(1, 0).Value = MonCompte
End Sub

Je viens de retester sous Excel 2013 apparemment on peut commencer à mettre des chiffres à partir de A1 (en modifiant les adresses en conséquence). Auparavant on recevait un message d'erreur,
Par contre on ne peut toujours pas avoir de cellule vide dans la série à calculer, car la macro s'arrête sur celle-ci et inscrit le résultat partiel trouvé à ce moment là
Pour pallier à cet inconvénient, on peut utiliser 0 comme valeur par défaut (à entrer par l'utilisateur s'il ne connait pas le nombre ou la somme à entrer dans cette cellule. un peu de discipline que diable ;)
le fichier à télécharger sur Cjoint
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 30/01/2020 à 17:01


Bonjour,

Zut ! Je viens de tester sur libre office: ça donne zéro à chaque fois et non pas le résultat attendu, comme ça se fait sur Excel (même avec mon Excel 2000) [;(]

Bon, je vais changer mon fusil d'épaule parce que vu que je dois rendre ma copie assez vite, je vais pas avoir le temps de tout bûcher et trouver la solution, parce qu'en plus ce n'est pas tout à fait cela que je voulais faire
Je pense que je vais carrément lui faire un classeur Remise chq avec un tableau par feuille: sur la feuille de base, il aura le tableau avec les formules toutes faites et il devra simplement remplir avec ses données.
Je vais juste lui apprendre à dupliquer la feuille et ajouter éventuellement des lignes, ce ne devrait pas être insurmontable...
Merci tout de même d'avoir pris le temps de me répondre.

carpe diem
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 30/01/2020 à 22:05 Modifié par Bipbipcoyote


Bonjour,
J'ai installé Libre Office, et chargé mon fichier dedans... apparemment Calc (sa biblio VBA) ne connait pas IsNumeric, si tu mets cette ligne et son end if en remarques , ça fonctionne
mais il y a des actions à prendre... d'abord, aller dans le menu outils - options - sécurité - dans la partie droite sécurité des macros , la régler sur moyen
Dans outils - options - avancé, il faut cocher "Activer les fonctions expérimentales..."
et "activer l'enregistreur de macro" (ça peut servir)

Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 30/01/2020 à 23:53 Modifié par Bipbipcoyote


Bonjour,
Bon, en cherchant sur le net, j'ai trouvé une solution en basic pour Calc

C'est du spaghetti, je te l'accorde mais au vu de mes connaissances actuelles (je ne comprends pas tout ce que j'ai écrit mais le copier-coller ce n'est pas fait pour les chiens), ce n'est déjà pas si mal [:D]

Sub BouclePlageCellules

'recherche et selection de la cellule vide
Sheet = ThisComponent.CurrentController.ActiveSheet
c = Sheet.getCellRangeByName("A:A").queryEmptyCells
getFirstEmptyRowInColumn = Split(c.RowDescriptions(0)," ")
oRow = getFirstEmptyRowInColumn(1)
mycell = Sheet.getCellRangeByName("A" & oRow)
myView = thisComponent.CurrentController
myView.Select(mycell)
'fin de recherche et selection de la cellule vide

'Récupération de son adresse
oActiveCell = ThisComponent.getCurrentSelection ()
oConv = ThisComponent.createInstance ("com.sun.star.table.CellAddressConversion")
oConv.Address = oActiveCell.getCellAddress
DerCel = oConv.UserInterfaceRepresentation
'fin de récupération de son adresse

Dim Feuille As Object, PlageCellules As Object
Dim Plages As Object, oEnum As Object, Cellule As Object

'Retrouve une feuille nommée "Feuil1" dans le classeur
Feuille = ThisComponent.Sheets.getByName("Feuil1")
'Définit la plage de cellules sur laquelle on va boucler
PlageCellules = Feuille.getCellRangeByName("A1:" & DerCel & "")
Plages = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
Plages.insertByName("", PlageCellules)
oEnum = Plages.Cells.CreateEnumeration

'Boucle sur la plage
While oEnum.hasMoreElements
'Ne renvoie rien si la cellule est vide
Cellule = oEnum.NextElement
if isnumeric(Cellule.Value) then
Total= Total + Cellule.Value
End if
Wend
'injection de la somme calculée dans la première cellule vide
Cellule = Feuille.getCellRangeByName("" & DerCel & "")
Cellule.Value = Total
End Sub

comment suis-je arrivé à ce résultat ?
Référence 1 - Trouver la cellule vide
Référence 2 - Pouvoir récupérer l'adresse de cette cellule
Référence 3 - Boucler sur une plage de cellules

https://openoffice-libreoffice.developpez.com/faq/?page=Les-cellules#Comment-boucler-sur-une-plage-de-cellules

Et enfin faire un mélange des 3 références pour obtenir la fonction ci-dessus. Il y a peut être des redondances et il y a sans doute moyen de l'épurer mais bon tant que ça fonctionne...
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 31/01/2020 à 13:47


Bonjour,
Le fichier avec les 2 solutions, VBA et Basic sur CJoint

Pour poser un bouton, il faut aller dans le menu outils - formulaires - cliquer sur Mode conception. Quand ce mode est actif, on peut alors aller dans le menu Insertion - contrôles de formulaire .... ensuite cela se passe comme sous excel , on pose le contrôle, il est sélectionné, clic droit - propriétés du contrôle , sur l'onglet Général on peut modifier son nom et surtout sa légende (étiquette), ensuite on passe sur l'onglet Evénements on clique sur les 3 petits points à hauteur de "exécuter l'action" et on va désigner la macro dans les fenêtres successives.. Finalement on retourne dans le menu outils - formulaires pour désactiver le mode conception
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 01/02/2020 à 16:24 Modifié par Bipbipcoyote


Bonjour,
En complément à ma dernière réponse, on utilise l'offset avec cette formule
car les références des cellules sont en "dur" (ainsi la cellule A1 est identifiée par 0,0). On ne peut donc pas utiliser getCellByPosition(0,0) car cela correspond à A1, getCellByPosition(+1,0) correspond à B1. Il faut donc faire référence à la cellule qui nous intéresse (ici, la première cellule vide dans une colonne)

Cellule = Feuille.getCellByPosition(Cellule.CellAddress.Column + 1,Cellule.CellAddress.Row - 1)

.Column + 1 pour aller sur la colonne de gauche
.Row - 1 pour rester sur la même ligne que la dernière donnée

Pour le nombre de saisies, on peut mettre un simple compteur dans la boucle
Compteur = Compteur +1
et afficher le résultat dans une cellule déterminée par un offset

Maintenant, il reste à découvrir comment récupérer les références d'une sélection de cellules tout à fait aléatoire.
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
2 838 contributions
Membre depuis le 06/03/2001
Envoyé le 01/02/2020 à 17:49


Bonjour,
Voici la récupération d'une plage sélectionnée ... La source mais aussi Sur ce lien

Et un mélange des deux, donne cette procédure. Maintenant que l'on a décortiqué l'adresse de la cellule on peut "jouer" avec l'offset

Sub get_range_address
' on n oublie pas que A1 c'est colonne 0 ligne 0
oActiveCell = ThisComponent.getCurrentSelection ()

oConv = ThisComponent.createInstance ("com.sun.star.table.CellRangeAddressConversion")
oConv.Address = oActiveCell.getRangeAddress

ColHaut = oActiveCell.getRangeAddress.StartColumn
LigHaut = oActiveCell.getRangeAddress.StartRow
ColBas = oActiveCell.getRangeAddress.EndColumn
LigBas = oActiveCell.getRangeAddress.EndRow

MsgBox oConv.UserInterfaceRepresentation
MsgBox "Colonne Sup : " & ColHaut & " - Ligne Sup : " & LigHaut & " - Colonne Inf : " & ColBas & " - Ligne Inf : " & LigBas
End Sub
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 03/02/2020 à 18:35


Bonjour,
tu m'impressionnes [:o]
J'avais déjà trouvé tous ces liens mais je n'arrivais pas à...les relier comme tu l'as fait

carpe diem
gaston gaston
1 471 contributions
Membre depuis le 01/03/2001
Envoyé le 03/02/2020 à 18:38


Bonjour,
tu m'impressionnes [:o]
J'avais déjà trouvé tous ces liens mais je n'arrivais pas à...les relier comme tu l'as fait

Là je suis un peu dans le coaltar, because rhume carabiné, je regarderai donc cela plus tard.
Merci, en tout cas (+)

carpe diem

Participer à cette discussion

« Retour sur la liste des messages de ce forum