[Résolu][Calc]Copier une plage en fonction d'un contenu

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 !
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

[Résolu][Calc]Copier une plage en fonction d'un contenu

Message par ooSikas »

Bonjour

Je rencontre un problème dans un programme que j'ai créé sous libreoffice.

Pour aller à l'essentiel : dans mon programme il y a un onglet "Metré"

Dans cette onglet, une macro se lance lorsque le contenu d'une case est modifié dans la colonne D (colonne Profilé)
Je récupère ce qui a été rempli dans cette case et à l'aide d'un Select Case, je déclenche une série d'actions en fonction du nouveau contenu : récupération de la ligne de déclenchement de la macro, mise en forme spécifique des 7 colonnes suivante sur la ligne concernée, et ajout de formules dans certaines cellules de cette ligne.

les mises en formes sont différentes pour différents cas : IPE / HEA / PRS / TUBEC / TUBEROND mais la méthode et le fond du code reste le même.

Mon problème est le suivant :
quand j'écris TUBEROND dans une cellule de la colonne D, cela fonctionne mais si j'essaye ensuite de changer pour mettre par exemple TUBEC, IPE ou HEA, la mise en forme ne change pas.
En revanche quand on rempli PRS cela fonctionne, Le code est le même du coup je ne vois pas d'ou ça peut venir.

(Les mises en forme sont faites avec un copier coller de plages modèles dans l'onglet source)

Le code appelé est situé dans le module Metré -> sous programme reperage_profil

JE vous joint l'extrait ici :

Code : Tout sélectionner

Function ReperageProfil (oEVT)

	dim colonne as integer, ligne as integer, lignecible as integer, colonnecible as integer
	dim oCell as object, oDoc as object,oFeuille as object,oFeuilleCalcul as object, oFeuilleSource as object,oCellMef as object
	dim profil as string

	
	oCell = oEvt
 	oDoc = thiscomponent
 	oFeuille = oDoc.currentController.activeSheet
 	oFeuilleSource = ThisComponent.Sheets.getByName("Source")
  	oCible = oFeuille.getcellrangebyname(oCell.AbsoluteName)
  	oPlage = oFeuille.getcellrangebyname("D:D")
 	oResult1 = oCible.queryIntersection(oPlage.RangeAddress)
	selection = oDoc.CurrentSelection

'Identification des différents numéros de colonnes:
	dim cQ as integer, cP as integer, cS as integer, cPU as integer, cL as integer, cPD as integer, cC as integer, cPR as integer, cA as integer
	Identification_Constantes(0,cQ,cP,cS,cPU,0,0,0,0,0,0,0,cL,cPD,cC,cPR,cA)

'Identification des différentes colonnes de section
	dim cS1 as integer, cS2 as integer, cS3 as integer, cS4 as integer, cS5 as integer, cS6 as integer, cS7 as integer
	cS1=cPR+1
	cS2=cPR+2
	cS3=cPR+3
	cS4=cPR+4
	cS5=cPR+5
	cS6=cPR+6
	cS7=cPR+7

'Si une seule cellule est selectionnée
		
	If selection.supportsService("com.sun.star.table.Cell") then 
	 
	 	profil=oCell.string
	 
'Si l'évennement provient de la colonne "Profilé"  	 
	   
	   	If oResult1.RangeAddressesAsString <> "" Then   	
	   	
'Déclence la serie d'action correspondante en fonction du profil renseigné
	   	Select Case profil
	      	
	   	Case "PRS","prs"
	  	
	  	colonne = oCell.CellAddress.Column						
		ligne = oCell.CellAddress.Row
		lignecible=ligne+1
	
'Mise en forme					
		oCellMef=ofeuille.getcellbyposition(colonne+1,ligne)
	   	oRangeSource=oFeuilleSource.getcellrangebyname("MEF_PRS")
	   	oFeuille.copyRange(oCellMef.CellAddress,oRangeSource.RangeAddress)
	   	
'Formules de poids unitaire et d'achat pondéré   						
	   	oFeuille.getcellbyposition(cPU,ligne).formula="=IF(OR(INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "))="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS3+1 & "))="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS5+1 & "))="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & ")) ="""");"""";(INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "))/1000)*(INDIRECT(ADDRESS(" & lignecible & ";" & cS3+1 & "))/1000)*7850+2*(INDIRECT(ADDRESS(" & lignecible & ";" & cS5+1 & "))/1000)*(INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "))/1000)*7850)" 'Ancienne formule : "=IF(OR(E" & lignecible &" ="""";G" & lignecible &" ="""";I" & lignecible &" ="""";K" & lignecible &" ="""");"""";(E"& lignecible &"/1000)*(G"& lignecible &"/1000)*7850+2*(I"& lignecible &"/1000)*(K"& lignecible &"/1000)*7850)"
	 	oFeuille.getcellbyposition(cA,ligne).formula="=IF(INDIRECT(ADDRESS(" & lignecible & ";" & cP+1 & "))="""";"""";IF(AND(INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "))=800;INDIRECT(ADDRESS(" & lignecible & ";" & cS3+1 & "))=5;INDIRECT(ADDRESS(" & lignecible & ";" & cS5+1 & "))=180;INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "))=10);PRS_800x5_180x10;PRS_Standard)"
	  
	   

	   	Case "TUBEROND","TubeRond","tuberond","tubeRond","Tuberond"
	   	
	   	colonne = oCell.CellAddress.Column						
		ligne = oCell.CellAddress.Row
		lignecible=ligne+1
	
