Page 1 sur 1

[Résolu][Calc] Utilisation d'un "loop" (boucle)

Publié : 02 janv. 2020 12:32
par bzh
Bonjour,

Je me permets de vous contacter car je n'arrive pas à utiliser la fonction loops sur les macros (je n'ai pas compris en lisant les tuto "basic guide").

Voici ci-dessous la fonction nommer "bloc de commande" que je souhaite dupliquer jusqu'à la fin du document:

Code : Tout sélectionner

REM  *****  BASIC  *****

sub Main

rem define variables
dim document   as object
dim dispatcher as object

rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem bloc de commande
		dispatcher.executeDispatch(document, ".uno:SelectCell", "", 0, Array())
		dispatcher.executeDispatch(document, ".uno:Cut", "", 0, Array())
		dim args3(1) as new com.sun.star.beans.PropertyValue
		args3(0).Name = "By"
		args3(0).Value = 1
		args3(1).Name = "Sel"
		args3(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())
		dim args4(1) as new com.sun.star.beans.PropertyValue
		args4(0).Name = "By"
		args4(0).Value = 1
		args4(1).Name = "Sel"
		args4(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args4())
		dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
		dim args6(1) as new com.sun.star.beans.PropertyValue
		args6(0).Name = "By"
		args6(0).Value = 1
		args6(1).Name = "Sel"
		args6(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, args6())
		dim args7(1) as new com.sun.star.beans.PropertyValue
		args7(0).Name = "By"
		args7(0).Value = 1
		args7(1).Name = "Sel"
		args7(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args7())
		dim args8(1) as new com.sun.star.beans.PropertyValue
		args8(0).Name = "By"
		args8(0).Value = 1
		args8(1).Name = "Sel"
		args8(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args8())
		dim args9(1) as new com.sun.star.beans.PropertyValue
		args9(0).Name = "By"
		args9(0).Value = 1
		args9(1).Name = "Sel"
		args9(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args9())
		dim args10(1) as new com.sun.star.beans.PropertyValue
		args10(0).Name = "By"
		args10(0).Value = 1
		args10(1).Name = "Sel"
		args10(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args10())

rem ----------------------------------------------------------------------


rem ----------------------------------------------------------------------

end sub
Quelle ligne de code dois-je rajouter ?

Merci d'avance pour votre retour.

Re: Utilisation d'un "loops" en macro

Publié : 02 janv. 2020 13:03
par Bidouille
Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche. Avez-vous remarqué comment étaient les autres questions postées ?

Lisez ce fil pour savoir quelle balise utiliser : http://forum.openoffice.org/fr/forum/su ... html#27295

N'oubliez pas que le terme "Macro" ou "OpenOffice" ne doit pas être employé car il est implicite. Essayer de synthétiser au mieux ce que vous cherchez à faire.

Un titre accrocheur vous permettra d'une part d'être aidé plus rapidement et d'autre part, d'enrichir notre base de connaissances.

Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même sous peine de voir votre sujet verrouillé.

Re: [Basic] Utilisation d'un "loops"

Publié : 02 janv. 2020 13:06
par Dude
Salut,
bzh a écrit :je n'arrive pas à utiliser la fonction loops
Normal, ça n'existe pas.
Image
capture.png

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 02 janv. 2020 14:39
par bzh
Ok merci pour l'info, j'ai modifié le titre. N'hésitez pas à me dire s'il manque quelque chose.

Dude, oui j'ai lu ça mais j'ai un problème de syntaxe lorsque je le rajoute à la macro (je n'ai pas compris comment l'intégrer dans la ligne de commande).

Code : Tout sélectionner

rem ----------------------------------------------------------------------

