[Résolu] [Calc] Copier plage variable avec sélection de données en fonction de date

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 !
psylo24
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 08 janv. 2020 22:35

[Résolu] [Calc] Copier plage variable avec sélection de données en fonction de date

Message par psylo24 »

Bonjour tout le monde et meilleurs vœux pour cette nouvelle année.

J'ai une nouvelle problématique en ce début d'année.

Je souhaiterai une macro qui me sélectionne une plage de donnée (pour mes 3 feuilles source) et qui me les copient dans une autre feuille :
J'ai 3 feuilles où les données doivent être piochées (Source1, Source2 et Source3) et par exemple je voudrais que quand je lance la macro ça me sélectionne toutes les lignes/plages, qui correspondent au 1er trimestre par exemple (je ferais une macro pour chaque trimestre) et que ça me les copient dans la feuille Dest, je souhaiterai avoir par exemple entre chaque zone copiée dans une feuille source une démarcation dans la feuille de destination (soit quelques lignes vides ou une petite zone de texte histoire de m'y retrouver).

J"ai trouvé sur internet comment copier une plage en utilisant une macro, mais mon gros probléme est surtout de pouvoir copier une place de donnée qui me sélectionne que les données en fonction de la date.

A noter que dans la feuille Source1, il y a des formules, que je souhaite conserver fonctionnelles dans la feuille de destination.

A noter également que j'ai déjà une macro qui me tri mes données dans l'ordre croissant en fonction de la date, donc les lignes sont censées déjà être triées.

Merci d'avance pour votre aide

Fichier d'exemple :
Exemple.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par psylo24 le 10 janv. 2023 11:36, modifié 1 fois.
Version: 7.3.7.2 / LibreOffice Community
Build ID: e114eadc50a9ff8d8c8a0567d6da8f454beeb84f
CPU threads: 4; OS: Linux 4.15; UI render: default; VCL: gtk3
Locale: fr-FR (fr_FR.UTF-8); UI: en-US
Calc: threaded
Build ID: 1:6.0.7-0ubuntu0.18.04.12
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par zeguedon »

Bonjour,

Dans ton fichier exemple, les trois plages sources n'ont pas la même structure. Est-ce que tu peux nous montrer l'agencement souhaité dans la feuille Dest

Merci

@+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
psylo24
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 08 janv. 2020 22:35

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par psylo24 »

Bonjour

Merci pour ta réponse, tu trouveras ce que je souhaite dans la feuille "DestSouhaité".

Merci bonne soirée
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: 7.3.7.2 / LibreOffice Community
Build ID: e114eadc50a9ff8d8c8a0567d6da8f454beeb84f
CPU threads: 4; OS: Linux 4.15; UI render: default; VCL: gtk3
Locale: fr-FR (fr_FR.UTF-8); UI: en-US
Calc: threaded
Build ID: 1:6.0.7-0ubuntu0.18.04.12
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par zeguedon »

:super:
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12228
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par Bidouille »

Bonjour,
psylo24 a écrit : 02 janv. 2023 20:44mais mon gros probléme est surtout de pouvoir copier une place de donnée qui me sélectionne que les données en fonction de la date.
Et pourquoi alors le titre ne reflète t-il pas cette problématique ?

On rappelle qu'un titre clair et explicite n'est pas pour l'auteur de la question mais pour tous ceux effectuant des recherches dans ce forum.
Avatar de l’utilisateur
DLE
SuppOOrter
SuppOOrter
Messages : 1477
Inscription : 30 déc. 2007 18:56
Localisation : Lille

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par DLE »

Bonjour,
A valider, seul le 1er trimestre est traité.
A+
Psylo24_Exemple.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MacOS Sonoma 14.4.1 (iMac-Intel) : AOO 4.1.15 , LibreOffice 7.6.5.2, Adoptium-temurinJDK_1.8.0_402 -
Windows 10 64 bits :
AOO 4.1.15, Libreoffice 7.1.8.1 - FireFox, Thunderbird, ORB 1.2.1
psylo24
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 08 janv. 2020 22:35

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par psylo24 »

