Ne pas répéter le code

Bonjour le Forum,

Me revoilà avec une nouvelle question.

je cherche à transférer les données d'un tableau en feuille 1 dans leur onglet respectif. ex les ligne A1, A6 et A11 dans l'onglet 2, A2, A7 et A12 dans l'onglet 3....

Je l'ai fais rapidement pour que ça fonctionne en donnant toutes les instructions mais je souhaiterais savoir si on peut le simplifier en lui faisant faire "automatiquement".

Sheets(NomOnglet).Range("A5+1:G5+1").Copy
Sheets(2+1).Range("A10").PasteSpecial Paste:=xlPasteValues
Sheets(NomOnglet).Range("A37+1:G37+1").Copy
Sheets(2+1).Range("A12").PasteSpecial Paste:=xlPasteValues
Sheets(NomOnglet).Range("A69+1:G69+1").Copy
Sheets(2+1).Range("A11").PasteSpecial Paste:=xlPasteValues

j'ai mis des +1 là ou je voudrais incrémenter les valeurs. J'espère que c'est lisible et compréhensible.

Je reste disponible si vous avez besoin de plus d'explication.

Je vous joint le fichier si ça peut vous aider.

Merci pour votre aide.

Bonjour

Je vous invite à reprendre votre fichier et relire ce que vous écrivez.

De mon coté je ne comprends pas ce que vous voulez.
Pourquoi A5 et pas A3 ?
Nomonglet correspond à quoi ?
sheets(2 +1 ) ? = feuil3 dans le fichier ?

Bonjour Dan,

Tout d'abord merci pour votre aide.

- A5 car c'est la position à laquelle commence les valeurs de mesures. En A3 et A4 apparaitrons des valeurs de contrôle que nous n'avons pas besoin de reporter.

- "NomOnglet" correspond au nom de ma variable énoncée plus haut dans mon code. J'aurais dû en effet la modifier pour plus de clarté, désolé.

- Pour sheets(2 +1 ), vous avez bien compris, il s'agit bien de passer de la "feuil2" à la "feuil3" du classeur.

L'idée serait de pouvoir faire ce qui suit en incrémentant les positions et les numéros de "feuil" afin de ne pas répéter le code Xfois

Sheets(1).Range("A5:G5").Copy
Sheets(2).Range("A10").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A37:G37").Copy
Sheets(2).Range("A12").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A69:G69").Copy
Sheets(2).Range("A11").PasteSpecial Paste:=xlPasteValues

Sheets(1).Range("A6:G6").Copy
Sheets(3).Range("A10").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A38:G38").Copy
Sheets(3).Range("A12").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A70:G70").Copy
Sheets(3).Range("A11").PasteSpecial Paste:=xlPasteValues

Sheets(1).Range("A7:G7").Copy
Sheets(4).Range("A10").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A39:G39").Copy
Sheets(4).Range("A12").PasteSpecial Paste:=xlPasteValues
Sheets(1).Range("A71:G71").Copy
Sheets(4).Range("A11").PasteSpecial Paste:=xlPasteValues

Je vous joint de nouveau le fichier avec la colonne "Target" modifiée (je ne vois pas quoi modifier de plus).

J'espère que tout ceci vous paraitra plus clair cependant n'hésitez pas à me faire savoir si certains points sont encore flous

Merci

Vos explications ne sont pas claires.

Ce que je comprends :
feuil2 pour les valeurs C
feuil3 pour les valeurs D
feuil4 pour les valeurs E
Vous copiez chaque ligne en fonction de la valeur target en commençant par la valeur C jusque H en colonne A ?
Au final cela va donnez une copie sur 6 feuilles ?

Non je prends toutes les valeurs affichées de la ligne soit de la colonne A à G. Ce qui donne pour le ligne 5 de la "feuil1" par exemple la plage à extraire ("A5:G5").

