Page 1 sur 1

[Résolu][Calc] Collage special à la suite sur ligne vide

Publié : 09 sept. 2020 08:51
par NUMIS88
Bonjour à tous,

Après avoir parcouru les différents sujets, je ne parviens pas à trouver une solution à ma problématique.

Pourtant, cela doit être courant, je m'explique :


Le but est de copier des cellules définies d'une feuille de calcul, puis d'effectuer un collage spécial, sur une autre feuille, mais à partir de la première ligne vide.

Le première partie , j'y parviens à travers la macro suivante : (exemple)

Code : Tout sélectionner

Sub CopierCollerEntreFeuilles() 
        Dim Args(),Opts()
        ' Classeur courant
        Doc = ThisComponent
        SheetCopy = Doc.Sheets().getByName("Feuille1")
        ' on copie la plage de cellules source
        oRange = SheetCopy.getCellRangeByName("A1:A10")
        da = oRange.getDataArray
        ' on choisit la feuille de destination
        SheetPaste = Doc.Sheets().getByName("Feuille2")
        ' on colle la plage de cellules source dans la plage destination
        oRange = SheetPaste.getCellRangeByName("C1:C10") 'la plage doit être de même taille que celle de la source
        oRange.setDataArray(da)
        End Sub
La seconde partie, j'y parviens à travers la macro suivante : (exemple)

Code : Tout sélectionner


REM  *****  BASIC  *****
option explicit

Sub Main
dim oDoc as object, oFeuille as object, oCol as object
dim indexCol as long, indexFeuille as integer
dim indexLigne as long

	indexFeuille = 0
	oDoc = thisComponent
	oFeuille = oDoc.sheets.getByIndex(indexFeuille)
	oCol = oFeuille.getColumns.getByName("A")
	indexCol = oCol.getRangeAddress.startColumn 
	
	indexLigne = acGetIndexLigneFin(indexFeuille, indexCol)
	msgBox("Début de zone libre " & chr(13) _
		& "en " & oCol.ColumnDescriptions(0)  & " : " _
		& "ligne " & indexLigne + 2, 64, "acGetIndexLigneFin      ")
end sub

'************************************************************ 20/02/09
'**** Retourne l'index de la ligne
'**** de la dernière cellule non vide de la colonne indexCol
'*********************************************************************
function acGetIndexLigneFin(iFeuille as integer, iCol as long) as long
dim oDoc as object, oFeuille as object, oCol as object
dim dscCherche as object
dim oCell as object
dim oCellAdresse as object
dim ligneMaxi as long
dim ligneFin as long

	ligneFin = -1	' par défaut, retourne -1
	oDoc = thisComponent
	oFeuille = oDoc.sheets.getByIndex(iFeuille)
	oCol = oFeuille.getColumns.getByIndex(iCol)
	
	' Se positionner sur la dernière cellule de la colonne
	ligneMaxi = oFeuille.rangeAddress.endRow
	oCell = oFeuille.getCellByPosition(0,ligneMaxi)
	oDoc.currentController.select(oCell)
	
	' Effectuer une recherche vers le haut
	dscCherche = oCol.createSearchDescriptor
	with dscCherche
		.SearchString = "."
		.SearchBackwards = true
		.SearchRegularExpression = true
	end with
	oCell = oCol.findFirst(dscCherche)
	if (isNull(oCell) = false) then
		' Cellule trouvée
		oCellAdresse = oCell.cellAddress
		ligneFin = oCellAdresse.row
		oDoc.currentController.select(oCell)
	end if
	acGetIndexLigneFin = ligneFin
end function
Cependant, après maintes tentatives, je ne réussis pas à associer les deux.

Si un utilisateur du forum pouvait m' apporter une solution, cela serait super sympa.
J'imagine que cela doit être sollicité régulièrement.

Merci beaucoup par avance,

Re: Copie cellules feuille calcul vers 1° ligne vide 2° feui

Publié : 09 sept. 2020 09:42
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

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: [Calc] Copie cellules en 1ere ligne vide 2e feuille

Publié : 09 sept. 2020 09:44
par NUMIS88
Merci pour les conseils, effectivement, je débute sur le forum.

Cordialment,

Re: [Calc] Macro collage special à la suite sur ligne vide

Publié : 10 sept. 2020 06:45
par Dude
Salut,

Comme toujours, pourquoi ne pas fournir le document incluant ces macros ?

Dans ce fil, je donne une fonction permettant de détecter la première cellule vide d'une ligne.
Tu peux t'en inspirer.

PS : "macro" est inutile dans un titre car ici toutes les questions traitent de macros.

Re: [Calc] Macro collage special à la suite sur ligne vide

Publié : 10 sept. 2020 18:41
par NUMIS88
Bonjour Dude,

Merci pour ta réponse.

Je joins un fichier résumant ma problématique et les macros dont je dispose.