DLE a écrit : 03 janv. 2023 09:37 Bonjour,
A valider, seul le 1er trimestre est traité.
A+Psylo24_Exemple.ods
Super merci beaucoup ça fonctionne bien, cependant j'ai essayé de faire la même chose pour le 3eme trimestre, d’après ce que j'ai compris il faut modifier la ligne :

Code : Tout sélectionner

    		nLigne = LigneTrim(oS1,1)
pour chaque feuille par

Code : Tout sélectionner

   		nLigne = LigneTrim(oS1,3)
pour sélectionner le 3eme trimestre mais le problème c'est que j'ai toujours uniquement les resultats du 1er trimestre.

Dans tous les cas c'est déjà une très grande avancée pour moi :D
Version: 7.3.7.2 / LibreOffice Community
Build ID: e114eadc50a9ff8d8c8a0567d6da8f454beeb84f
CPU threads: 4; OS: Linux 4.15; UI render: default; VCL: gtk3
Locale: fr-FR (fr_FR.UTF-8); UI: en-US
Calc: threaded
Build ID: 1:6.0.7-0ubuntu0.18.04.12
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par zeguedon »

Bonjour,

Une variante dans le fichier joint permettant au début du traitement de définir le trimestre à extraire :
Capture d’écran du 2023-01-03 21-28-28.png
Il sera possible d'ajouter une demande d'écrasement des données existantes avant de commencer un nouveau traitement ou de proposer une écriture à la suite si nécessaire :

Code : Tout sélectionner

Option Explicit

Private obj01 As Object'Collection de feuilles du claseur
Private obj02 As Object'Plage obtenue ponctuellement avec 'CherchePlage()'
Private obj03 As Object'Cellule cible ponctuelle
Private	obj04 As Object'feuille Dest (feuille cible)
Private	obj05 As Object'Cellule date ponctuelle feuille Dest => traitement trimestre
Private tab01()	As Variant'arguments FunctionAccess (srv01)
Private srv01 As Object'FunctionAccess
Private txt01 As String'
Private txt02 As String'
Private txt03 As String'
Private txt04 As String'
Private txt05 As String'
Private txt06 As String'
Private txt07 As String'
Private txt08 As String'
Private txt09 As String'
Private txt10 As String'réponse InputBox
Private txt11 As String
Private txt12 As String
Private txt13 As String
Private txt14 As String
Private txt15 As String
Private txt16 As String
Private txt17 As String
Private txt18 As String
Private n01 As Long'index ponctuel feuille source
Private n02 As Long'index ponctuel 1er ligne vide feuille source (defini emplacement tableau)
Private n03 As Long'index ponctuel 1er colonne vide feuille source
Private	n04	As Long'index ligne ponctuellement vide feuille dest (position tableau)
Private	n05	As Long'date recueillie ponctuellement (traitement trimestre)
Private bol01 As Boolean

Sub initVar()
txt01 = "Dest"
txt02 = "Terminé !"
txt03 = "TEXT"
txt04 = "com.sun.star.sheet.FunctionAccess"
txt05 = "Numéro de trimestre : T1 ou T2 ou T3"
txt06 = "Définissez le numéro de trimestre à extraire"
txt07 = "T1"
txt08 = "T2"
txt09 = "T3"
txt11 = "!!! Saisie incorrecte !!!"
txt12 = "Recommencez la saisie en respectant le modèle proposé"
txt13 = "Action annulée"
txt14 = ""
txt15 = "Annulation"
txt16 = "Cliquez sur Oui pour écrire les nouvelles données à la suite des données existantes"_
		& chr(13) & chr(13) &_
		"Cliquez sur Non pour que les données existantes de cette feuille soient écrasées"
txt17 = "Préférences d'écriture"
txt18 = "T3"		
obj01 = Thiscomponent.Sheets
obj04 = obj01.GetByName(txt01)
srv01 = CreateUnoService(txt04)
End Sub

Sub Main
initVar()
DemanderTrimestre()
ChercherCopierPlage()
ChercheSupprimeTrimestre()
Thiscomponent.Store
msgBox(txt02)
End Sub