Je souhaite coller cette plage extraite dans les colonnes A à G de la ligne 10 de la "feuil2".

Il y a 3 lignes par "feuil" ce qui correspond aux 3 Targets testées (57, 146 et 124).

La plage ("A6:G6") de la "feuil1" serait donc à coller dans les colonnes A à G de la ligne 10 de la "feuil3".

La plage ("A38:G38") de la "feuil1" serait donc à coller dans les colonnes A à G de la ligne 12 de la "feuil3".

La plage ("A70:G70") de la "feuil1" serait donc à coller dans les colonnes A à G de la ligne 11 de la "feuil3".

Au final il y aura donc 30 feuilles.

Est-ce plus clair?

Non je prends toutes les valeurs affichées de la ligne soit de la colonne A à G. Ce qui donne pour le ligne 5 de la "feuil1" par exemple la plage à extraire ("A5:G5").

Je pense que vous n'avez pas compris ce que je vous écrit.
Je ne vous parle pas de colonne à copier mais des lettres en colonne A qui vont de C à H (donc C01 à H01, C02....). Pour chaque lettre vous copiez les lignes de A à G dans chaque feuille en fonction de la valeur target. Donc 3 target différents = 3 lignes dans chaque feuille

Quand vous écrivez 30 feuilles je ne vois pas comment vous arrivez à cela.

Autre question :
- est-ce que toutes vos feuilles sont déjà créées à l'avance ou pas ?. Dans votre fichier on n'a 6 feuilles
- est-ce qu'il n'y a toujours que 3 target et si oui, les valeurs sont toujours -57, 146, 124 ?

A l'exception de A01 et B01 qui ne sont pas copié sinon, oui toutes les autres linges seront copiées de C01 a H08 oui. Ne vous fiez pas à la répétions de la lettre c'est une indication de position. La valeur qui nous intéresse est le valeur de la colonne "Sample" qui représente l'ID unique la mesure (voir fichier). Il y donc bien que 3 lignes dans chaque feuille.

ID: 1 target 57, ID:1 target 146, ID:1 target 124 dans la "feuil2",

ID: 2 target 57, ID:2 target 146, ID:2 target 124 dans la "feuil3"

ect.

Les 6 onglet dans le fichier sont un exemple de ce qui est attendu. dans le nouveau fichier je vous ai mis les 30. Le code pour lequel je vous demande de l'aide n'est qu'une partie de la macro. La création et la mise en page des 29 autres onglets est une partie du code qui fonctionne. Ils sont en effet créé en amont dans le code. Ma macro est complétement fonctionnelle, je souhaiterais la perfectionner et surtout la simplifier en évitant la répétition de toutes ces lignes qui interviennent à la toute fin de la macro.

Si vous mettez un fichier partiel, ce n'est pas sûr que cela va fonctionner

Mais dans votre fichier mettre ce code dans un module

Sub test()
Dim feuille As Byte
Dim j As Integer, dlgf As Integer

With ActiveSheet
    For j = 5 To .Range("A" & Rows.Count).End(xlUp).Row
        feuille = Asc(Left(.Range("A" & j), 1)) - 64
        If feuille > 2 Then
            dlgf = Sheets(feuille - 1).Range("A" & Rows.Count).End(xlUp).Row + 1
            If dlgf < 10 Then dlgf = 10
            If .Range("C" & j) <> Sheets(feuille - 1).Range("C" & dlgf - 1) Then
                .Range("A" & j & ":G" & j).Copy
                Sheets(feuille - 1).Range("A" & dlgf).PasteSpecial Paste:=xlPasteValues
            End If
        End If
    Next j
End With
End Sub

les colonnes A et C doivent être triées comme dans votre fichier posté

Si ok -->

Cordialement

Merci Dan pour votre réponse. je vais tester et vous tenir au courant.

oui la colonne A sera toujours triée de ce manière.

ça ne fonctionne malheureusement pas complétement. Voici l'erreur qui apparait.

