Copier des cellules d'un onglet A vers un B avec tri

Alors, il faut bien mettre

If InStr(txts, cell.Value) > 0 Then

même si ce n'est pas le problème.

Regarde, ce If bloque alors que celui juste avant (avant le for each) ne bloque pas avec la même condition. Pourquoi ? Est-ce bien la 4è colonne ? Y a-t-il autre chose que du texte ?

edit : Il faut que je voie ton code en entier, ce sera plus simple pour moi

Ok, je l'ai modifié For Each cell In Range("CSM[CSM]") mon tableau CSM et l’entête de la Dest CSM aussi

Par contre je n'ai pas l'impression que le txts = Join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R")) il fonctionne, car j'ai 68 lignes en tout dans mon V6 confondus et il m'en transfert 19 en renseignant CSM DIJON à la 4eme colonne !

Mon tableau je peux le mettre uniquement sur la colonne D1:D150 par exemple et non pas sur la totalité des données ("A1:D150") ?

Tu pourrais le mettre uniquement sur une colonne mais ce serait contre-productif. D'ailleurs, une colonne de tableau est en soit un tableau à une dimension.

Quant instr, ça fonctionne en partie déjà, c'est bien. Et donc selon toi, ça ne fonctionne pas avec chaque critère ?

En fait dans mon V6 j'ai 137 lignes, 70 lignes différentes aux critères que nous avons mis, quand je met PAC l'un des critère diffèrent je me retrouve avec 17 et peut importe le critère

Si je mets un critère qui est dans txts je me retrouve avec 18 lignes alors que je devrais trouver 67 lignes !

Et si tu essaies avec ça plutôt :

txts = join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"), "")

Là, c'est bizarre... Est-ce que tes critères sont bien identiques à ceux ci-dessus (il n'y a pas de point-virgule qui parasite ?) ? Sont-ils bien tous en colonne 4 ? Est-ce que je pourrais voir le fichier si ça ne marche toujours pas ?

En attendant, essaie aussi avec :

If cell.value = "DIJON DOP2R" or cell.value = "DEV Dijon" or _
cell.value = "CSH DIJON" or cell.value = "CNE DOP2R" then 'à la place du 1er instr après le for

If cell.value <> "DIJON DOP2R" and cell.value <> "DEV Dijon" and _
cell.value <> "CSH DIJON" and cell.value <> "CNE DOP2R" then 'à la place du 2nd instr après le for

Bonne soirée,

Merci beaucoup

Bonne soirée à toi aussi

Bonjour 3GB,

J'espère que tu as bien dormis, c’était pour te dire que la recherche du 2 if d'hier ne fonctionne pas ! le résultat est le mème toujours les lignes correspndantes au hors prod

avec les critères suivant : "DIJON DOP2R" "DEV Dijon" "CSH DIJON" "CEN DOP2R

Du coup j'ai mis un If Not à la deuxième boucle, mais malgré ça le recherche des colonne différentes ne fonctionne pas ?

If Not cell.Value = "DIJON DOP2R" And cell.Value = "DEV Dijon" And cell.Value = "CSH DIJON" And cell.Value = "CEN DOP2R" Then

Un autre truc, peut-on mettre le Param en debut du env.conf ? son événement sera déclencher qu'une fois, mais sur quoi ?

Salut spoutnik,

Je pensais justement à toi ! Oui, j'ai bien dormi merci, j'espère que toi aussi.

Ça pourrait être pas mal que tu déposes ton fichier un de ces 4 afin que je le voie directement. Et pour le Param, oui, tu peux le mettre en début :

With shEnv 'sur env.conf
    NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
    If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne
    Worksheets("PARAM").Range("A1:E1").Copy Worksheets("env.conf").Range("A" & (NvL))
    Worksheets("PARAM").Range("A2:E2").Copy Worksheets("env.conf").Range("A" & (NvL) + 1)
    Worksheets("PARAM").Range("A3:E3").Copy Worksheets("env.conf").Range("A" & (NvL) + 2)
    Worksheets("PARAM").Range("A4:E4").Copy Worksheets("env.conf").Range("A" & (NvL) + 3)
    Worksheets("PARAM").Range("A5:E5").Copy Worksheets("env.conf").Range("A" & (NvL) + 4)
    Worksheets("PARAM").Range("A6:E6").Copy Worksheets("env.conf").Range("A" & (NvL) + 5)
    Worksheets("PARAM").Range("A7:E7").Copy Worksheets("env.conf").Range("A" & (NvL) + 6)
    Worksheets("PARAM").Range("A8:E8").Copy Worksheets("env.conf").Range("A" & (NvL) + 7)
    Worksheets("PARAM").Range("A9:E9").Copy Worksheets("env.conf").Range("A" & (NvL) + 8)
    Worksheets("PARAM").Range("A10:E10").Copy Worksheets("env.conf").Range("A" & (NvL) + 9)
    NvL = NvL + 1

Ainsi, ça se déclenche au double-clic, met d'abord les param, puis essaie de mettre les V6 avec les bons critères.

Edit : Et le not ne porte que sur une condition. Si tu veux le généraliser, tu dois placer l'ensemble entre parenthèses

If Not (cell.Value = "DIJON DOP2R" And cell.Value = "DEV Dijon" And cell.Value = "CSH DIJON" And cell.Value = "CEN DOP2R") Then

Et si tu ne veux le param qu'une fois, sachant qu'il est censé se trouver au début, tu peux tester sur une des cellules :

if not .cells(2, ?k?).value = "valeurpropreàunparamètre" then
copie des paramètres
end if