[color=#FF0000]    If dispatcher <> "" Then
        Do[/color]

rem bloc de commande

		dispatcher.executeDispatch(document, ".uno:SelectCell", "", 0, Array())
		dispatcher.executeDispatch(document, ".uno:Cut", "", 0, Array())
		dim args3(1) as new com.sun.star.beans.PropertyValue
		args3(0).Name = "By"
		args3(0).Value = 1
		args3(1).Name = "Sel"
		args3(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())
		dim args4(1) as new com.sun.star.beans.PropertyValue
		args4(0).Name = "By"
		args4(0).Value = 1
		args4(1).Name = "Sel"
		args4(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args4())
		dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
		dim args6(1) as new com.sun.star.beans.PropertyValue
		args6(0).Name = "By"
		args6(0).Value = 1
		args6(1).Name = "Sel"
		args6(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, args6())
		dim args7(1) as new com.sun.star.beans.PropertyValue
		args7(0).Name = "By"
		args7(0).Value = 1
		args7(1).Name = "Sel"
		args7(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args7())
		dim args8(1) as new com.sun.star.beans.PropertyValue
		args8(0).Name = "By"
		args8(0).Value = 1
		args8(1).Name = "Sel"
		args8(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args8())
		dim args9(1) as new com.sun.star.beans.PropertyValue
		args9(0).Name = "By"
		args9(0).Value = 1
		args9(1).Name = "Sel"
		args9(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args9())
		dim args10(1) as new com.sun.star.beans.PropertyValue
		args10(0).Name = "By"
		args10(0).Value = 1
		args10(1).Name = "Sel"
		args10(1).Value = false
		dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args10())

rem ----------------------------------------------------------------------

 [color=#FF0000]           MsgBox dispatcher
            dispatcher = Dir$
        Loop Until dispatcher = ""
    End If
[/color]
rem ----------------------------------------------------------------------

end sub
rem ----------------------------------------------------------------------
Je tente des choses mais je patauge...

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 02 janv. 2020 14:57
par Dude
bzh a écrit :Je tente des choses mais je patauge
Tu tentes surtout le pifomètre. :tesfou:

Là encore, est-ce que tu as lu l'aide sur la fonction Dir ?
As-tu testé ce qui était renvoyé dans ta variable de sortie de boucle ?
capture.png
Il serait largement plus efficace de fournir un document accompagné de ta macro.
Et nous expliquer ce que tu cherches à faire exactement.

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 02 janv. 2020 18:13
par bzh
C'est du pifomètre car je n'ai jamais reçu de formation, je viens de lire l'aide sur la fonction Dir mais ça ne m'aide pas.

Pour faire simple voila ce que j'essaie de faire:
Sans titre 1.png
Déplacer le contenant de la cellule A3 dans la cellule B2, A6 dans la cellule B5...etc.

J'ai environ 1000 cellules à déplacer et les faire une par une... no way.

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 03 janv. 2020 08:31
par Dude
bzh a écrit :je viens de lire l'aide sur la fonction Dir mais ça ne m'aide pas.
Dir renvoie une liste de fichiers dans un répertoire donné.
Explique moi ce que tu cherches à faire avec dans ton classeur ? :shock:
bzh a écrit :Pour faire simple voila ce que j'essaie de faire
Une copie écran, c'est bien mais comment veux-tu qu'on travaille avec ?
Relire plus attentivement ce qu'il y a écrit :fournir un document accompagné de ta macro.

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 03 janv. 2020 09:29
par Jeff
Bonjour à tous,
Dude a écrit :Une copie écran, c'est bien mais comment veux-tu qu'on travaille avec ?
+ 1 pour un fichier :)

Si je m'en tiens à la copie-écran, dans la mesure où tu souhaites récupérer systématiquement une données toutes les 3 lignes, cela peut rapidement être mis en place avec une formule, une copie/collage spécial, un filtre et une suppression, soit en moins 5 minutes.

A +

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 03 janv. 2020 12:29
par bzh
Bonjour,
Dir renvoie une liste de fichiers dans un répertoire donné.
Explique moi ce que tu cherches à faire avec dans ton classeur ?
J'ai juste essayé la fonction boucle que j'avais trouvé dans les diverses aide que j'ai pu trouver mais il me semble que ce n'est pas adapté dans ma macro.
Une copie écran, c'est bien mais comment veux-tu qu'on travaille avec ?
Désolé, ci-joint le document et ci-dessous le début de macro:

