[Résolu][Calc] Automatiser l'insertion de 4 sous-lignes

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 !
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par Churay »

jjk a écrit :le principe du tableur c'est d'abord les formules, et seulement après, les macros qui sont chargées de traiter les cas inaccessibles aux formules.
Totalement d'accord, mais dans les formules un peu complexes, je m'emmêle assez rapidement les pinceaux...
jeanmimi a écrit :Et pas besoin de Macro.
Vi vi, mais les macros me sauvent ;)

Code : Tout sélectionner

Option Explicit

Sub Ajout4Lignes
Dim oDoc, oSheet, oRange, oCursor As Object
Dim nbF, nbLig, i, j, k As Integer
Dim Nom() As String
	' Le document 
	oDoc = ThisComponent 
	' Le nombre de feuilles
	nbF = oDoc.Sheets.Count
	For i = 0 to oDoc.Sheets.Count-1
		' La feuille à traiter (la 1ère porte l'indice 0)
		oSheet = oDoc.Sheets(i)
		' Création d'un curseur de Cellule
		oCursor = oSheet.createCursor 
		oCursor.gotoEndOfUsedArea( False )
		' L'index de la première ligne = 0 
		nbLig = oCursor.RangeAddress.EndRow
		' Le test permet d'éviter le traitemoent d'une feuille vierge
		if nbLig > 0 Then
			' Redéclaration du tableau nom ==> raz
			ReDim Nom(nbLig)
			' Récupération des noms de ville
			For j = 0 to nbLig
				Nom(j) = oSheet.getCellByPosition(0,j).string
			Next j
			' 1ère ligne à partir de laquelle on va réécrire
			k = 0
			' Boucle sur les noms sauvegardés
			For j = 0 to uBound(Nom)
				' Ecriture en colonne A (indice 0), sur la 1ère ligne non utilisée
				' 	du nom : ligne k, suivi de Nord, Sud... 
				' 	une ligne en dessous, soit k+1, k+2...
				oSheet.getCellByPosition(0,k).string = Nom(j)
				oSheet.getCellByPosition(0,k+1).string = "Nord"
				oSheet.getCellByPosition(0,k+2).string = "Sud"
				oSheet.getCellByPosition(0,k+3).string = "Est"
				oSheet.getCellByPosition(0,k+4).string = "Ouest"
				' 
				' Justification à droite  des 4 lignes de localisation
				'   à supprimer ou à mettre en commentaire au besoin
				' 
				' Sélection des 4 dernières lignes écrites
				oRange = oSheet.getCellRangeByPosition(0,k+1,0,k+4)
				' Justification à droite
				oRange.HoriJustify = 3  ' com.sun.star.table.CellHoriJustify.RIGHT
				' 
				' Pour plus d'infos sur com.sun.star.table.xxx.yyy :
				' 	http://wiki.services.openoffice.org/wiki/Spreadsheet_common
				'   ou 
				' 	le SDK...
				'   
				' La prochaine ligne sur laquelle il faudra écrire
				k = k+5
			next j
		end if
	Next
End Sub
 Ajout : 1
La gestion Nord/sud/... pourrait s'aborder autrement mais pour 4 lignes... 
 Ajout : 2
Commentaires ajoutés pour plus de clarté 
Dernière modification par Churay le 14 août 2010 10:21, modifié 4 fois.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6090
Inscription : 02 janv. 2009 23:56

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par Jean-Louis Cadeillan »

Bravo jjk ! CHOISIR() et MOD() s'imposent ici... Histoire de mettre un peu de biOOodiversité, on pourrait mettre, à la place de :

Code : Tout sélectionner

DECALER(A$2;ENT((LIGNE()-2)/5);0)
Une variante :

Code : Tout sélectionner

INDIRECT(ADRESSE(ENT((LIGNE()-2)/5)+2;1))
Ou encore :

Code : Tout sélectionner

