[Résolu][Calc]Copier coller une image à partir d'une colonne

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 !
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

[Résolu][Calc]Copier coller une image à partir d'une colonne

Message par Noonours »

Bonjour à tous.

Je souhaiterais à partir de la valeur de la cellule H5 de la feuille1 copier le contenu de deux cellules de la colonne B de la feuille2.
C'est à dire que si la valeur de H5 est 1, on copie à partir de la feuille 2 la plage B1:B2 sur la feuille 1.
si H5 = 2 , on copie feuille2.B3:B4 sur la feuille1,
si H5 = 3, on copie feuille2.B5:B6 sur la feuille1 etc etc.

J'ai réussi à le faire (voir exemple ci-dessous), mais la fonction de copier-coller ne fonctionne qu'à partir de texte dans les cellules d'origine. Si ce classeur ne contenait que du texte ou des nombres, il serait inutile de passer par macro, les fonctions de RECHERCHE de Calc seraient bien suffisantes.
Mon souci vient du fait que certaines cellules de la feuille 'source' contiennent une image qu'il faut aussi copier-coller... d'où l'obligation de passer par macro.

J'ai créé un bouton auquel est rattaché la macro.
Mon codage est probablement très approximatif, soyez indulgents, je me lance depuis peu dans la programmation en OoBasic :oops:
Voici ce que j'ai réalisé en m'inspirant de ce que j'ai glané sur ce forum, il y a certainement plus élégant:

Code : Tout sélectionner

Option Explicit

Sub CopColAvec_DataArray
Dim oDoc As Object, oSheetSource As Object, oSheetCible As Object
Dim oRangeSource As Object, oRangeCible As Object, ACopier(), oRASource, oRACible
Dim Ymax as Integer, Ymin as Integer, Y as Integer


   oDoc = thisComponent           ' Le document
   oSheetSource = oDoc.Sheets(1)  ' La feuille Source : ici Feuille 2
   oSheetCible = oDoc.Sheets(0)   ' La feuille Cible : ici Feuille 1
   
   Y =  oSheetCible.getCellRangebyName("H5").Value 'La valeur de la cellule H5 de la Feuille 1
   Ymax = (Y * 2)  -1 'La limite max de la plage à copier
   Ymin = Ymax - 1    'La limite min de la plage à copier
   
   ' La plage source 
   oRangeSource = oSheetSource.getCellRangeByPosition(1, Ymin, 1, Ymax)
   
   ' Les Données de la plage
   ACopier = oRangeSource.getDataArray
   ' Les Index de la plage
   oRASource = oRangeSource.RangeAddress
   
   ' La plage Cible redéfinie
   oRangeCible = oSheetCible.getCellRangeByName("B2:B3")

   ' on copie
   oRangeCible.setDataArray(ACopier)
End Sub
Mon fichier exemple avec quelques images Fontwork (dans la version définitive, les images seront au format png et/ou jpeg)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Noonours le 22 févr. 2015 15:17, modifié 1 fois.
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc]Copier-coller une seule image à partir d'une colon

Message par Piaf »

Bonsoir
Teste en utilisant getTransferable voir : [Calc] Copier/Coller direct entre 2 feuilles ou classeurs
A tester

Code : Tout sélectionner

Option Explicit

Sub CopColAvec_DataArray
Dim oDoc As Object, oSheetSource As Object, oSheetCible As Object
Dim oRangeSource As Object, oRangeCible As Object, ACopier(), oRASource, oRACible
Dim Ymax as Integer, Ymin as Integer, Y as Integer, x as Integer
Dim CellSource as Object, CellDest as Object, Transfert as Object
	oDoc = thisComponent           ' Le document
	oSheetSource = oDoc.Sheets(1)  ' La feuille Source : ici Feuille 2
	oSheetCible = oDoc.Sheets(0)   ' La feuille Cible : ici Feuille 1

	Y =  oSheetCible.getCellRangebyName("H5").Value 'La valeur de la cellule H5 de la Feuille 1
	Ymax = (Y * 2)  -1 'La limite max de la plage à copier
	Ymin = Ymax - 1    'La limite min de la plage à copier

'	La plage source
	oRangeSource = oSheetSource.getCellRangeByPosition(1, Ymin, 1, Ymax)
