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

Salut spoutnik,

En fait, le problème ce n'est pas comment faire mais c'est quoi faire car j'ai l'impression que l'objectif n'est pas bien cadré.

Au départ, j'avais seulement connaissance de 4 ou 6 colonnes dans V6 et 6 colonnes dans env.conf mais je m'aperçois qu'il y en a 33. Et je ne sais pas ce qu'elles contiennent. On cherchait à déclencher un report de données par double-clic alors qu'il semble qu'on puisse le faire automatiquement. Tu veux que je te réponde sur un point précis (pour adapter la macro initiale) mais il faut voir le problème dans sa globalité car la stratégie changerait alors de fait. Si la solution de départ n'est plus la meilleure, pas besoin de la bricoler, il faut peut-être la changer...

Mais il faut que tu cernes le besoin et que tu me l'expliques, étape par étape, cas par cas.

Comme je le comprends, je me dis qu'il est possible de reporter toutes les lignes d'un coup et d'ensuite faire un tri sur env.conf (éventuellement chrono et sur la colonne 4).

Salut mec,

Désolé je t'ai pris tout ton temps, expliqué ça na jamais été mon point fort et comprendre non plus , la solution de départ n’était pas mauvaise je dirais même quelle était bonne !!!

Le V6.x est un fichier référentiel dans le quel les gens renseignent des nouvelles bases installés dans un futurs proches avec 4 colonnes, donc il est en mouvement ?

Nous étions parti sur la copie de la nouvelle ligne ajoutée dans le fichier dans le env.conf en formatant la ligne en 6 cellule ? la structure va rester la même

Dans la nouvelle ligne rajoutée à la colonne 4 c'est la valeur de l'environnement prod ou hors prod

l'objectif serait de prendre la valeur de la 4 cellule ou colonne de la nouvelle ligne et de la comparer à toutes les lignes déjà pressentes dans le fichier V6 et de les mettre également dans le env.conf avec la meme structure que nous avions fait ç.à.d en 6 colonne et en appliquant à chaque ligne le formatage que nous avons établi

     .Cells(NvL, 1).Value = "ENV;"
        .Cells(NvL, 2).Value = " ;"
        .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
        .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
        .Cells(NvL, 5).Value = "XDUAS_PORT;"
        .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)

Mais, la colonne 4 de la nouvelle ligne si sa valeur est égale à "REC DOP2R ou PRE DOP2R ou DEV Dijon ou TOTO DIJON" par exemple en copie dans le env.conf toutes correspondantes à ces valeurs si la valeur de la colonne 4 ne contient pas "REC DOP2R ou PRE DOP2R ou DEV Dijon ou TOTO DIJON" alors on copie toutes les lignes qui ne contiennent pas ces valeurs la

Est-ce plus clair pour toi ? pour info le V6 contient 150 lignes pour l'instant et il est amené à évolué

Franchement, c'est toujours pas très clair...

Mais voici ce qui me semble coller à ta demande, quoique je n'ai pas vraiment compris si tu cherchais à prendre les valeurs des colonnes 1 à 4 ou bien à rester sur le même modèle qu'avant (j'ai supposé qu'on restait) :

Sub EnvoiConf(Cible As Range)

Dim shV6 As Worksheet, shEnv As Worksheet, shVP as worksheet
Dim plageV6 as range, cell as range
Dim Lcible As Long, NvL As Long
Dim txts$

Set shV6 = Worksheets("V6.x")
Set shVP = Sheets("PARAM")
Set plagev6 = shV6.usedrange 'en considérant que commence en A1 et ne contient qu'un tableau
txtcherche = join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"))
Lcible = Cible.Row 'ligne en cours

If Worksheets(Worksheets.Count).Name = "env.conf" Then 'si env.conf existe
    Set shEnv = Sheets("env.conf") 'shEnv = env.conf 'affectation de shEnv
Else
    Set shEnv = Sheets.Add(After:=Worksheets(Worksheets.Count)) 'sinon, Creation d'un nouvel onglet
    shEnv.Name = "env.conf" 'on le renomme env.conf
End If

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
    if instr(txts, cells(Lcible, 4).value) > 0 then 'si ligne cliquée correspond au critère
        for each cell in plagev6.columns(4) 'parcourir chaque cellule de la plage
            if instr(txts, cell.value) > 0 then 'qd correspondance critère trouvée
                Lcible = cell.row  'Lcible prend valeur de la ligne en cours           
                .Cells(NvL, 1).Value = "ENV;"
                .Cells(NvL, 2).Value = " ;"
                .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
                .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" '
                .Cells(NvL, 5).Value = "XDUAS_PORT;"
                .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
                NvL = NvL + 1 'incrémentation de NvL pour suivant
            end if
        next cell
    else 'sinon, critère absent (idem mais quand critère absent)
        for each cell in plagev6.columns(4)
            if instr(txts, cell.value) = 0 then
                Lcible = cell.row
                .Cells(NvL, 1).Value = "ENV;"
                .Cells(NvL, 2).Value = " ;"
                .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
                .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
                .Cells(NvL, 5).Value = "XDUAS_PORT;"
                .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
                NvL = NvL + 1
            end if
        next cell
    end if