OK, voici le fichier en PJ

3v6.zip (21.27 Ko)

Je ne comprends pas ! que dois-je mettre dans paramètres et ou dans le code ?

if not .cells(2, ?k?).value = "valeurpropreàunparamètre" then
copie des paramètres
end if

Tout marche très bien de mon côté. Les 2 problèmes :

If InStr(txts, cell.Value) > 0 Then 'était écrite If InStr(txts, cell.Value) > 1 Then > empechant ainsi la correspondance DIJON DOP2R

et

il y a des lignes CEN DOP2R (une seule CNE DOP2R) avec une correspondance CNE DOP2R... Je ne touche pas mais je pense qu'il y a un changement à faire soit sur le fichier soit dans le code.

Pour ces 2 problèmes, j'avais fait la remarque (critère à contrôler et instr > 0) !

Sinon, peux-tu m'expliquer pour le PARAM : faut-il copier les lignes une seule fois à la création de env.conf ? Ou à chaque copie de lignes sur env.conf ?

non juste à la création du fichier env.conf

Bon, normalement, ça devrait marcher maintenant. J'ai quand même l'impression qu'on aurait pu trouver une solution pour s'épargner beaucoup d'efforts en faisant un simple tri.

Voici le fichier spoutnik

5v6.zip (32.86 Ko)

Edit : dans le code, il faudra que tu renommes les colonnes avec les titres de ton choix à cet endroit

.Range("CONF[#Headers]").Value = Array("A", "B", "C", "D", "E", "F") 

Le résultat dans le env.conf n'est pas bon, j'ai mis dans le colonne 2 du V6 le même nom partout, comme ça si je tape exemple : PACAC je me retrouve qu'avec CNP001 dans la colonne D dans le env.conf

J'ai une erreur à cette ligne

ListObjects.Add(Source:=Range("A1:F2"), HasHeaders:=xlYes).Name = "CONF" 'crŽe tableau structurŽ nommŽ CONF

autre chose, sur certaines lignes du env.conf à la dernière colonne je me retrouve avec 4 nombres au-lieu de 5 et comment enlever les lignes vides ?

Merci

Alors moi, je n'avais aucune erreur.

Si je comprends, il n'y a pas eu d'erreur sur la ligne Listobject la première fois. Je dirais que tu as probablement renommé la feuille et réessayé (tableau tjrs existant alors que feuille env.conf inexistante) ou fait une opération bloquant le circuit normal.

Pour tester (la création de env.conf), il faut supprimer la feuille à chaque fois !

J'ai repris le code où on l'avait arrêté et me suis focalisé sur les améliorations, pour qu'il devienne opérationnel. En colonne 4 de env.conf figurent les valeurs en colonne 2 de v6. Je ne vois pas de problème. Mais c'est à toi de renseigner en amont comme tu les veux sur v6.

Idem, 4 nombres car les saisies sur v6 sont incorrectes et commencent par un espace. Donc, il faut faire attention mais au cas où :

'remplacer avec ça dans la boucle for
Left(LTrim(shV6.Cells(Lcible, 3)), 5)
'D'ailleurs, je ne sais pas pourquoi, dans le cas des critères, il y a la ligne Left(shV6.Cells(Lcible, 3), 6) car à chaque fois il y a un nombre à 5 caractères dans la colonne 3 de v6

Pour les lignes vides, il suffit de les supprimer du tableau CSM. Mais au cas où :

If not cell.value = "" and InStr(txts, cell.Value) > 0 Then
If not cell.value = "" and InStr(txts, cell.Value) = 0 Then

à modifier à leur place respective.

Donc si je comprends bien tu essayes de crée un tableau nommé CONF dans env.conf

.ListObjects.Add(Source:=Range("A1:F2"), HasHeaders:=xlYes).Name = "CONF" 'crée tableau structuré nommé CONF

J'ai supprimé le env.conf et je relancer l'opération et malgré ça je me retrouve avec la même erreur ?

Ces deux lignes je les place ou exactement ?

If not cell.value = "" and InStr(txts, cell.Value) > 0 Then

If not cell.value = "" and InStr(txts, cell.Value) = 0 Then

Je pensait à un truc, dans la 2eme boucle ne serait-il pas plus facile de nommer les critères à rechercher (PACAC, CESTIF, TOOT... Ect ) ? faire un txts bis

Oui, c'est ça. Et si tu essayes en 2 étapes :

.ListObjects.Add(Source:=Range("A1:F2"), HasHeaders:=xlYes)
.ListObjects(1).Name = "CONF"

Les lignes remplacent les précédentes, on écarte seulement les cellules vides :

If not cell.value = "" and InStr(txts, cell.Value) > 0 Then

'à la place de If InStr(txts, cell.Value) > 0 Then (et idem pour = 0 après le Else)

Oui, c'est possible mais moi je ne connais pas vraiment l'objectif. Si tu es amené à avoir des catégories à regrouper, tu peux faire différentes clés (d'ailleurs, clé serait un meilleur nom de variable que txts). Si tu dois uniquement séparer les Dijon des autres, on peut rester comme ça.

Pour ta parfaite info (je reviens sur le cas des lignes vides qui ont causé ce petit enquiquinement), l'intérêt d'un tableau structuré est qu'il se restructure automatiquement. Donc pas besoin de lui attribuer plus de lignes qu'il n'a de valeurs car il se redimensionnera à l'ajout de nouvelles lignes. Ça permet de fiabiliser le travail.

Rechercher des sujets similaires à "copier onglet tri"