INDIRECT("A$"&ENT((LIGNE()-2)/5)+2)
Et
jeanmimi a écrit :Il est ensuite possible de masquer les lignes et colonnes inutiles.
...par exemple en faisant un test par rapport à la dernière ligne non vide :

Code : Tout sélectionner

SI(((LIGNE()-2)/5)+1>=EQUIV(".*";$A$1:$A$65536;1);""........
(".*" suppose d'autoriser les caractères génériques dans les formules)

Ce qui donnerait, par exemple, au final :

Code : Tout sélectionner

=SI(((LIGNE()-2)/5)+1>=EQUIV(".*";$A$1:$A$65536;1);"";CHOISIR(MOD((LIGNE()-2);5)+1;INDIRECT(ADRESSE(ENT((LIGNE()-2)/5)+2;1));"Nord";"Sud";"Est";"Ouest"))
De même, on pourrait repérer la première ligne non vide par :

Code : Tout sélectionner

EQUIV(".*";$A$1:$A$65536;0) 
A noter la MFC de jjk pour repérer en gras les villes...

Mais bon, cette formule est fugace par essence ...puisque destinée à disparaître après le copier coller ! :marto:

Merci aussi à Churay et Dude pour les approches macros...j'en prends bonne note ! :P
A+
Jean-Louis
Windows 10 Pro 64, LibO 25.8.6.2 (JRE 1.8.0_481) et AOO 4.1.16 (Adoptium 19.0.2.7)
Fab3181
NOOuvel adepte
NOOuvel adepte
Messages : 18
Inscription : 09 août 2010 10:43

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par Fab3181 »

Bon je teste et vous tiens au courant.
Open Office 3.2.0. - Windows XP - SP 2
Fab3181
NOOuvel adepte
NOOuvel adepte
Messages : 18
Inscription : 09 août 2010 10:43

Re: [Résolu][Calc] Automatiser l'insertion de 4 sous-lignes

Message par Fab3181 »

Bonjour à tous,

tout d'abord, merci à tout le monde pour vos réponses et votre écoute. J'ai essayé toutes les formules et macros.

Concernant la formule de Jjk, j'ai effectivement décalé ma liste de ville en ligne 2. J'ai ensuite copié la formule à l'endroit indiqué (je pense) : dans la barre en haut du tableau. J'ai sélectionné la ligne 2 / colonne 3 comme le préconisait jeanmimi mais la seule chose qui s'est affiché fût... la formule !! J'ai dû faire un fausse manip et je te prie de m'excuser Jjk si j'ai échoué.

Pour les macros, j'ai bien sûr testé celle de Dude mais elle n'était pas complète et finalement c'est la macro de Churay qui m'a permis d'avoir la solution ! Et quelle surprise de voir une magnifique liste de ville avec NORD / SUD / EST / OUEST incorporé. Vraiment bravo et encore merci Churay ! Tu m'enlèves un épine du pied !! ;-)

Merci à tout le monde d'avoir apporté sa pierre à l'édifice. Je peux donc maintenant écrire que le problème est résolu !

Je vous souhaite à tous une bonne continuation. Longue vie à ce forum et à OOo. Je vous dis à bientôt. Je suis sûr que je trouverai d'autres questions...

Merci à tous.

Cordialement.

Fabien
Dernière modification par Fab3181 le 15 août 2010 19:41, modifié 1 fois.
Open Office 3.2.0. - Windows XP - SP 2
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6090
Inscription : 02 janv. 2009 23:56

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par Jean-Louis Cadeillan »

Fab3181 a écrit :la seule chose qui s'est affiché fût... la formule
... pour qu'une formule fonctionne, il faut saisir = au début :wink: , sinon, effectivement, c'est le texte de la formule qui s'affiche...
A+
Jean-Louis
 Ajout : ... ou alors Outils>Options>OpenOffice.org Calc>Afficher>Formules est coché... mais il faut le vouloir ! 
Windows 10 Pro 64, LibO 25.8.6.2 (JRE 1.8.0_481) et AOO 4.1.16 (Adoptium 19.0.2.7)
jjk
HédOOniste
HédOOniste
Messages : 1696
Inscription : 27 oct. 2008 14:30

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par jjk »

Fab3181 a écrit :J'ai dû faire un fausse manip et je te prie de m'excuser Jjk si j'ai échoué.
Mais comme tu ne joins pas ton fichier, c'est bien difficile de t'aider :(
OpenOffice 3.1.1 sous XP-SP2 et LibreOffice 3.5.0 sous Win 7
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc] Automatiser l'insertion de 4 sous-lignes

Message par Churay »

Bonsoir,
Fab3181 a écrit :Pour les macros, j'ai bien sûr testé celle de Dude mais elle n'était pas complète
Dude a simplement voulu te montrer comment aborder un pb avec l'enregistreur de macros qui te permet d'obtenir des éléments du langage plus facilement qu'en passant par l'API, méthode qui demande une recherche d'infos plus poussée.
Dude a écrit :Je prends 2 minutes pour utiliser l'enregistreur de macro, faire l'insertion d'une ligne, répéter l'action 3 fois et descendre 4 lignes plus bas.
J'insère le code dans une boucle ce qui me donne :
Par ailleurs, il t'a répondu avant que sous-ligne1, sous-ligne2... se transforme en Nord, Sud...

Pour la bonne forme la résolution d'un sujet passe par l'icône que tu as bien utilisé et par la modification du titre avec ajout de la balise [Résolu] :
[Calc] Automatiser l'insertion de 4 sous-lignes
devenant
[Résolu][Calc] Automatiser l'insertion de 4 sous-lignes
Si c'est trop long, tu peux raccourcir en [Résolu][Calc] Insertion de 4 sous-lignes puisqu'une macro, par définition, est utilisée pour automatiser un traitement.

cOOordialement
 Ajout : Attention
La macro proposée fonctionne à minima : il n'y a aucune autre info dans les colonnes suivantes.
Dans un tableau comportant plusieurs colonnes renseignées, il serait plus judicieux, selon le nombre de colonnes utilisées, de passer par l'insertion réelle de lignes (que ce soit avec l'enregistreur ou avec l'API) plutôt que de balayer l'ensemble de la feuille pour sauvegarder les infos dans un Array qui risque fort d'être conséquent... 
 Ajout : 2
En mode insertion, le code est même plus compact...

Code : Tout sélectionner

Sub Insert4Lignes
Dim oDoc, oSheet, oRange, oCursor As Object
Dim nbF, nbLig, i, j, k As Integer
	'
	oDoc = ThisComponent 
	nbF = oDoc.Sheets.Count
	For i = 0 to oDoc.Sheets.Count-1
		i = 0
		oSheet = oDoc.Sheets(i)
		oCursor = oSheet.createCursor 
		oCursor.gotoEndOfUsedArea( False )
		' L'index de la première ligne = 0 
		nbLig = oCursor.RangeAddress.EndRow
		if nbLig > 0 Then
			k = nbLig
			' On commence par la fin pour ne pas avoir à gérer 
			'	les index de ligne modifiés par l'insertion
			For j = k+1 to 1 step -1
				oSheet.getRows.insertByIndex( j, 4 )
				oSheet.getCellByPosition(0,j).string = "Nord"
				oSheet.getCellByPosition(0,j+1).string = "Sud"
				oSheet.getCellByPosition(0,j+2).string = "Est"
				oSheet.getCellByPosition(0,j+3).string = "Ouest"
				' on sélectionne les 4 lignes ajoutées
				oRange = oSheet.getCellRangeByPosition(0,j,0,j+3)
				' qu'on justifie éventuellement
				oRange.HoriJustify = com.sun.star.table.CellHoriJustify.RIGHT
			next j
		end if
	Next i
End Sub
 
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...