end with

End Sub

Il y a quelque chose qui me turlupine avec ce code, il est contre-intuitif. Tu ne m'en dis pas assez et j'ai l'impression qu'il pourrait y avoir plus simple, en tout automatique, sans double clic.

A noter que les lignes suivantes :

Set plagev6 = shV6.usedrange 'en considérant que commence en A1 et ne contient qu'un tableau
txtcherche = join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"))

sont à adapter avec les valeurs que tu cherches vraiment et la plage de ta feuille V6.

Non, je ne souhaite pas prendre la colonne 1 à 4, c'est juste un code que j'ai trouvé sur le net sur le quel je suis entrain de faire des modification pour voir si je peux l'adapter à ma sauce !

sinon je reste sur le meme modèle qu'avant je prends la colonne 2 et 3 puis je les range dans le env.conf dans la cellule 4 et 6 et en ajoutant les valeurs Fixe comme en l'avait fait, mais au-lieu de a faire uniquement à la ligne ajoutée on le fait à toutes lignes si celles-ci correspondent à la 4 colonne de la lignes ajoutée

c'est plus clair ?

Oui, limpide. Et bien, normalement, c'est ce que fait le code (toujours avec le double-clic).

J'ai une d'incompatibilité de type à ce niveau de ton code !

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

Oups, j'ai renommé la variable pour qu'elle soit plus courte :

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

devient

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

Désolé, j'ai encore la même erreur, incompatibilité de type

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

J'essaye de comprendre la ligne suivante de ton code :

Else 'sinon, critère absent (idem mais quand critère absent)
For Each cell In plageV6.Columns(4)
If InStr(txts, cell.Value) = 0 Then

Dans la 1eme boucle, tu lui dis si critère est > 0 Then 'qd correspondance critère trouvée

et pour un critère qui est different de celui rentré dans la colonne 4 = 0 Then 'critère absent

Je suis pour comprendre =0 ça veut dire qu'il a une critère sauf qu'il est différent de ce que t'as mis dans la variable txts ?

Ok, la commande ou la syntaxe n'est pas bonne je pense

Quand je mets un critère qui correspond, cette ligne sort en erreur If InStr(txts, cell.Value) > 0

Et si je mets un critère absent dans le txts la ligne suivante sort en erreur If InStr(txts, cell.Value) = 0

Mais d’après ton code c'est que je veux tout à fait

Cdt,

Les lignes que j'ai rajoutées pour le code sont notamment :

Set plagev6 = shV6.usedrange 'en considérant que commence en A1 et ne contient qu'un tableau
txts = join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"))

Il faut adapter à ta zone à toi :

Set plagev6 = shV6.range("mazonederecherchecomplete") 'exemple : "A1:D155"

En principe, c'est ça la source de l'erreur et ça devrait marcher si la zone est bien définie mais tu peux quand même t'assurer que

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

contient bien join et les valeurs que tu recherches.

Normalement, la fonction Instr est correcte : elle recherche la valeur de cell dans la variable txts et renvoie la position de correspondance quand elle trouve, et 0 quand elle ne trouve pas. Là, la recherche est effectuée sur chaque cellule d'une colonne qui contient un autre type que du texte et ça provoque l'erreur (tu remarques que ça ne la provoque pas au 1er if instr avant le for each).

Cdlt,

Oui oui voici les deux lignes :

Set plageV6 = shV6.Range("D2:D155") 'en considérant que commence en A1 et ne contient qu'un tableau
txts = Join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"))

Par contre si je ne veux pas définir la plage ("D2:D200"), car demain ça peut devenir 250 ou 300 ou autres...etc, est-ce que je peux le laisser vide ?

En mettant les deux lignes en haut parce que les arguments que je recherche dans txts sont entre D2 et D155, l'erreur est toujours au même endroit

If InStr(txts, cell.Value) > 0 => incompatibilité de type

If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne

Set NvLCell = txts, Cells(Lcible, 4).Value ' Cellule 4 de la nouvelle ligne pour qu'il parcourt de la D2 à la dernière ligne renseigné dans la colonne 4

Set plageV6 = shV6.UsedRange("D2:NvLCell")

Peut-on lui demander de faire ça ? je ne sais mème pas si la syntaxe est bonne !

