Tri dynamique impossible avec une matrice ?

Regueiro

XLDnaute Impliqué
Bonsoir le Forum
Félicitations à BrunoM45 pour ces 7K et merci encore à lui pour ces précieux Conseils.

Sur ma feuille 0. Récap j'ai un tri dynamique.
Code
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 5 And Target.Count = 1 Then
nom = Target
[E8:I36].Sort key1:=[E8]
[E:E].Find(what:=nom).Select
End If
End Sub
Mais ce code ne marche pas ?
J'ai en E8:E36 une formule matricielle.
Code
=conso3D("E19:E100";nf)
Est-ce que le problème vient de cela ?
Je peux vous joindre le fichier mais assez lourd ?
Merci de votre Aide
A+
 

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Bonjour,

Tu adaptes le nom des feuilles et des plages de cellules.

VB:
Sub test()
Dim T As Variant

With Feuil1
    T = .Range("A1:E5").Value
End With

'Tu choisis la première cellule du coin supérieur
'gauche où seront copiées les données
With Feuil2
    .Range("G5").Resize(UBound(T, 1), UBound(T, 2)) = T
End With
End Sub
 

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Bonsoir le Forum
Merci MichD
J'ai adapter ton code sur mon fichier.
Il marche parfaitement.
Code
Sub test()
Dim T As Variant

With Feuil5
T = .Range("E8:G36").Value
End With

'Tu choisis la première cellule du coin supérieur
'gauche où seront copiées les données
With Feuil8
.Range("E8").Resize(UBound(T, 1), UBound(T, 2)) = T
End With
End Sub
Par contre si j'ai déjà des données dans la "Feuil8"
Par exemple :
Capture.PNG
En colonne G, je saisie mes prix unitaires.
Et dans cette feuille j'ai ce code :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Long
X = Application.Calculation
If Target.Column = 5 And Target.Count = 1 Then
Application.Calculation = xlCalculationManual
nom = Target
Range("E8:G36").Sort key1:=[E8]
Range("E:E").Find(what:=nom, LookIn:=xlValues, LookAt:=xlWhole).Select
Application.Calculation = X
End If
End Sub
Avec ton code si je recopie une nouvelle donnée.
Mes prix unitaires se décalent.
En fait ce que je souhaiterais comme dans mon code du post N°13,
Il compare les 2 feuilles et complète le texte manquant en Feuil8.
Mais le problème avec mon code il transpose les données en colonne.
Merci de ton Aide.
A+
 

Pièces jointes

  • Capture.PNG
    Capture.PNG
    23.1 KB · Affichages: 111
  • Capture.PNG
    Capture.PNG
    23.1 KB · Affichages: 110

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

If d2.Count > 0 Then f2.[E8].End(xlUp).Offset(1).Resize(d2.Count, 1) = Application.Transpose(d2.Keys)

Mais le problème avec mon code il transpose les données en colonne.

Tu devrais regarder la ligne de code précédente...Pourquoi utiliser alors : "Application.Transpose"

J'ai été absent un moment de ce forum et j'ai de la difficulté à comprendre ce que tu veux faire...

Pourrais-tu publier ton fichier (seulement ce qui a rapport à cette question) et expliquer ce que tu désires,
question de me rafraîchir la mémoire!
 

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Salut MichD
En fait je veux remplacer = Application.Transpose(d2.Keys)
(J'ai trouver ce code sur le site.)
Par un copier coller les valeurs uniquement.
Mais sur 3 colonnes.
Et non pas sur une seule colonne comme le fait le code actuellement.
Merci.
A+
 

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

A ) D'abord, je veux m'assurer que l'on parle de la même procédure.
Tu fais appel à la procédure suivante?

B ) Explique-moi en MOTS ce que la procédure devrait faire...

C ) Que devrais-tu obtenir comme résultat?

La question initiale faisait référence à la difficulté que tu avais avec l'exécution d'un tri compte tenu
que tu avais une formule matricielle répartie sur plusieurs lignes de la plage de données.

Soudainement, tu as sorti de nulle part ce code que tu veux que je corrige sans que tu prennes le
temps d'expliquer la situation...Je ne suis pas devin!



VB:
Sub MajTph()
Set f1 = Sheets("0.Récap")
Set f2 = Sheets("0.Prix Unitaires")
Set d1 = CreateObject("Scripting.Dictionary")
For Each C In f2.[E8:G36]
    If C.Text <> "" Then
        d1(C.Text) = ""
    End If