Code : Tout sélectionner

REM  *****  BASIC  *****


sub Main
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:CellSelec", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Cut", "", 0, Array())
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "By"
args4(0).Value = 1
args4(1).Name = "Sel"
args4(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args4())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "By"
args6(0).Value = 1
args6(1).Name = "Sel"
args6(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, args6())
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1
args7(1).Name = "Sel"
args7(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args7())
dim args8(1) as new com.sun.star.beans.PropertyValue
args8(0).Name = "By"
args8(0).Value = 1
args8(1).Name = "Sel"
args8(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args8())
dim args9(1) as new com.sun.star.beans.PropertyValue
args9(0).Name = "By"
args9(0).Value = 1
args9(1).Name = "Sel"
args9(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args9())
dim args10(1) as new com.sun.star.beans.PropertyValue
args10(0).Name = "By"
args10(0).Value = 1
args10(1).Name = "Sel"
args10(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args10())

rem ----------------------------------------------------------------------

rem ----------------------------------------------------------------------

end sub
Lorsque je sélectionne la case A2 puis lance la macro, les données sont transférer en B2.
Si je spam la macro cela passe à la casse suivante (A6 passe en B5)...etc.
cela peut rapidement être mis en place avec une formule, une copie/collage spécial, un filtre et une suppression, soit en moins 5 minutes.
Cela fait beaucoup de manip et je voulais faire juste un bouton avec une macro pour rendre cela plus facile pour l'utilisateur qui passera après moi.

Au passage merci beaucoup de votre aide.

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 03 janv. 2020 14:30
par Dude
Voici une boucle qui appelle une routine pour déplacer la cellule des 11 premières lignes :

Code : Tout sélectionner

Sub Boucle
	oDoc = ThisComponent()
	oFeuil = oDoc.Sheets(0)
	
	For i = 0 to 10
		i = i + 2
		Deplace(oFeuil, i)
	Next i
End Sub

Sub Deplace(oFeuil, nLigne)
	Dim oPAdr As New com.sun.star.table.CellRangeAddress
	Dim oCAdr As New com.sun.star.table.CellAddress
	'Cellule depart 
	oPAdr.Sheet = oFeuil.RangeAddress.Sheet
	oPAdr.StartColumn = 0
	oPAdr.StartRow = nLigne
	oPAdr.EndColumn = 0
	oPAdr.EndRow = nLigne
	'Cellule arrive 
	oCAdr.Sheet = oFeuil.RangeAddress.Sheet
	oCAdr.Column = 1
	oCAdr.Row = nLigne-1
	 
	oFeuil.moveRange(oCAdr, oPAdr)
End Sub
NB : l'index d'une feuille démarre à 0

Re: [Calc] Utilisation d'un "loop" (boucle)

Publié : 06 janv. 2020 17:49
par bzh
Merci pour l'aide j'ai pu finaliser ma macro.

Il me reste juste des lignes vides, j'ai complété avec un autre bout de code que j'ai trouvé sur un autre sujet sur le site:

Code : Tout sélectionner

Option Explicit

Sub Supprime_lignes_vides
' Les lignes vides sont supprimées si il n'y a rien en A et B
Dim maFeuille As Object, curseur As Object, lesLignes As Object
Dim cellule_A As Object
Dim derniereLignePleine As Long, x As Long, y As Long, i As Long
'Modifier le nom de la feuille avant action
maFeuille = Thiscomponent.Sheets.GetByName("Feuille1")
lesLignes = maFeuille.Rows
curseur = maFeuille.createCursor
curseur.gotoEndOfUsedArea(True)
derniereLignePleine = curseur.RangeAddress.EndRow
x = 0
y = derniereLignePleine
For i = y To 0 step -1

' Déterminer la colone à prendre en comtpe (valeur en rouge)
   cellule_A = maFeuille.GetCellByPosition(x+1,i)   
   if cellule_A.String = "" Then
      lesLignes.removeByIndex(i,1)
   end If
next      
End Sub
Encore merci.