Alors, il faut si possible créer un tableau structuré sur ta feuille v6, qui commence en A1 (A1 car avec des en-têtes, j'imagine donc A1:D155). Donc tu sélectionnes toute ta zone avec les valeurs (en-tetes comprises)/tu vas sur volet Insertion/Tableau/avec en-têtes puis tu le renommes (ex : MesInfos) et tu choisis le format que tu veux.

Ensuite dans le code tu modifies :

Set plagev6 = shV6.range("MesInfos") 'exemple : "A2:D155"

Ça permet de travailler en dynamique et plus en références statiques.

Est-ce que tu as mis le $ volontairement ?

Dim shV6 As Worksheet, shEnv As Worksheet, shVP As Worksheet
Dim plageV6 As Range, cell As Range
Dim Lcible As Long, NvL As Long
Dim txts$


Tu veux que je renomme ça en mettant toto par exemple ? Si c'est ça qu'il faut renommer ça ne fonctionne pas ?


image image



Le $ c'est pour les chaines de caractères, c'est normal. % pour les entiers, # pour les réels.

Une fois créé, tu pourras le renommer toujours sur le volet insertion. Je ne sais plus exactement où car ça change suivant les versions mais tu verras une zone d'entrée avec Renommer (en général, c'est vers la gauche ou la droite) et tu mets le nom (toto par exemple ou infos aussi, ça parait bien). Là, tu as essayé de renommer à l'endroit qui fixe l'adresse du tableau .

Quand il me dit incompatibilité de type à ce niveau If InStr(txts, cell.Value) > 1 ça veut dire qu'il ne reconnait pas le 1 comme un texte ?

Ne y a t-il pas un problème lors de la déclaration de la variable txts ?

Ok c'est fait je l'ai renommé en CSM, par contre tu vas être déçu If InStr(txts, cell.Value) > 1 Then 'qd correspondance critère trouvée erreur de typage encore une fois

Sub EnvoiConf(Cible As Range)

Dim shV6 As Worksheet, shEnv As Worksheet, shVP As Worksheet
Dim plageV6 As Range, cell As Range
Dim Lcible As Long, NvL As Long
Dim txts$

Set shV6 = Worksheets("V6.x")
Set shVP = Sheets("Param")

Set plageV6 = shV6.Range("CSM") 'en considérant que commence en A1 et ne contient qu'un tableau
txts = Join(Array("DIJON DOP2R", "DEV Dijon", "CSH DIJON", "CNE DOP2R"))

Lcible = Cible.Row 'ligne en cours

If Worksheets(Worksheets.Count).Name = "env.conf" Then 'si env.conf existe
    Set shEnv = Sheets("env.conf") 'shEnv = env.conf 'affectation de shEnv
Else
    Set shEnv = Sheets.Add(After:=Worksheets(Worksheets.Count)) 'sinon, Creation d'un nouvel onglet
    shEnv.Name = "env.conf" 'on le renomme env.conf
End If

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
    If InStr(txts, Cells(Lcible, 4).Value) > 0 Then 'si ligne cliquée correspond au critère
        For Each cell In plageV6.Columns(4) 'parcourir chaque cellule de la plage

                Lcible = cell.Row  'Lcible prend valeur de la ligne en cours
                .Cells(NvL, 1).Value = "ENV;"
                .Cells(NvL, 2).Value = " ;"
                .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
                .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" '
                .Cells(NvL, 5).Value = "XDUAS_PORT;"
                .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
                NvL = NvL + 1 'incrémentation de NvL pour suivant
            End If
        Next cell
    Else 'sinon, critère absent (idem mais quand critère absent)
        For Each cell In plageV6.Columns(4)
           If InStr(txts, cell.Value) = 0 Then
                Lcible = cell.Row
                .Cells(NvL, 1).Value = "ENV;"
                .Cells(NvL, 2).Value = " ;"
                .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
                .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
                .Cells(NvL, 5).Value = "XDUAS_PORT;"
                .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
                NvL = NvL + 1
            End If
        Next cell
    End If
End With

End Sub

Non txts, c'est de type string donc rien à déclarer. Mais si tu veux, tu peux changer toutes les occurrences de txts par autre chose.

Le problème vient de cell.value normalement. Si la valeur de cell n'est pas de type string il y a incompatibilité. Je pense que ça vient de là.

En tout cas, le code teste sur la colonne 4 du tableau donc (enfin de plagev6) donc si la 4è colonne de plage v6 contient autre chose que du texte, ça bloque. D'où l'intérêt du tableau pour bien encadrer la zone de recherche. Alors, on pourra dire :

for each cell in Range("toto[nomdemacolonne4]")

il n'y aura plus de problème.

Rechercher des sujets similaires à "copier onglet tri"