Next C
Set d2 = CreateObject("Scripting.Dictionary")
For Each C In f1.[E8:G36]
    If C.Text <> "" Then
        If Not d1.exists(C.Text) Then
            d2(C.Text) = ""
        End If
    End If
Next C
If d2.Count > 0 Then
    f2.[E8].End(xlUp).Offset(1).Resize(d2.Count, 1) = Application.Transpose(d2.Keys)
End If
End Sub
 

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Bonjour à Tous.
Salut MichD.
Comme tu m'avais conseillé sur un post précédent.
Je copie les Info de 0.Récap plage E8:G36 vers la feuille 0.Prix unitaires sur la même Plage E8:G36
La macro contrôle si les données sont existantes en 0. Prix Unitaires.
Si il n'y a pas de donnée elle copie les valeurs manquantes uniquement en 0. Prix Unitaires
Avec ce code il fait exactement cela, mais il colle les données en colonne et pas en ligne.
Ainsi je pourrais gérer mes prix unitaires sur la feuille 0. Prix unitaires.

La macro que j'ai sur la Feuille 0. Prix unitaires me sert de tri dynamique.
Si j'ai déja un prix unitaire en H8 par exemple.
Celui-ci doit resté attaché ( lié ) avec les données déjà inscrites.
Je crois que la macro fait cela ?

Si tu veux je peux joindre mon nouveau fichier, mais vers 13h00
Merci de ton Aide.
Bonne appétit
 

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Je copie les Info de 0.Récap plage E8:G36 vers la feuille 0.Prix unitaires sur la même Plage E8:G36
La macro contrôle si les données sont existantes en 0. Prix Unitaires.

Si tu veux copier toute la plage de cellules E8:G36 d'une feuille à l'autre, pourquoi ne pas effectuer la copie
d'un seul coup en copiant tout le bloc de cellules de la feuille source vers la feuille de destination. À cet
effet, je n'ai déjà donné une procédure qui fait cela.

Pourquoi te casser la tête avec ceci : "La macro contrôle si les données sont existantes en 0. Prix Unitaires",
si tu veux obtenir sur la feuille de destination une copie de la plage de cellules de la feuille source?

Si tu as une ou des raisons de vouloir procéder comme tu le proposes, quelles sont-elles?
 

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Re
Voilà le fichier.

http://cjoint.com/?0GFngEBiy1T

J'ai garder ton code pour copier de 0.Récap à 0.Prix....
Ok ton code marche.
Par contre c'est mon code pour le tri sur la feuil 0.Prix.. qui ne vas pas.

Tu peux faire un essai.
Avant regarde sur la Feuil 0.Prix les prix unitaires en Colonne.
Ceux-ci se décalent dès que l'on rajoute des données
Tu vas la feuille ART.123
En colonne E tu mets 1.001.003 et en F blabla et en G = H
Ces 3 données vont auto sur la feuil 0.Récap.
Depuis 0.Récap bouton rouge copie dans 0. Prix..
L'idéal serait de mettre une procédure événementielle dans la Feuille 0.Récap
A chaque changement dans la zone E8:G36 copy en 0.Prix..

Merci
A+
 

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

J'ai de la difficulté à suivre...

Dans le module de la feuille "O.Prix unitaires", tu as une procédure événementielle OÙ :

If Target.Column = 4 And Target.Count = 1 Then

Or, Target.Column = 4 est l'équivalent de la colonne D dans ta feuille et dans ta feuille
la colonne D est vide. En d'autres termes, cela veut dire que ton code ne s'exétera jamais.

Encore là, que veux-tu faire?


Écoute, j'ai un temps limité que je peux utiliser pour répondre à quelques questions.

Je ne fais pas du "chatting" dont l'objet est Excel.

Si tu as UNE question claire, je veux bien voir ce que je peux faire, si non, je passerai la main à un autre répondeur.
 
Dernière édition:

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Rebonjour à tous
Merci encore MichD pour le temps que tu me consacres.
1. Pour le tri dynamique sur ma Feuil (0.Prix Unitaires )
le problème est résolu avec ce code
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Count = 1 Then
m = Target
[E8:G36].Sort Key1:=[E8]
[A:A].Find(What:=m, LookIn:=xlValues).Select
End If
End Sub

