[Résolu][Calc] PasteRange.DataArray

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 !
clduick
Membre lOOyal
Membre lOOyal
Messages : 42
Inscription : 10 oct. 2007 12:36
Localisation : Paris

[Résolu][Calc] PasteRange.DataArray

Message par clduick »

Bonjour,
j'ai voulu continuer mon fichier et écrire une macro sans "Dispatcher" en m'inspirant de la solution donnée sur un autre post https://forum.openoffice.org/fr/forum/v ... =8&t=64125
Alors voici mon problème j'ai une erreur d'exécution avec variable non défini sur PasteRange, alors que pour moi la variable est défini. Enfin je suppose que c'est le programme qui a raison. :)

Code : Tout sélectionner

Sub CopyHistoversDonnees
Dim data, fa, Doc, Sheets, SheetCopy, SheetPaste, zone, srch, CopyAddress, PasteRange
Dim trouv as variant, lig as integer

Doc = ThisComponent
Sheets = Doc.Sheets()
SheetCopy = Sheets.getByName ("Résultat Simple")
SheetPaste = Sheets.getByName("Données")
CopyRange = SheetCopy.getCellRangeByName("D35:D36")

zone =SheetPaste.getCellRangeByName("E21:E1000")
srch = zone.createSearchDescriptor
with srch
	.SearchString = SheetCopy.getCellRangeByName("D6").string 'determine la recherche par E_Ens
	.SearchWords = true
	.SearchType = 1
End with
trouv = zone.FindFirst(srch)
if isNull(trouv) then
	msgbox("J'ai pas trouvé l'établissement dans Données, il n'y aura pas d'enregistrement!")
else
	lig = trouv.CellAddress.row
	'ThisComponent.currentController.Select(SheetPaste.GetCellByPosition(0,lig) 
end if


       'PasteRange = SheetPaste.GetCellByPosition(32,lig) 'decale ma cellule avant de coller
PasteRange = ThisComponent.currentController.Select(SheetPaste.GetCellByPosition(33,lig) 'decale ma cellule avant de coller
fa = createUnoService("com.sun.star.sheet.FunctionAccess") 
data = fa.callFunction("TRANSPOSE", Array(CopyRange))
PasteRange.DataArray = data 'erreur d'execution


End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par clduick le 11 juin 2021 06:55, modifié 1 fois.
LibreOffice 7.1 sous W10 Obligation de Version
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1398
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Calc] PasteRange.DataArray

Message par jeanmi2403 »

Bonsoir,
Xray PastRange inséré à la ligne 48 indique : Donnée vide.
Je n'ai pas analysé la formule de la ligne 45 (PasteRange = ThisComponent.currentController.Select etc....), mais c'est là que se situe le problème, à mon avis, puisque la procédure originale fonctionne.
Il y aurait donc intérêt à réaliser cette opération en plusieurs étapes, pour voir où se situe le souci.
Xray est d'une grande utilité dans ce genre de cas....
Cordialement,
Dernière modification par jeanmi2403 le 10 juin 2021 15:46, modifié 1 fois.
Jean-Michel
LibO 7.5.9 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 7.6 sur OpenSuse & Linux MX
Kev74
Membre hOOnoraire
Membre hOOnoraire
Messages : 139
Inscription : 24 avr. 2021 19:09

Re: [Calc] PasteRange.DataArray

Message par Kev74 »

Bonjour,

je crois qu'il faut que tes matrices CopyRange et PasteRange soit de taille inverse identique. Exemple, si c'est CopyRange qui a (2 lignes,1 colonne), il faut pour que la transposition fonctionne que PasteRange a (1 ligne, 2 colonnes).

Code : Tout sélectionner

PasteRange = ThisComponent.Sheets.getByName("Données").GetCellRangeByPosition(33,lig,34,lig) 'decale ma cellule avant de coller
fa = createUnoService("com.sun.star.sheet.FunctionAccess") 
data = fa.callFunction("TRANSPOSE", Array(CopyRange))
PasteRange.setDataArray(data) 'erreur d'execution
A remplacer à la fin de ton code, j'espère que c'est cela que tu voulais.

Je ne suis pas un pro, mais ton problème m'intéressait, donc je m y suis mis :P, car les gens ici m'aident beaucoup

Bonne après midi
LibreOffice 7.0.5.2 sous Windows 10
clduick
Membre lOOyal
Membre lOOyal
Messages : 42
Inscription : 10 oct. 2007 12:36
Localisation : Paris

Re: [Calc] PasteRange.DataArray

Message par clduick »

Kev74 a écrit :Bonjour,

je crois qu'il faut que tes matrices CopyRange et PasteRange soit de taille inverse identique. Exemple, si c'est CopyRange qui a (2 lignes,1 colonne), il faut pour que la transposition fonctionne que PasteRange a (1 ligne, 2 colonnes).

Code : Tout sélectionner

PasteRange = ThisComponent.Sheets.getByName("Données").GetCellRangeByPosition(33,lig,34,lig) 'decale ma cellule avant de coller
fa = createUnoService("com.sun.star.sheet.FunctionAccess") 
data = fa.callFunction("TRANSPOSE", Array(CopyRange))
PasteRange.setDataArray(data) 'erreur d'execution
A remplacer à la fin de ton code, j'espère que c'est cela que tu voulais.

Je ne suis pas un pro, mais ton problème m'intéressait, donc je m y suis mis :P, car les gens ici m'aident beaucoup

Bonne après midi
Merci,
J'étais sur cette piste au début, mais je pensais que la macro allait réagir comme sur la feuille calc lorsqu'on fait un copier coller, il décale automatiquement. De plus je ne savais pas l'écrire j'étais sur GetCellRangeByPosition(33,lig;34,lig).
LibreOffice 7.1 sous W10 Obligation de Version
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Résolu][Calc] PasteRange.DataArray

Message par Jurassic Pork »

hello,
voici une macro qui copie une ligne de données pour la coller dans une colonne. On indique en entrée la plage de la ligne à copier et la cellule à partir de laquelle on veut que cela soit collé en colonne.

Code : Tout sélectionner

Sub CopyPasteWithTranspose
Dim SourceRange, DestRange
Dim data,fa,Doc, Sheets, SheetCopy, SheetPaste, CopyRange, PasteRange
Doc = ThisComponent
SourceRange = "C21:AI21"
DestRange = "D4"
Sheets = Doc.Sheets()
SheetCopy = Sheets.getByName("Données")
SheetPaste = Sheets.getByName("Résultat Simple")
CopyRange = SheetCopy.getCellRangeByName(SourceRange)
nbColumns =  CopyRange.RangeAddress.EndColumn - CopyRange.RangeAddress.StartColumn
PasteRange = SheetPaste.getCellRangeByName(DestRange)
PastRange = SheetPaste.getCellRangeByPosition( PasteRange.RangeAddress.StartColumn, _
                                     PasteRange.RangeAddress.StartRow, _
                                      PasteRange.RangeAddress.StartColumn, _
                                       PasteRange.RangeAddress.EndRow +nbColumns)
PastRange.ClearContents(7)
fa = createUnoService("com.sun.star.sheet.FunctionAccess")  
data = fa.callFunction("TRANSPOSE", Array(CopyRange))
PastRange.DataArray = data
End Sub
Il y a peut être plus simple :tesfou:

Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04