[Résolu][Calc] Si vide décaler vers le bas de colonne A à B

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 !
alex85
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 05 nov. 2019 14:15

[Résolu][Calc] Si vide décaler vers le bas de colonne A à B

Message par alex85 »

Bonjour,

J'ai un petit souci, étant novice, j'ai besoin de votre aide.

Sur une feuille calc avec 2 colonnes, est il possible de décaler vers le bas chaque cellules vides de la col B jusqu'à la première cellule pleine de la col A, afin d'avoir des colonnes plus ordonnées.

Merci.
Pièces jointes
open 2.ods
(11.88 Kio) Téléchargé 91 fois
Dernière modification par Bidouille le 10 nov. 2019 11:46, modifié 2 fois.
Raison : Balisage
LibO 7.1 sous windows 10
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par luky-luke »

Bonjour
Une solution à tester.

Code : Tout sélectionner

Option Explicit
Sub Main
Dim Feuille As Object, MaZoneA As Object, MaZoneB As Object
Dim ZonesVideA As Object, ZonesVideB As Object
Dim CDepartA As Object, CDepartB As Object, CArrivA As Object, CArrivB As Object
Dim i As Long

Feuille = ThisComponent.Sheets.GetByName("Feuille1_2")
MaZoneA = Feuille.GetCellRangeByName("A1:A100")
MaZoneB = Feuille.GetCellRangeByName("B1:B100")

ZonesVideA = MaZoneA.QueryEmptyCells.RangeAddresses
ZonesVideB = MaZoneB.QueryEmptyCells.RangeAddresses
	For i = 0 To Ubound(ZonesVideA)-1
		
		If ZonesVideA(i).StartRow < ZonesVideB(i).StartRow Then			
			CDepartA = Feuille.GetCellRangeByPosition(0,ZonesVideA(i).StartRow,0,ZonesVideA(Ubound(ZonesVideA)).EndRow)
			CArrivA = Feuille.GetCellByPosition(0,ZonesVideB(i).EndRow)
			Feuille.MoveRange(CArrivA.CellAddress,CDepartA.RangeAddress)
			ZonesVideA = MaZoneA.QueryEmptyCells.RangeAddresses
		End if

		If ZonesVideB(i).StartRow < ZonesVideA(i).StartRow Then
			CDepartB = Feuille.GetCellRangeByPosition(1,ZonesVideB(i).StartRow,1,ZonesVideB(Ubound(ZonesVideB)).EndRow)
			CArrivB = Feuille.GetCellByPosition(1,ZonesVideA(i).EndRow)
			Feuille.MoveRange(CArrivB.CellAddress,CDepartB.RangeAddress)
			ZonesVideB = MaZoneB.QueryEmptyCells.RangeAddresses
		End if						
	Next i
End Sub
Cette macro fonctionnera correctement si et uniquement si Le nombre de plages de cellules vides dans la colonne A est identique au nombre de plages de cellules vides dans la colonne B.
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
alex85
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 05 nov. 2019 14:15

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par alex85 »

bonjour, lucky-luke

merci de ton aide, mais je ne peux pas l'essayer, ça ne fonctionne pas
"Erreur d'exécution BASIC.
Une exception s'est produite :
Type: com.sun.star.container.NoSuchElementException
Message: ."

"Notre seul pouvoir véritable consiste à aider autrui".
LibO 7.1 sous windows 10
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par luky-luke »

Bonjour
J'ai oublié de préciser qu'il faut adapter dans la macro le nom de la feuille et les plages de cellules concernées.
Feuille = ThisComponent.Sheets.GetByName("Feuille1_2")
MaZoneA = Feuille.GetCellRangeByName("A1:A100")
MaZoneB = Feuille.GetCellRangeByName("B1:B100")
Cordialement
Luke
Pièces jointes
open 3.ods
(14.61 Kio) Téléchargé 94 fois
Dernière modification par luky-luke le 09 nov. 2019 15:40, modifié 1 fois.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
alex85
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 05 nov. 2019 14:15

Re: [Résolu] Si cellules Col. B vide décaler vers le bas à C

Message par alex85 »

c top pou moi c résolu merci lucky

"Le don de soi est ce qu’on peut offrir de plus grand".
LibO 7.1 sous windows 10
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par luky-luke »

Re
alex85 a écrit :"Le don de soi est ce qu’on peut offrir de plus grand".
Je vais prendre le temps de réfléchir à ça . En même temps ce n'est qu'un forum :lol:
Ah oui Luky c'est sans C Et la balise [Résolu] Image c'est dans le premier message du fil....mince alors !
Luky Luke
Dernière modification par luky-luke le 09 nov. 2019 15:50, modifié 1 fois.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
alex85
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 05 nov. 2019 14:15

Re:[Résolu] Si cellules Col. B vide décaler vers le bas à Co

