> Tous les forums > Forum Bureautique
 macroSujet résolu
Ajouter un message à la discussion
Pages : Début ... 1 2 [3] 4 5 ... Fin
[Début] Page 3 sur 9 [Fin]
maheln
 Posté le 25/10/2019 à 22:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour ,

https://www.cjoint.com/c/IJzt3on7Uyr

oui je comprend mieux ,comme demander , je prend note de ma bêtise !

merci pour le lien

merci de votre patience et de votre compréhension

Debrief
 Posté le 25/10/2019 à 22:56 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Le placement des formules en Q8:X8 est assez délicat.

J'ai remplacé ta formule en Q8:
=SI(I8=NDP!$D3;1;SI(I8=NDP!$E3;2;SI(I8=NDP!$F3;3;SI(I8=NDP!$G3;4;SI(I8=NDP!$H3;5;"")))))

Par:
=SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$D$3;1;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$E$3;2;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$F$3;3;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$G$3;4;SI(I8=NDP!H3;5;"")))))

Pour la rendre plus transportable. Elle peut s'appliquer sans changement à toutes les cellules des 8 derniers chiffres des Groupes Nom de la feuille CA (ici pour le 1er nom qui est en ligne 3 de la feuille NDP)
Elle est copiable d'une ligne à une autre de la feuille CA sans changement.

INDIRECT(ADRESSE(LIGNE();COLONNE()-8)) représente la cellule qui est à -8 colonnes de la cellule qui contient la formule. Soit I8 dans ta formule initiale.

Le problème des 5 MFC sur Q8:X8 c'est qu'elles sont répétées pour chaque Groupe Nom et pour chaque ligne de report dans chaque Groupe Nom.
Cela va générer un très grand nombre de MFC. Idéalement il faudrait créer 1 seule MFC par Groupe Nom, c'est à dire modifier le AppliesTo Ranges de $Q$8:$X$8 à $Q$8:$X$1048576.
Ça peut être fait dans le formatage de la feuille CA. Je verrai ça après que tu auras testé ce dernier fichier.

Fichier -> https://cjoint.com/c/IJzu4z1yG3B



Modifié par Debrief le 25/10/2019 23:05
Debrief
 Posté le 25/10/2019 à 22:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Il ne faut pas dire "ma bêtise". Il faut dire "mon erreur", mon "oubli", etc... Jamais utiliser des termes laissant penser qu'on se dévalorise à l'égard de qui que ce soit.



Modifié par Debrief le 25/10/2019 23:00
maheln
 Posté le 26/10/2019 à 00:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour ,

comment dire , chaque groupe de CA ligne 8 doit faire la recherche sur la ligne 3 de NDP,chaque groupe de CA ligne 9 doit faire la recherche sur la ligne 4 de NDP pour l formule indirect

le code est très bien expliquer ,si le AppliesTo Ranges respecte la mise en forme que je souhaite une fois modifier oui,si c'est le cas ,peu t'on AppliesTo Ranges de $Q$8:$X$8 et remplace ($Q$8:$X$1048576) par Nombre_Max_De_Noms_En_Feuille_CA et Nombre_Max_De_Lignes_Report_Par_Nom_En_Feuille_CA .

les colonnes a:g feuille CA reste t'elle libre d'utilisation ?

les ligne 1 à 5 reste t'elle disponible d'utilisation ?

merci de votre patience et de votre compréhension



Modifié par maheln le 26/10/2019 01:05
Debrief
 Posté le 26/10/2019 à 06:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

chaque groupe de CA ligne 8 doit faire la recherche sur la ligne 3 de NDP,chaque groupe de CA ligne 9 doit faire la recherche sur la ligne 4 de NDP pour l formule indirect

Es-tu bien sûr de ce que tu dis ?

Pour un Groupe Nom de la feuille CA donné, le 1er Groupe Nom de CA par exemple, la recherche en ligne 8 de CA doit faire la rechercher sur la ligne 3 de NDP (le 1er nom), les recherches en lignes 9, 10, etc... de ce 1er Groupe Nom doivent aussi faire la rechercher sur la ligne 3 de NDP (le 1er nom). Car on est toujours dans le Groupe Nom du 1er nom et donc c'est bien la ligne 3 de NDP (le 1er nom) qu'il faut utiliser.