Sub ChercherCopierPlage()
for n01 = 0 to 2 'Boucle sur les trois premières feuilles (recherche tableau)
	n02 = obj01(n01).Columns.GetByName("B").QueryEmptyCells(0).RangeAddresses(0).StartRow
	n03 = obj01(n01).Rows.GetByIndex(0).QueryEmptyCells(0).RangeAddresses(0).StartColumn
	n04 = obj04.Columns.GetByName("B").QueryEmptyCells(0).RangeAddresses(n01).StartRow
	CopierPlage(obj01(n01).GetCellRangeByPosition(0,0,n03-1,n02-1))
next
End Sub

Sub CopierPlage(Byval obj02)
'if bol01 Then
	obj04.GetCellByPosition(0,n04+2).SetString(obj01(n01).Name)
	obj03 = obj04.GetCellByPosition(0,n04+3)
	obj04.copyRange(obj03.CellAddress, obj02.RangeAddress)
'end if
End Sub

Sub ChercheSupprimeTrimestre()
n04 = obj04.Columns.GetByName("B").QueryEmptyCells(0).RangeAddresses(n01).StartRow
For n04 = n04  To 0 Step -1
	obj05 = obj04.GetCellByPosition(1,n04)
	if obj05.Value Then
		n05 = obj05.Value
		tab01() = array(n05,"q")
		txt04 = srv01.callFunction(txt03,tab01())
		if txt04 <> txt10 Then
			obj04.Rows.RemoveByIndex(n04,1)
		end if
	end if
next
obj04.Rows.RemoveByIndex(0,2)
End Sub

Sub DemanderTrimestre()
start:
Select Case InputBox(txt05,txt06,txt07)
	Case txt07
		txt10 = txt07
	Case txt08
		txt10 = txt08
	Case txt09
		txt10 = txt09
	Case txt18
		txt10 = txt18
	Case txt14
		msgBox(txt13,,txt15)
		Stop
	Case else
		msgBox(txt12,,txt11)
		GoTo start
End Select
'Select Case msgBox(txt16,4,txt17)
	'Case 6
		'bol01 = True
	'Case 7
		'bol01 = False
'End Select
End Sub
Pour commencer le traitement, cliquez sur le bouton :) :
Capture d’écran du 2023-01-03 21-35-47.png
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
psylo24
Membre lOOyal
Membre lOOyal
Messages : 31
Inscription : 08 janv. 2020 22:35

Re: [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par psylo24 »

Salut

Super merci beaucoup ça fonctionne comme je voulais, je n'ai plus qu'à l’intégrer dans mon fichier définif.

Juste une petite question complémentaire, si je souhaite spécifier la recherche dans les feuilles en fonction de leur nom et non en fonction de leur index comment puis je faire ?
Car dans mon fichier définitif les feuilles sources ne sont pas spécialement les unes à la suite des autres.

Je marque cependant le post comme résolu
Version: 7.3.7.2 / LibreOffice Community
Build ID: e114eadc50a9ff8d8c8a0567d6da8f454beeb84f
CPU threads: 4; OS: Linux 4.15; UI render: default; VCL: gtk3
Locale: fr-FR (fr_FR.UTF-8); UI: en-US
Calc: threaded
Build ID: 1:6.0.7-0ubuntu0.18.04.12
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12228
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Résolu] [Calc] Copier plage variable de plusieurs feuilles dans une autre feuille

Message par Bidouille »

Bidouille a écrit : 03 janv. 2023 07:32 Et pourquoi alors le titre ne reflète t-il pas cette problématique ?
C'est bien de tenir compte de ce qu'on vous demande car :
Bidouille a écrit : 03 janv. 2023 07:32 un titre clair et explicite n'est pas pour l'auteur de la question mais pour tous ceux effectuant des recherches dans ce forum
Et donc un titre ne peut refléter plusieurs problèmes, je vous laisse ouvrir un nouveau sujet en rapport avec :
psylo24 a écrit : 10 janv. 2023 11:35 spécifier la recherche dans les feuilles en fonction de leur nom et non en fonction de leur index