erreur argument erreur argument bis

Savez vous à quoi elle correspond?

Voici ma macro complète, peut être que cela pourra vous aider. Il est en .txt car je n'ai pas réussi a mettre en .bas.

5macro-dd.txt (16.27 Ko)

Pas besoin de remettre chaque fois votre fichier s'il ne vous ne changez rien. j'ai le premier qui sert actuellement

ça ne fonctionne malheureusement pas complétement. Voici l'erreur qui apparait.

est-ce vos feuilles sont créés à l'avance comme vous avez dans votre fichier précédent ?

L'instruction sur fond jaune vous renvoie un numéro de feuille par rapport à la lettre
exemple pour C01, cela va vous renvoyer 3, pour D01 --> 4

Je regarde avec votre code

Edit : bah oui évidemment maintenant que vous avez donné votre code. Ce que je vous ai proposé est incorrect

Questions :
1. Est-ce que votre feuille 1 avoir de nouvelles valeurs et du coup, vous devriez réactualiser les feuilles 1 à 30 ?
2. Est ce que dans votre fichier A02 doit bien aller dans la feuille 7 ?

Bonjour Dan,

1.La feuille 1 a toutes ses valeurs rien ne sera ajouter par la suite.

2.A02 doit toujours aller en feuille 7 oui. La valeur de la cellule A11 (ici = "A02") à t elle une importance ou est-ce juste la position en ligne 11 qui importe?

Bonjour,

2.A02 doit toujours aller en feuille 7 oui. La valeur de la cellule A11 (ici = "A02") à t elle une importance ou est-ce juste la position en ligne 11 qui importe?

Avec votre fichier plus complet, là j'ai compris ce que vous vouliez (enfin je pense...). La colonne B ce sont les noms de vos feuilles
Pas d'importance pour la position de la valeur A02

Je n'ai peut être pas bien compris quand vous m'avez parlé de trie. Les valeurs de la colonne A doivent toujours être exactement celle-ci?

A priori, vu que l'on se sert à la colonne B pour le nom des feuilles, on peut laisser tomber cette aspect Tri
Pour les valeurs de la colonne A, la réponse est non.


Faites ceci dans votre fichier

1. code dd_TL_V3_2() : supprimez ce qui est entre le commentaire la ligne 'Transfert les données patients dans les onglets" et le END SUB
2. A cet endroit, mettez ceci

Call tranfert_donnees

3. En dessous du END SUB de la macro , collez le code ci-dessous :

Sub tranfert_donnees()
Dim feuille
Dim ligne As Byte
Dim j As Integer

With Worksheets("Feuil1")
    For j = 5 To .Range("A" & Rows.Count).End(xlUp).Row
        If IsNumeric(Range("B" & j)) Then
            feuille = .Range("B" & j)
            ligne = WorksheetFunction.Count(Sheets(CStr(feuille)).Range("C10:C12")) + 10
            If .Range("C" & j) <> Sheets(CStr(feuille)).Range("C" & ligne - 1) Then
                .Range("A" & j & ":G" & j).Copy
                Sheets(CStr(feuille)).Range("A" & ligne).PasteSpecial Paste:=xlPasteValues
            End If
            If ligne > 12 Then Exit Sub
        End If
    Next j
End With
End Sub

Faite un test

De mon coté je regarde pour simplifier votre premier code


EDIT : je vois un souci dans la création des feuilles. Dans votre fichier B10 à la valeur 1. Donc on passe de 5 à 7. C'est une erreur ou pas ?.

J'ai fais le test et malheureusement j'ai encor une erreur, "erreur9 l'indice n'appartient pas à la sélection". voici une image qui montre la ligne concernée et la façon dont j'ai appliqué vos recommandations. Est-ce bien comme ça que vous vouliez que j'applique votre code?

erreur inice selection

En ce qui concerne B10, je ne vois pas l'erreur. la ligne B10 contient les valeurs suivantes de mon coté :