La plage "A:G" n'est pas concernée par le formatage et donc libre d'utilisation.

Je vais faire les modifs pour le AppliesTo Range des MFC au formatage. Il n'y aura donc "que" (197 * 5) soit près de 1000 MFC correspondant au nombre de Groupes Nom fois 5 MFC.

On va voir si Excel accepte un tel nombre de MFC et si ce n'est pas le cas on peut toujours regrouper les MFC équivalentes sur des Ranges "multi-area" ("$Q$8:$Q$1048576,$AH$8:$AO$1048576, etc...).
En théorie on devrait même pouvoir limiter à 5 MFC en regroupant les 197 Ranges en 1 seul Range "multi-area". Je vais essayer les 2 solutions.

maheln
 Posté le 26/10/2019 à 07:56 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

groupe 1, i8:p8 avec d3:h3 , groupe 2 z8:ag8 avec d3:h3 et cela jusqu'au dernier groupe de la ligne 8 ,ensuite

ligne 9 groupe 1 ,i9:p9 avec d4:h4 , groupe 2, z9:zg9 d4:h4 jusqu'au dernier groupe .

NDP b3:b202 représente la liste des membres ,d3 :h202 les résultats attendue

donc pour chaque groupe ligne 8 de CA ,on utilise d3:h3

ligne 9 de CA ,on utilise d4:h4 et ainssi de suite pour chaque nouvel ligne de CA

merci de votre patience et de votre compréhension

Debrief
 Posté le 26/10/2019 à 11:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ok donc tu dis que:

- pour la ligne 8 du groupe Cherche98 en CA on utilise la liste ligne 3 de NDP correspondant au nom Cherche98
- pour la ligne 9 du groupe Cherche98 en CA on utilise la liste ligne 4 de NDP correspondant au nom Prud

Ça me parait bizarre d'utiliser les chiffres du nom Prud pour le nom Cherche98 en ligne 9.

Si c'est le cas, il faut que je change les formules des 8 derniers chiffres du Groupe Nom.

A moins que dans la feuille NDP, la liste des chiffres ne soit pas en relation avec la liste des noms. Tu confirmes ?



Modifié par Debrief le 26/10/2019 11:53
maheln
 Posté le 26/10/2019 à 15:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

dans NDP, b3:b202 représente la liste des membres qui sert uniquement à crée les groupe en CA,effectivement dans NDP ,d3 :h202 n'a rien a voir avec avec b3:b202 .

merci de votre patience et de votre compréhension

Publicité
Debrief
 Posté le 26/10/2019 à 17:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

J'ai modifié le fichier pour les formules et essayé de maintenir les MFC qui peuvent se splitter et se multiplier selon les manip faites sur la feuille. C'est le symptôme classique des MFC.

La formule est quasiment la même sauf le "$" précédent le 3 de la ligne est supprimé. Ensuite en copie sur la ligne suivante le 3 devient automatiquement 4 etc...

=SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$D3;1;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$E3;2;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$F3;3;SI(INDIRECT(ADRESSE(LIGNE();COLONNE()-8))=NDP!$G3;4;SI(I8=NDP!$H3;5;"")))))

INDIRECT(ADRESSE(LIGNE();COLONNE()-8)) représente la cellule qui est à -8 colonnes de la cellule qui contient la formule.

Fichier -> https://cjoint.com/c/IJApNzJoMPB

Si y a des bugs, me les signaler avec le scénario qui y amène.

maheln
 Posté le 26/10/2019 à 18:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