Cela serait cool de pouvoir Y parvenir.

Je parcours le forum, mais je n'y arrive pas encore.

Merci par avance, tant à toi qu'à tous ceux qui pourraient m'y aider.

Cordialement,

Re: [Calc] Macro collage special à la suite sur ligne vide

Publié : 11 sept. 2020 06:40
par Dude
As-tu étudié le fil donné au moins ? :?

Voici une fonction qui renvoie le n° de la 1ere ligne trouvée sur une plage :

Code : Tout sélectionner

Function RENVOI_LIGNE_VIDE(sPlage)
	aPlage = split(sPlage,".")
	oFeuil = ThisComponent.Sheets.getByName(aPlage(0))
	oZone = oFeuil.getCellRangeByName(aPlage(1))
	oPlage = oZone.queryEmptyCells.RangeAddresses
	RENVOI_LIGNE_VIDE = oPlage(0).StartRow + 1
End Function
Il suffit de l'utiliser pour faire ton collage.
renvoi_ligne_vide.ods
Bis repetitae :
Tu n'as rien modifié de ce qu'il y a écrit : "macro" est inutile dans un titre car ici toutes les questions traitent de macros.

Re: [Calc] Collage special à la suite sur ligne vide

Publié : 11 sept. 2020 07:30
par NUMIS88
Bonjour Dude,

Oui, bien sur, mais cela n'est pas cela qui me pose problème, puisque tu as pu constater que j'y parviens, dans le fichier joint dans mon précédent message.

C'est le mix de mes deux macros que je n'arrive pas à faire aboutir.

Cordialement,

Re: [Calc] Collage special à la suite sur ligne vide

Publié : 11 sept. 2020 07:49
par Dude
Ta 2e macro est inutile, il n'y a pas besoin d'utiliser un curseur.
Et comme indiqué déjà par 2 fois dans le fil mentionné, tu utilises la méthode copyRange.

Ce qui nous donne en quelques lignes :

Code : Tout sélectionner

Sub CopierCollerEntreFeuilles()
	nLigne = RENVOI_LIGNE_VIDE("Cumul.A1:A1000")
	oDoc = ThisComponent
	oCopieFeuille= oDoc.Sheets.getByName("feuille_initiale") ' Nom de la feuille à copier
	oColleFeuille = oDoc.Sheets.getByName("Cumul") ' Nom de la feuille où coller
	oPlage = oCopieFeuille.getCellRangeByName("A2:D16") ' La plage à copier	
	oColleCellule = oColleFeuille.getCellByPosition(0, nLigne)  ' Cellule où démarre le collage
	oColleFeuille.copyRange(oColleCellule.CellAddress, oPlage.RangeAddress)    
End Sub

Function RENVOI_LIGNE_VIDE(sPlage)
   aPlage = split(sPlage,".")
   oFeuil = ThisComponent.Sheets.getByName(aPlage(0))
   oZone = oFeuil.getCellRangeByName(aPlage(1))
   oPlage = oZone.queryEmptyCells.RangeAddresses
   RENVOI_LIGNE_VIDE = oPlage(0).StartRow
End Function
NB : la fonction renvoie désormais l'index et non la ligne pour fonctionner avec getCellByPosition

Re: [Calc] Collage special à la suite sur ligne vide

Publié : 11 sept. 2020 09:58
par NUMIS88
Re Bonjour Dude,

Merci beaucoup, en effet, cela fonctionne parfaitement bien.

Je ne percevais pas complètement le sens de tes premières réponses, il faut dire que je débute.

Aurais tu l'astuce pour que les cellules d'origines soit une sélection, ou le tableau complet en orange?

J'imagine qu'il faut que je travaille la ligne :

Code : Tout sélectionner

oPlage = oCopieFeuille.getCellRangeByName("A2:D16") ' La plage à copier
Cela serait vraiment la cerise sur le gâteau!

Je joins le fichier corrigé, afin d'en faire profiter la communauté.

Je ne clôture pas encore le fil, au cas ou la cerise sur le gâteau soit là... :D :D

Merci encore sincèrement pour cette aide précieuse.

Re: [Calc] Collage special à la suite sur ligne vide

Publié : 11 sept. 2020 10:11
par Dude
NUMIS88 a écrit :Aurais tu l'astuce pour que les cellules d'origines soit une sélection
Voir le suprême de code concerné : https://forum.openoffice.org/fr/forum/v ... =copyrange

Re: [Calc] Collage special à la suite sur ligne vide

Publié : 11 sept. 2020 10:28
par NUMIS88
Re Bonjour Dude,

J'avais effectivement regardé ce suprême de code. Je n'avais pas fait le rapprochement, mais effectivement, je peux désormais m'en servir.

Merci infiniment pour ton aide et ta patience envers le novice que je suis.

Cordialement, :D