'	La plage Cible
	oRangeCible = oSheetCible.getCellRangeByPosition(1,1,1,2)
	oRangeCible.clearContents(151)
	For x = 0 To 1
		CellSource = oRangeSource.getCellByPosition(0,x)
		CellDest = oRangeCible.getCellByPosition(0,x)
		If CellSource.getType() = com.sun.star.table.CellContentType.FORMULA Then
		   	ACopier = CellSource.getDataArray
		   	CellDest.setDataArray(ACopier)
		Else
			oDoc.CurrentController.select(CellSource)
			Transfert = oDoc.CurrentController.getTransferable()
			oDoc.CurrentController.select(CellDest)
			oDoc.CurrentController.insertTransferable(Transfert)
		End If
   Next x
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc]Copier-coller une seule image à partir d'une colon

Message par Noonours »

Merci Piaf pour ta réponse rapide :wink:

Ton code ne fonctionne pas chez moi, les images n'apparaissent pas... Néanmoins, je ne connaissais pas la fonction qui permettait de tester le contenu de la cellule comme étant une formule; je garde ça au chaud pour plus tard.

J'ai re-bricolé un truc en me basant sur le lien que tu m'as fourni plus haut, et je me suis inspiré d'un certain... Piaf! 8)
Et ça fonctionne chez moi!

Code : Tout sélectionner

Sub CopColAvec_DataArray
Dim oDoc as Object, oRange as Object, aCopier as Object
Dim Y as Integer, Ymin as Integer, Ymax as Integer


   oDoc = thisComponent
    Y =  oDoc.Sheets(0).getCellRangebyName("H5").Value
    Ymax = (Y * 2)  -1 'La limite max de la plage à copier
    Ymin = Ymax - 1    'La limite min de la plage à copier
    
   oRange = oDoc.Sheets(1).getCellRangeByPosition(1,Ymin,1,Ymax) ' la zone à copier
   oDoc.CurrentController.select(oRange) 'Sélection de la zone
   aCopier = oDoc.CurrentController.getTransferable() 'Copie
   oRange = oDoc.Sheets(0).getCellRangeByName("B2") 'Première cellule pour recopie de la zone
   oDoc.CurrentController.select(oRange) 'Selection de la cellule
   oDoc.CurrentController.insertTransferable(aCopier) 'Transfert des données
   
End Sub
Merci pour tout Piaf

A+
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Résolu][Calc]Copiercoller une image à partir d'une colo

Message par Piaf »

Bonsoir
Malgrés le [Résolu]
Noonours a écrit :Ton code ne fonctionne pas chez moi
Excuse je n'avais testé sous LibO. :oops:
Après teste avec ma version de LibO (Version: 4.3.6.2) la macro envoyée ne copie effectivement pas les images.
Ta macro les copie mais recopie la formule au lieu de la valeur.
Sous LibO pour que la macro, recopie soit les images soit la valeur de la formule, remplacer

Code : Tout sélectionner

oDoc.CurrentController.select(CellSource)
par

Code : Tout sélectionner

oDoc.CurrentController.select(oRangeSource)
Ca le fait aussi pour AOO.

Code : Tout sélectionner

Sub CopColAvec_DataArray
Dim oDoc As Object, oSheetSource As Object, oSheetCible As Object
Dim oRangeSource As Object, oRangeCible As Object, ACopier(), oRASource, oRACible
Dim Ymax as Integer, Ymin as Integer, Y as Integer, x as Integer
Dim CellSource as Object, CellDest as Object, Transfert as Object
	oDoc = thisComponent           ' Le document
	oSheetSource = oDoc.Sheets(1)  ' La feuille Source : ici Feuille 2
	oSheetCible = oDoc.Sheets(0)   ' La feuille Cible : ici Feuille 1

	Y =  oSheetCible.getCellRangebyName("H5").Value 'La valeur de la cellule H5 de la Feuille 1
	Ymax = (Y * 2)  -1 'La limite max de la plage à copier
	Ymin = Ymax - 1    'La limite min de la plage à copier

'	La plage source
	oRangeSource = oSheetSource.getCellRangeByPosition(1, Ymin, 1, Ymax)
'	La plage Cible
	oRangeCible = oSheetCible.getCellRangeByPosition(1,1,1,2)
	oRangeCible.clearContents(151)
	For x = 0 To 1
		CellSource = oRangeSource.getCellByPosition(0,x)
		CellDest = oRangeCible.getCellByPosition(0,x)
		If CellSource.getType() = com.sun.star.table.CellContentType.FORMULA Then
		   	ACopier = CellSource.getDataArray
		   	CellDest.setDataArray(ACopier)
		Else
			oDoc.CurrentController.select(oRangeSource)
			Transfert = oDoc.CurrentController.getTransferable()
			oDoc.CurrentController.select(CellDest)
			oDoc.CurrentController.insertTransferable(Transfert)
		End If
   Next x
End Sub
Encore un comportement différent entre les deux suites :roll:
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64