est t'il possible qu'il y est en feuille CA un petit bouton stock(qui coupe l'insertion date aujourd’hui et me demande qu'elle date ,est l’insert,un autre qui rétablisse l'insertion date du jour.

si je clic sur stock ,c'est le code du bouton stock qui prend en charge la copie et me demande la date à inséré au moment de la copie et si je clic sur report feuille 2 la copie se fait normalement avec date jour

merci de votre compréhension et de votre patience

Debrief
 Posté le 26/10/2019 à 19:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Pas besoin de 2 boutons -> https://cjoint.com/c/IJArmanf3iB

maheln
 Posté le 26/10/2019 à 19:29 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

c'est juste cela que je souhaitais ,je regarde tous cela

merci pour votre patience et votre compréhension

maheln
 Posté le 26/10/2019 à 19:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

j'ai mis en feuille trie le code que j'utilise pour la feuille trie ,pourriez vous l'inclure dans le code écrit à votre façons si besoin ,que je ne tache pas pas ce qui est si bien fait

merci de votre patience et de votre compréhension

Debrief
 Posté le 26/10/2019 à 20:05 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Désolé je ne comprends pas.

Quel code ? Il n'y a pas de code dans la feuille "trie"

De quel code s'agit-il ?

maheln
 Posté le 26/10/2019 à 21:09 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

je m'excuse j'ai oublier de déposé le lien https://www.cjoint.com/c/IJAth11nq5k

sur la feuille trie

merci pour votre aide et votre compréhension

Debrief
 Posté le 27/10/2019 à 04:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Sub Macro1()
Application.ScreenUpdating = False

Dim i As Double
Dim j As Double
Dim fin As Double

Sheets("trie").Select

i = 2
j = 3
fin = Range("B" & Rows.Count).End(xlUp).Row
While (i <= 1015)

Range("B" + CStr(i) + ":" + "J" + CStr(i)).Select
Selection.Copy

Range("L" + CStr(j)).Select
ActiveSheet.Paste
i = i + 2
j = j + 1
Wend

Mes remarques:

- Toujours pas d'explication avec des mots de ce que tu veux faire. Je suppose copier 1 ligne sur 2 tu tableau source B4:J200 dans le tableau cible L4:T100 ?

- Les Ranges ne sont pas qualifiés. Certes tu sélectionnes la feuille avant ce qui, je pense, permet de ne pas qualifier les Ranges mais on peut très bien se passer de sélectionner la feuille pour faire les copies
Il vaut mieux qualifier les Ranges soit en mettant fin = ThisWorkbook.Worksheets("trie").Range("B" & Rows.Count).End(xlUp).Row
Soit en mettant With ThisWorkbook.Worksheets("trie") avant et ensuite fin = .Range("B" & Rows.Count).End(xlUp).Row
(Le With XXXX permet de se passer du XXX dans la qualification des objets qui commencent par ".")

- Pourquoi commencer en ligne 2 pour le tableau source (i = 2) et en ligne 3 pour le tableau cible (j = 3) ? Il n'y a rien dans ces lignes pour les 2 tableaux qui commencent tous 2 en ligne 4.

- Le boucle sur i est limitée par le chiffre 1015 While (i <= 1015) alors que tu as dans la variable "fin" la dernière ligne => While (i <= fin)

- Pour faire des Copy / Paste, pas besoin de passer par une sélection: Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy Range("L" + CStr(j))
Ou encore:
Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy
Range("L" + CStr(j)).pastespecial Paste:=<option de coller>

Ta version adaptée (selon ma supposition initiale):

Sub Copier1()
Dim i As Double
Dim j As Double
Dim fin As Double

With ThisWorkbook.Worksheets("trie")

Application.ScreenUpdating = False

i = 4
j = 4
fin = .Range("B" & Rows.Count).End(xlUp).Row

While (i <= fin)
.Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy .Range("L" + CStr(j))
i = i + 2
j = j + 1
Wend

Application.ScreenUpdating = True

End With
End Sub

Une autre façon équivalente de le faire (à titre d'exemple uniquement):

Sub Copier2()
Dim Ligne As Range
Dim i As Long

Application.ScreenUpdating = False

i = 1
For Each Ligne In ThisWorkbook.Worksheets("trie").Range("B4:J200").Rows
If i Mod 2 = 1 Then Ligne.Copy Ligne.Offset(-Int(i / 2), 10)
i = i + 1
Next Ligne

Application.ScreenUpdating = True

End Sub

Edit: Ou pour être encore plus "souple" et paramétré (toujours à titre d'exmple):

Sub Copier2()
Dim Ligne As Range
Const TableauSource = "B4:J200"
Const NbColonnesSéparation = 1

Application.ScreenUpdating = False

For Each Ligne In ThisWorkbook.Worksheets("trie").Range(TableauSource).Rows
If (Ligne.Row - Range(TableauSource).Row) Mod 2 = 0 Then
Ligne.Copy Ligne.Offset(-Int((Ligne.Row - Range(TableauSource).Row) / 2), Range(TableauSource).Columns.Count + NbColonnesSéparation)
End If
Next Ligne

Application.ScreenUpdating = True

End Sub

Tu remarqueras que par exemple Range(TableauSource).Row n'est pas qualifié. C'est parce dans ce cas, on ne fait pas référence à une adresse de cellule ou plage particulière.
Il s'agit d'un simple décompte ou chiffre (le n° de ligne en l'occurrence) et ce chiffre n'est pas dépendant de la feuille à laquelle appartient le Range.
Ceci dit, rien n'empêche de le qualifier quand même avec ThisWorkbook.Worksheets("trie").Range(TableauSource).Row



Modifié par Debrief le 27/10/2019 04:35
Publicité
maheln
 Posté le 27/10/2019 à 08:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

merci pour ces explication précieuse,effectivement j'aurai due expliquer ,en feuille Trie, je dépose le contenue d'un tableau en B4:J1018 provenant d'un autre classeur ,le tableau ce compose de 509 groupe de 2 lignes ,(b4:j5) compose le premier groupe et ainsi de suite jusqu'au 509 iem groupes ,le but du code sur feuille trie est de récupérai la première ligne de chaque groupes et de la déposé dans le 2 iem tableau . (B4:J4) va sur (L4:T4) , (B6:J6) va sur( L6:T6) et cela pour les 509 groupe ,ensuite je copie le contenue du tableau (L4:T509),dans un autre classeur(utiliser par une autre personne )et en ce qui me concerne en feuille 2 pour CA

merci de votre patience et de votre compréhension

Debrief
 Posté le 27/10/2019 à 09:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Ok, avec les explications ça va mieux. Donc tu pourrais soit te passer de le copier en colonnes L:T de la feuille "trie" et le copier directement en "Feuil2" soit le copier dans les 2 en même temps dans la Macro.

D.

maheln
 Posté le 27/10/2019 à 10:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

oui je peu me passer de le copier en colonnes L:T de trie et le copier directement en "Feuil2" et garder le fonctionnement de report de la feuille 2 actuel .

je n'est peu être pas compris ( en même temps dans la Macro)

merci de votre patience et de votre compréhension

Debrief
 Posté le 27/10/2019 à 10:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Je voulais dire copier et coller dans la feuille "trie" et aussi / en même temps dans la feuille "Feuil2"

While (i <= fin)
.Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy
.Range("L" + CStr(j)).PasteSpecial Paste:=xlPasteAll
ThisWorkbook.Worksheets("feuil2").Range("B" + CStr(j)).PasteSpecial Paste:=xlPasteAll
i = i + 2
j = j + 1
Wend

maheln
 Posté le 27/10/2019 à 11:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

sans passe par L:T donc ce serai

While (i <= fin)

.Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy

ThisWorkbook.Worksheets("feuil2").Range("B" + CStr(j)).PasteSpecial Paste:=xlPasteAlli = i + 2j = j + 1Wend

i = i + 2

j = j + 1

Wend

ou je n'est toujours pas compris



Modifié par maheln le 27/10/2019 11:35
Debrief
 Posté le 27/10/2019 à 11:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Oui, ça fonctionnerait.

Mais s'il n'y a qu'une seule cible sur le coller intégral (équivalent xlPasteAll) ce serait plutôt:

While (i <= fin)
.Range("B" + CStr(i) + ":" + "J" + CStr(i)).Copy ThisWorkbook.Worksheets("feuil2").Range("B" + CStr(j))
i = i + 2
j = j + 1
Wend

Pourquoi ?

Parce que si l'opération est faite en 1 fois sur la même instruction, le Range de copie (<Range>.Copy) marqué de pointillés est démarqué à l'issu du coller.

Si l'opération est faite en 2 fois (ou plus si plusieurs coller à la suite) sur plusieurs instructions, le Range de copie (<Range>.Copy) marqué de pointillés n'est PAS démarqué à l'issu du coller. Ce qui permet d'ailleurs d'enchaîner d'autre coller dans la foulée (ce qui est fait dans mon post précédent pour coller aussi sur la feuille "Feuil2").

Pour du coller spécial (formats, formules, valeurs, etc...) (<Range>.PasteSpecial Paste:=xlPasteFormats ou Paste:=xlPasteFormulas ou Paste:=xlPasteValues, etc... voir ici), on ne peut pas utiliser l'opération en 1 fois car elle implique une copie de tout, l'équivalent de <Range>.PasteSpecial Paste:=xlPasteAll.

Et dans ce dernier cas de copier / coller en plusieurs opérations séparées, pour démarquer le Range de copie (<Range>.Copy) il faut utiliser l'instruction Application.CutCopyMode = False.

Edit: illustration



Modifié par Debrief le 27/10/2019 12:29
maheln
 Posté le 28/10/2019 à 00:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

donc dans mon cas

i = 1

j = 2

fin = .Range("B" & Rows.Count).End(xlUp).Row

While (i <= fin)

.Range("B" + CStr(j) + ":" + "J" + CStr(j)).Copy

'.Range("L" + CStr(i + 2)).PasteSpecial Paste:=xlPasteAll

ThisWorkbook.Worksheets("feuil2").Range("B" + CStr(i + 2)).PasteSpecial Paste:=xlPasteAll

i = i + 1

j = j + 2

Wend

Pourriez-vous ajouter l'enregistrement automatique après chaque report en feuille CA ?

merci de votre patience et de votre compréhension



Modifié par maheln le 28/10/2019 02:19
Debrief
 Posté le 28/10/2019 à 07:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Dans ton dernier exemple ci-dessus, tu as inversé l'utilisation des indices "i" et "j" par rapport à ta 1ère version du code (et ma version qui en était inspirée) sauf pour le While !
Donc c'est un pataquès auquel je ne comprends plus rien et qui probablement ne fonctionne pas.

donc dans mon cas

i = 1

j = 2

Dans la 1ère version du code:
La valeur initiale de "i" doit représenter la 1ère ligne du tableau source
La valeur initiale de "j" doit représenter la 1ère ligne des 2 tableaux cibles

Je te laisse à tes indices.

Pour faire une sauvegarde du classeur il suffit d'ajouter l'instruction ThisWorkbook.Save à la fin de la Macro de report.

maheln
 Posté le 28/10/2019 à 08:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour,

j'avais essayer d'expliquer ici Posté le 27/10/2019 à 08:08

le code fonctionnent et copie en L4:T509 de feuil TRIE ,et sur FEUIL2 en B4:J509 , ce que je voulais c'est copier le tableau en feuil TRIE B4:J1018 en feuil TRIE sur L4:T509 en sautant une ligne entre chaque ligne copier ,donc dans le tableau L4:T509 la

ligne 1 = B4:J4, ligne 2 = B6:J6, ligne 3 B8:J8, et ainsi de suite du tableau B4:J1018 .

pour vous répondre ,apprendre à manipuler le codage VBA n'est pas simple et à écrire et à manipuler ,surtout quand comme moi on ne la jamais fait, toute fois je vous remercie pour votre aide ci-dessus je vais m'efforcer de progresse

Application.ScreenUpdating = False

Dim i As Double

Dim j As Double

Dim fin As Double

With ThisWorkbook.Worksheets("trie")

i = 1

j = 2

fin = .Range("B" & Rows.Count).End(xlUp).Row

While (i <= fin)

.Range("B" + CStr(j) + ":" + "J" + CStr(j)).Copy

'.Range("L" + CStr(i + 2)).PasteSpecial Paste:=xlPasteAll

ThisWorkbook.Worksheets("feuil2").Range("B" + CStr(i + 2)).PasteSpecial Paste:=xlPasteAll

i = i + 1

j = j + 2

Wend

Range("L4").Select

Application.ScreenUpdating = True

End With

End Sub

merci de votre patience et de votre compréhension



Modifié par maheln le 28/10/2019 08:20
Publicité
Pages : Début ... 1 2 [3] 4 5 ... Fin
[Début] Page 3 sur 9 [Fin]

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
Aucun sujet pertinent lié trouvé
 > Tous les forums > Forum Bureautique