[Résolu][Calc] Copie feuille et contrôle champ lié à cellule

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 !
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

[Résolu][Calc] Copie feuille et contrôle champ lié à cellule

Message par ThierryM »


La modération vous a écrit: [Calc] remplace [CALC]. Merci de respecter la syntaxe des balises

Adieu a totes,
Je rencontre un problème lorsque je veux copier un feuille modèle contenant des contrôles ayant un lien avec des cellules de cette feuille modèle. Les contrôles de formulaire de la feuille qui est copiée font toujours référence à la feuille de départ et non à la nouvelle feuille.
Dans l'exemple ci-joint, on indique un nom de feuille et on clique sur le bouton "Copier Feuille Modèle" pour en obtenir une nouvelle. En se plaçant dans la nouvelle feuille, lorsque je coche les 3 cases à cocher, je voudrais que leurs valeurs se reflètent dans les cellules G5, G6 et G7. Or ces nouveaux contrôles font référence à la feuille de départ (et non celle dans laquelle ils sont contenus) :
Sélection_157.png
Voici le code basique utilisé :

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub AppelSuivi
' Actions lors du déclenchement du bouton "Bt_Suivi"
 monDocument = ThisComponent
 lesFeuilles=monDocument.Sheets
 maFeuille= monDocument.sheets.getByName("Fiche Individuelle") 'Récupère la feuille à partir de laquelle on signale
 nomPrenomEleve=maFeuille.getCellRangeByName("C4").String
 
' Recherche si une fiche existe déjà
 'xray lesFeuilles
 Dim ficheExiste as Boolean
 ficheExiste=False
 If lesFeuilles.hasByName(nomPrenomEleve) Then
	Print "La fiche existe."
	ficheExiste=True
	fSuivi=lesFeuilles.getByName(nomPrenomEleve)
 End If 
' Création d'une nouvelle fiche si inexistante
 If ficheExiste Then
 	monDocument.currentController.activeSheet=fSuivi
 Else
 	'copie la feuille "Fiche Suivi Modèle" en dernière position
 	lesFeuilles.copyByName("Fiche Suivi Modèle",nomPrenomEleve,lesFeuilles.Count)
 	fSuivi=lesFeuilles.getByName(nomPrenomEleve)
 	monDocument.currentController.activeSheet=fSuivi	
 End If
End Sub
Donc, comment faire en sorte que lorsqu'on copie une feuille, les contrôles de formulaires soient liés à la feuille sur laquelle ils sont et non celle d'origine ? Je n'ai rien trouvé concernant ce problème.
Merci pour vos éclairages, cordialement,

Thierry
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par ThierryM le 20 nov. 2019 16:00, modifié 1 fois.
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Re: [Calc] Copie feuille avec controle de champ lié à 1 cell

Message par ThierryM »

Adieu,
Bon, j'ai trouvé la solution ici : https://forum.openoffice.org/en/forum/v ... 68#p392162

Je vous joins le fichier fonctionnel et voici le code pour ceux et celles qui pourraient être intéressé⋅e⋅s :

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub AppelSuivi
' Actions lors du déclenchement du bouton "Bt_Suivi"
 monDocument = ThisComponent
 lesFeuilles=monDocument.Sheets
 maFeuille= monDocument.sheets.getByName("Fiche Individuelle") 'Récupère la feuille à partir de laquelle on signale
 nomPrenomEleve=maFeuille.getCellRangeByName("C4").String
 
' Recherche si une fiche existe déjà
 'xray lesFeuilles
 Dim ficheExiste as Boolean
 ficheExiste=False
 If lesFeuilles.hasByName(nomPrenomEleve) Then
	Print "La fiche existe."
	ficheExiste=True
	fSuivi=lesFeuilles.getByName(nomPrenomEleve)
 End If 
' Création d'une nouvelle fiche si inexistante
 If ficheExiste Then
 	monDocument.currentController.activeSheet=fSuivi
 Else
 	'copie la feuille "Fiche Suivi Modèle" en dernière position
 	lesFeuilles.copyByName("Fiche Suivi Modèle",nomPrenomEleve,lesFeuilles.Count)
 	fSuivi=lesFeuilles.getByName(nomPrenomEleve)
	'Permet de lier les cellules G5, G6 et G7 aux 3 cases à cocher
	Dim vCVB As Object
	Dim vField As Object
	Dim oLinkedCell as new com.sun.star.table.CellAddress
	Dim oNamedValue as new com.sun.star.beans.NamedValue
	nFeuille= fSuivi.RangeAddress.Sheet
	For j = 0 To 2
		vField = fSuivi.DrawPage.Forms(0).ControlModels(j)
		oLinkedCell.Sheet = nFeuille
		oLinkedCell.Column = 6
		oLinkedCell.Row = 4+j
   		oNamedValue.Name = "BoundCell"
   		oNamedValue.Value = oLinkedCell
   		vCVB = monDocument.createInstance("com.sun.star.table.CellValueBinding")
   		vCVB.Initialize(Array(oNamedValue))
   		vField.setValueBinding(vCVB)
	Next j
  	monDocument.currentController.activeSheet=fSuivi		
 End If
End Sub
Cordialement,
Thierry
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?