Message par alex85 »

merci
"Personne ne se lasse d’être aidé. L’aide est un acte conforme à la nature. Ne te lasse jamais d’en recevoir, ni d’en apporter"
LibO 7.1 sous windows 10
Avatar de l’utilisateur
Beetle
MOOdérateur
MOOdérateur
Messages : 15
Inscription : 23 mars 2018 23:42

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par Beetle »

Bonjour,
Comme vous l'a déjà mentionné luky-luke, un intervenant actif de ce forum, veuillez baliser correctement votre fil en plaçant la coche verte, et la mention [Résolu] sur votre premier message.
De plus, modifiez aussi la balise: [Calc] et non [Calc ] , avec une espace excédentaire.
Cordialement,
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par joel275 »

Bonjour,

Damned! Encore trop tard!
mais
luky-luke a écrit :Cette macro fonctionnera correctement si et uniquement si Le nombre de plages de cellules vides dans la colonne A est identique au nombre de plages de cellules vides dans la colonne B.
l'exemple suivant doit fonctionner sans cette limitation.

Code : Tout sélectionner

Sub Main
Rem Récupère les données
	feuille = Thiscomponent.CurrentController.ActiveSheet
	dataA = feuille.getCellRangeByPosition (0,0,0,1000).DataArray
	dataB = feuille.getCellRangeByPosition (1,0,1,1000).DataArray
Rem Découpe les données
	paquetA = Decoupe(dataA)
	paquetB = Decoupe(dataB)
Rem On remet les morceaux à leur place
	n = iif(Ubound(paquetA) > Ubound(paquetB),Ubound(paquetA),Ubound(paquetB)) 
	for i = 0 to n
		if i > Ubound(paquetA) then Aimax = -1 Else Aimax = Ubound(paquetA(i))
		if i > Ubound(paquetB) then Bimax = -1 Else Bimax = Ubound(paquetB(i))
		for j = 0 to iif(Aimax > Bimax, Aimax, Bimax)
			cellA = feuille.getCellByPosition(4, li)
			cellB = feuille.getCellByPosition(5, li)
			if j < Aimax Then cellA.value = paquetA(i)(j)
			if j < Bimax Then cellB.value = paquetB(i)(j)
			li = li + 1
		next	
	next
End Sub

Function Decoupe(donnees as Variant) as Variant
dim VF as boolean
	VF = True
	for i = 0 to 1000
		if donnees(i)(0) = "" And VF = False Then A = A & "$": VF = True
		if donnees(i)(0) <> "" then A = A & donnees(i)(0) & "#": VF = False
	next
	U = split(A, "$")
	dim V(UBound(U))
	for i = 0 to UBound(U)
		V(i) = split(U(i), "#")	
	next
	Decoupe = V
End Function
A plus.
 Ajout : même jour à 21 h: correction grâce à l'aimable signalement de luky-luke 
Dernière modification par joel275 le 09 nov. 2019 20:56, modifié 2 fois.
A jour de LibreOffice et de Ubuntu
alex85
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 05 nov. 2019 14:15

[Résolu][Calc]cellules Col. B vide décaler vers le bas à Col

Message par alex85 »

Merci pour votre aide Joel, Luky ainsi qu" a toutes et à tous qui apportent leurs aides sur ce forum ou partout ailleurs.

"Obéissez à la voix intérieure, elle nous commande de donner de nous-mêmes et d’aider les autres. Tant que nous avons la capacité de donner, nous sommes vivants"

"Celui qui consacre ses facultés mentales, son temps, ses forces, à venir en aide à son prochain, est le plus intelligent. Car la véritable intelligence, c’est de s’oublier pour se mettre au service des autres." :bravo:
LibO 7.1 sous windows 10
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Calc ] Si cellules Col. B vide décaler vers le bas à Co

Message par luky-luke »

Re
Re
La fonction MAX ne peut pas être directement utilisé en macro

Code : Tout sélectionner

Rem On remet les morceaux à leur place
   n = max(Ubound(paquetA), Ubound(paquetB))
Il faut utiliser le service UNO qui va bien

Code : Tout sélectionner

    Args() = Array(Ubound(paquetA), Ubound(paquetB))
    FuncAcces = CreateUnoService("com.sun.star.sheet.FunctionAccess")
    n = FuncAcces.CallFunction("MAX",Args())
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

Re: [Résolu][Calc] Si vide décaler vers le bas à Col A

Message par joel275 »

Re,
luky-luke a écrit :La fonction MAX ne peut pas être directement utilisé en macro
merci pour cette précision: je corrige dans mon message.
J'avais programmé cette fonction max quelque part dans "Mes macros" et l'y avais oublié: mille excuses! :oops:

A plus.
A jour de LibreOffice et de Ubuntu
Verrouillé