B108-1240,008NO19756

Les onglets semblent tous bien remplis (avec le code répété)

voici une image qui montre la ligne concernée et la façon dont j'ai appliqué vos recommandations. Est-ce bien comme ça que vous vouliez que j'applique votre code?

Oui c'est bien comme cela.
Avez-vous bien testé sur le dernier fichier que vous avez posté ?

Quelle est la valeur de "feuille" quand vous avez le bug ?
Passez votre souris sur le mot "feuille" pour le voir.

Oui c'est bien sur le dernier fichier envoyé.

La valeur de "feuille" est "temoin 1".

J'ai l'impression , qu'il arrive à remplir les lignes 10 des 30 onglets mais quand il doit revenir à la feuille "1" pour remplir la ligne 11 il bloque.

N'hésitez pas à me dire si vous voulez des image des fichier ou autre.

Merci en tout cas pour tout le temps que vous prenez pour m'aider.

J'ai l'impression , qu'il arrive à remplir les lignes 10 des 30 onglets mais quand il doit revenir à la feuille "1" pour remplir la ligne 11 il bloque.

Oui j'ai aussi eu ce souci

J'ai simplifié le code complet et subdivisé en trois parties
Ce sera plus court si je vous envoie le fichier tel quel

Faites un test. si souci on repartira de cette version

si ok

cordialement

Bonjour Dan,

Désolé pour hier, je n'ai pas du tout eu le temps de regarder le fichier.

Je l'ai testé ce matin et en effet sur le fichier que vous m'avez envoyé cela fonctionne. J'ai juste remplacé au début la Sub transfert le With Worksheets("Feuil1") en Worksheets(nom onglet) pour que cela fonctionne indépendamment du nom de la feuille 1.

Je rencontre cependant un problème auquel je ne pensais vraiment pas être confronté. Mon réel fichier de départ est un .csv mais il contient un certain nombre de données confidentielles d'où le fait que je vous ai envoyé un tableau déjà trié. Bien que les tableaux en feuille 1 soient strictement identique, il semblerait que dans cette toute première partie de code (mise en forme du fichier .csv pour arriver au tableau trié) quelque chose perturbe le transfert des données. Ce qui est très étrange c'est que votre macro fonctionne bien, pas d’arrêt, ni d'erreur mais les cellules des lignes 10 11 et 12 restent vides. J'ai essayé de subdiviser encore le code en mettant un appel juste avant le création de l'onglet 2. Une nouvelle fois la macro s'applique à priori sans soucis mais les cases restent vides.

Je considère que votre solution fonctionne et vous remercie une nouvelle fois pour tout le temps que vous avez consacré à mon problème. Si le cœur vous en dit je vous remet le fichier avec en module 2 le début du code. Si vous voulez y jeter un œil et voir si vous voyez un problème. Sinon, je comprends que tous ces changements soient pénibles et comprendrai parfaitement que vous vous arrêtiez là.

Je vous renouvelle encore une fois tous mes remerciements pour votre aide.

Bonjour,

Je l'ai testé ce matin et en effet sur le fichier que vous m'avez envoyé cela fonctionne. J'ai juste remplacé au début la Sub transfert le With Worksheets("Feuil1") en Worksheets(nom onglet) pour que cela fonctionne indépendamment du nom de la feuille 1.

Faites plus simple. Là pas besoin de variable. Supprimez "nomonglet" et mettez comme ceci :

With Worksheets(1)

Je rencontre cependant un problème auquel je ne pensais vraiment pas être confronté. Mon réel fichier de départ est un .csv

Je peux regarder
C'est votre fichier CSV qui vous pose le souci.
Si vous me donnez le fichier je peux regarder.

Sinon séparez déjà le code de transformation du CVS en XLS. Là vous avez mis tout en un seul

Rechercher des sujets similaires à "pas repeter code"