'Mise en forme						
		oCellMef=ofeuille.getcellbyposition(colonne+1,ligne)
	   	oRangeSource=oFeuilleSource.getcellrangebyname("MEF_TUBEROND")
	   	oFeuille.copyRange(oCellMef.CellAddress,oRangeSource.RangeAddress)
	 
'Formules de poids unitaire et d'achat pondéré    
		oFeuille.getcellbyposition(cPU,ligne).formula="=IF(OR(INDIRECT(ADDRESS(" & lignecible & ";" & cS2+1 & ")) ="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & ")) ="""");"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AA$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "&"""&""f""&INDIRECT(ADDRESS(" & lignecible & ";" & cS2+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.C$6))"
		oFeuille.getcellbyposition(cA,ligne).formula="=IF(INDIRECT(ADDRESS(" & lignecible & ";" & cP+1 & "))="""";"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AB$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "&"""&""f""&INDIRECT(ADDRESS(" & lignecible & ";" & cS2+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.AB$6))"  	 	
	
	
	   	Case "L","l","LPAF","lpaf","UPAF","upaf","TUBEC","tubec","TubeC","tubeC","TUBER","TubeR","tuber","tubeR"
	
	   	colonne = oCell.CellAddress.Column						
		ligne = oCell.CellAddress.Row
		lignecible=ligne+1
	
'Mise en forme		
		oCellMef=ofeuille.getcellbyposition(colonne+1,ligne)
	   	oRangeSource=oFeuilleSource.getcellrangebyname("MEF_L_TUBE_UPAF")
	   	oFeuille.copyRange(oCellMef.CellAddress,oRangeSource.RangeAddress)
	   			
'Formules de poids unitaire et d'achat pondéré  					
	   	oFeuille.getcellbyposition(cPU,ligne).formula="=IF(OR(INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & ")) ="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS4+1 & ")) ="""";INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & ")) ="""");"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AA$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "& """"&"&INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS4+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.C$6))"
	   	oFeuille.getcellbyposition(cA,ligne).formula="=IF(INDIRECT(ADDRESS(" & lignecible & ";" & cP+1 & ")) ="""";"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AB$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "& """"&"&INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS4+1 & "))&""x""&INDIRECT(ADDRESS(" & lignecible & ";" & cS7+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.AB$6))"  	
	 
	 
	   	Case "IPE","ipe","HEA","hea","UPN","upn","UPE","upe","HEB","heb","HEM","hem","IPE A","ipe a","HEAA","heaa"
	   	
	   	colonne = oCell.CellAddress.Column						
		ligne = oCell.CellAddress.Row
		lignecible=ligne+1	
	
'Mise en forme					
		oCellMef=ofeuille.getcellbyposition(colonne+1,ligne)
	   	oRangeSource=oFeuilleSource.getcellrangebyname("MEF_COURANT")
	   	oFeuille.copyRange(oCellMef.CellAddress,oRangeSource.RangeAddress)
	  
'Formules de poids unitaire et d'achat pondéré     	
	   	oFeuille.getcellbyposition(cPU,ligne).formula="=IF(INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & ")) ="""";"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AA$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "& """"&"&INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.C$6))"
		oFeuille.getcellbyposition(cA,ligne).formula="=IF(INDIRECT(ADDRESS(" & lignecible & ";" & cP+1 & ")) ="""";"""";INDEX($BibliothèqueIHU.$A$8:$BibliothèqueIHU.$AB$353;MATCH(INDIRECT(ADDRESS(" & lignecible & ";" & cPR+1 & "))&"&""""&" "& """"&"&INDIRECT(ADDRESS(" & lignecible & ";" & cS1+1 & "));$BibliothèqueIHU.$A$8:$BibliothèqueIHU.$A$353;0);BibliothèqueIHU.AB$6))"  	
	 
	 
	   	Case else
	   
	   	colonne = oCell.CellAddress.Column						
		ligne = oCell.CellAddress.Row
		lignecible=ligne+1
	
'Applique la mise en forme d'une cellule vide et vide les cellules Poids unitaire et Achat Pond de leur formules					
		oCellMef=ofeuille.getcellbyposition(colonne+1,ligne)	
		oCellsupp1=ofeuille.getcellbyposition(cPU,ligne)
		oCellsupp2=ofeuille.getcellbyposition(cA,ligne)
		
	   	oRangeSource=oFeuilleSource.getcellrangebyname("MEF_NULL")
	   	oRangeSourceSupp=oFeuilleSource.getcellrangebyname("CELLULE_VIDE")
	  	oRangeSourceSupp2=oFeuilleSource.getcellrangebyname("CELLULE_ACHAT_VIDE")
	   
	   	oFeuille.copyRange(oCellMef.CellAddress,oRangeSource.RangeAddress)
	    oFeuille.copyRange(oCellsupp1.cellAddress,oRangeSourceSupp.RangeAddress)
	  	oFeuille.copyRange(oCellsupp2.cellAddress,oRangeSourceSupp2.RangeAddress)
	   	
	   	End select
	   	
	 End if
	 
	End if
	   	
 End function
Si quelqu'un peut me conseiller sur une piste à creuser pour résoudre ce problème, je suis preneur !

Merci d'avance !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par ooSikas le 23 oct. 2017 09:28, modifié 1 fois.
LibreOffice Version: 6.4.4.2 sous Windows 10
Avatar de l’utilisateur
Phantéd
MOOdérateur
MOOdérateur
Messages : 50
Inscription : 09 oct. 2017 14:05

Re: [Calc]Copier coller une plage en fonction d'un contenu

Message par Phantéd »

Bonjour et bienvenue sur le forum,
votre signature a écrit : LibreOffice Version: 5.0.6.3 sous Windows 10
Votre signature indique que vous disposez d'une version de LibreOffice qui n'est plus maintenue.
Est-ce une erreur, un choix, un oubli, une obligation ?
Dans ce dernier cas, mentionnez-le dans votre signature par "Obligation de version".

Pour connaître la version que vous possédez : https://forum.openoffice.org/fr/forum/v ... 582#p11582

Nous vous invitons à vous mettre à jour de la dernière version : https://forum.openoffice.org/fr/forum/v ... m.php?f=38.

Votre signature doit comporter :
1- La version exacte de AOO ou LibO (AOO 4.1.2, LibO 5.1.5 par exemple) ;
2- La version exacte du système d'exploitation (Windows XP SP3, Vista SP2, Windows 7 SP1, Win 8.1, Win 10, Ubuntu 14.04, MacIntel 10.11.6, par exemple).
Accès direct à votre signature pour la corriger.

Cordialement.
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

Re: [Calc]Copier coller une plage en fonction d'un contenu

Message par ooSikas »

Bonjour,

Non ce n'est pas une obligation, pendant un temps j'avais des problèmes de crash avec Libreoffice et j'avais donc téléchargé la dernière version stable + bloqué les MAJ automatiques.

Mais je vais mettre à jour vers une version stable plus récente et l'indiquer dans ma signature.
LibreOffice Version: 6.4.4.2 sous Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc]Copier coller une plage en fonction d'un contenu

Message par Hubert Lambert »

Bonjour,

Pour info, cela fonctionne correctement avec LibreOffice 4.1.2 sous Windows 7 :
ooSikas.png
Au passage, tu peux simplifier un peu ton code avec cette petite astuce :

Code : Tout sélectionner

	   	Select Case lcase(profil)
	   	Case "prs"
	   	    [...]
	   	Case "tuberond"
	   	    [...]
	   	Case "l","lpaf","upaf","tubec","tuber"
	   	    [...]
Cordialement.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

Re: [Calc]Copier coller une plage en fonction d'un contenu

Message par ooSikas »

Bonjour,

Je suis passé sous libre office 5.3.6, chez moi ça ne fonctionnait toujours pas.

Le problème n'étais pas lors de la première saisie du profil dans une case mais lorsqu'on changeait de profil. Exemple dans la ligne 24 : je met HEA, puis je change pour mettre TUBEROND, et là ça ne marche plus.

Finalement j'ai corrigé le bug en faisant une étape intermédiaire : copier des cellules vides et copier la nouvelle mise en forme.

Merci de l'aide en tout cas.

Pour le deuxième sujet d'optimisation, que je comprenne bien :

le "lcase" permet de prendre en compte la chaîne de caractère sans se soucier s'il y a ou non des majuscules? (même si c'est une seule majuscule en milieu de phrase?)

Merci

A+
LibreOffice Version: 6.4.4.2 sous Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc]Copier coller une plage en fonction d'un contenu

Message par Dude »

ooSikas a écrit :le "lcase" permet de prendre en compte la chaîne de caractère sans se soucier s'il y a ou non des majuscules? (même si c'est une seule majuscule en milieu de phrase?)
L'aide F1 est ton amie :
no_problemo.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.