2. Pour mon 2ème problème
J'aimerais que dans ma Feuil (0.Prix Unitaires )
Elle reprennent toutes données de la Feuil (0.Récap)
Mais en fesant une comparaison entre les 2 onglets.
Avec une procédure événementielle à chaque changement de données
dans la Feuil (0.Récap) on compare si les données existent dans la Feuil (0.Prix Unitaires )
et complètent si elles n'existent pas.
Ce code doit marcher, mais il transpose les données au lieu de copier uniquement les valeurs
en lignes.
Sub MajTph()
Set f1 = Sheets("0.Récap")
Set f2 = Sheets("0.Prix Unitaires")
Set d1 = CreateObject("Scripting.Dictionary")
For Each C In f2.[E8:G36]
If C.Text <> "" Then
d1(C.Text) = ""
End If
Next C
Set d2 = CreateObject("Scripting.Dictionary")
For Each C In f1.[E8:G36]
If C.Text <> "" Then
If Not d1.exists(C.Text) Then
d2(C.Text) = ""
End If
End If
Next C
If d2.Count > 0 Then
'f2.[E8].End(xlUp).Offset(1).Resize(d2.Count, 1) = Application.Transpose(d2.Keys) 'Ok marche mais transpose
f2.[E8].End(xlUp).Offset(1).Resize(d2.Count, 1) = Application.Index(d2.Keys)
End If
End Sub
Merci.
A+
 

MichD

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Question 1

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Count = 1 Then
m = Target
[E8:G36].Sort Key1:=[E8]
[A:A].Find(What:=m, LookIn:=xlValues).Select
End If
End Sub

Si j'ai bien compris, tu lances un tri sur le tableau E8:G36 de la feuille "O.Prix Unitaire" à chaque
fois que tu modifies la valeur d'une cellule de la colonne A:A

- C'est tres particulier puisque cette colonne contient en même temps des données et des boutons de commandes!
- Cette colonne ne contient pas d'étiquette de colonne
- Cette colonne ne contient pas une donnée pour chaque ligne de ton tableau E8:G36

Question II

Avec une procédure événementielle à chaque changement de données

A ) Tu saisis tes données dans quelle feuille, "0.Prix Unitaires" OU "0.Récap"

B ) Si j'ai bien compris, tu veux que la donnée que tu saisies dans une feuille x s'inscrive automatiquement dans
l'autre feuille y à l'adresse de la cellule correspondante de la feuille d'origine X
C'est impossible puisque les cellules de la feuille "O.Recap" extrait les données par formules.

Dans la colonne de la feuille "O.Recap", tu as cette fonction personnalisée
Function conso3D(champ As String, Liste As Range)

Dans cette fonction "Liste" fait référence à
ART.0_BASE
ART.ass
ART.123
qui sont des noms de feuille de ton classeur.

Dans cette énumération, on ne retrouve pas le nom de la feuille "O.Prix Unitaires"

La fonction personnalisée boucle sur chaque plage "Champ" (E19:E100) de chaque feuille et extrait à l'aide
d'un objet dictionnaire chacune des données et les classe par ordre alphabétique dans la colonne E8:E43
de laa feuille "O.Recap"

En conclusion, je ne comprends pas ce que tu veux faire et moi j'abdique. Je passe la main à quelqu'un d'autre!
 

Regueiro

XLDnaute Impliqué
Re : Tri dynamique impossible avec une matrice ?

Bonsoir le Forum et MichD
Merci pour tes remarques, en effet il y avait une erreur de code.
Voilà un extrait de mon fichier avec le code qui marche.
Pour la suite de mon problème.
A chaque changement de données dans ma Feuil 0.Récap
La macro contrôle si ces données existent dans la Feuil 0.Prix unitaires.
Si ces données n'existent pas il faut les copier dans la dernière cellule vide de 0.Récap.en colonne E
Ainsi ces données seront auto triées selon mon code de la Feuil 0.Prix Unitaires.

Pour information.
Dans ma Feuil 0.Récap
La macro qui boucle sur toutes les feuilles du classeur ?
Non Uniquement les feuilles marquées "x" en colonne R et automatiquement
retranscrit en Colonne T onglets choisis.
Voilà.
J'espère que c'est un peu plus clair.
En fait il ne me manque plus que de mettre au clair cette fameuse macro.
Remplacer Application.Transpose par un copier coller valeur uniquement.
Bonne soirée
ou A+
Peut-être qu'une autre personne peu m'aider vu que tu veux passer la main. ?
 

Pièces jointes

  • Classeur1.xlsm
    28.2 KB · Affichages: 81
  • Classeur1.xlsm
    28.2 KB · Affichages: 82
  • Classeur1.xlsm
    28.2 KB · Affichages: 85

Statistiques des forums

Discussions
312 749
Messages
2 091 645
Membres
105 011
dernier inscrit
PHILIPPE VADAINE