Libreoffice Calc - Macro Collage spécial en fin de tableau autre feuille

Signaler
Messages postés
1
Date d'inscription
mardi 15 septembre 2020
Statut
Membre
Dernière intervention
15 septembre 2020
-
Bonjour à tous,

Je souhaite effectuer un copier - coller (collage spécial), d'une plage de cellule d'une feuille à une autre, mais en fin de tableau pour la seconde (première cellule vide ).

La première partie, j'y parviens, a travers la macro suivante : (collage spécial)

    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 aussi avec la macro suivante : (aller à la première ligne vide)

    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 je n'arrive pas à faire un mix des deux.

Une macro m'a été proposée, mais ne prend pas en compte le collage spécial :

    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


En espérant qu'un membre de la communauté pourra m'apporter de l'aide.

Cela pourrait probablement être profitable à d'autres.

Cordialement,