Tableau qui insert sur d'autres feuille

Bonjour,

Je suis entrain d'essayer de faire un programme qui me dépasse peut-être un peu, mais il faudrait que j'y arrive pour me permettre d'avancer.

Mon classeur est fourni d'une feuille "tableau insert" et plusieurs autres feuilles. Toutes les feuilles sont identiques j'aimerai essayer de faire un bouton qui fait :

Si A1("tableau insert") = (recherche des valeurs A1 des autres onglets)

Alors copier A1("tableau insert"), coller sur la case A sur la première ligne non vide (de l'onglet trouvé)

Sinon (si rien trouvé) ne rien faire

Est ce que vous pensez ça possible ?

Bonjour,

Voici un essai de code en fonction de ce que j'ai compris :

Sub test()
dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("A1").value 'vcherchee vaut valeur de A1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("A1").value = vcherchee then 'si sa cellule A1 vaut vcherchee
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .cells(nvl, "A").value = vcherchee 'cellule à la ligne nvl en colonne A vaut vcherchee
                'exit for '<<< activer si on arrete la boucle dès qu'A1 est trouvé sur un onglet 'sortie boucle
            end if
        end if
    end with
next ws 'feuille suivante
end sub

Cdlt,

Merci pour votre réponse,

Est ce que vous pouvez mettre des annotations pour que je puisse savoir ce que fait chaque ligne de code ou alors certaine partie ?

Cordialement

Bonjour,

J'ai rajouté des commentaires dans le code directement.

Dites-moi si c'est assez clair.

Cdlt,

Bonjour,

Je vous remercie énormément.

Question, si maintenant j'aimerais copier la ligne de la cellule A1 (tableau insert) et coller dans la dernière ligne vide de l'onglet trouvé, est ce que je peux juste faire quelque chose comme ça ?

Sub test()
dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("A1").value 'vcherchee vaut valeur de A1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("A1").value = vcherchee 'si sa cellule A1 vaut vcherchee
                Range("A1:A6").Select then 'Validation de votre part ? 
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .cells(nvl, "A").value = vcherchee 'cellule à la ligne nvl en colonne A vaut vcherchee
                'exit for '<<< activer si on arrete la boucle dès qu'A1 est trouvé sur un onglet 'sortie boucle
            end if
        end if
    end with
next ws 'feuille suivante
end sub

Bonjour,

Voici une possibilité :

Sub test()
dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("A1").value 'vcherchee vaut valeur de A1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("A1").value = vcherchee 'si sa cellule A1 vaut vcherchee
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .range("A:F").rows(nvl).value = application.transpose(sheets("tableau insert").Range("A1:A6").value)
                'Anvl:Fnvl vaut A1:A6 de "tableau insert" (avec transposition)
                'exit for '<<< activer si on arrete la boucle dès qu'A1 est trouvé sur un onglet 'sortie boucle
            end if
        end if
    end with
next ws 'feuille suivante
end sub

Il faut bien cibler la feuille "tableau insert" (la source) pour que le code fonctionne correctement. Sinon, sans préciser la feuille, VBA considère qu'on prend A1:A6 de la feuille active, ce qui peut produire un mauvais résultat si le code n'est pas exécuté depuis "tableau insert".

Aussi, il faut transposer les valeurs ici car A1:A6 est une place verticale et la destination est horizontale.

Cdlt,

Bonjour,

Je ne comprend pas pourquoi dans mon excel votre programme ne fonctionne pas ... :'(

Merci :)

6test-pf.zip (398.28 Ko)

Je ne vais pas ouvrir le fichier à moins que ce soit nécessaire...

Il faut coller le code dans un module normal :

- ouvrir Visual Basic (alt + F11)

- menu "Insertion"/Module

- double-cliquer sur le module créé et coller le code dans l'éditeur.

Ensuite, il faut exécuter le code :

- avec la touche F5 depuis l'éditeur ;

- ou en appuyant sur ce bouton préalablement inséré sur la feuille depuis l'onglet développeur auquel il aura été affecté la macro (clic droit sur le bouton/affecter une macro).

En cas de problème, merci de me dire ce qui ne va pas et en cas de bug merci de m'indiquer la ligne (surlignée en jaune lors du débogage) ainsi que le message d'erreur...

Cdlt,

image

Donc j'ai supposé qu'il manquait un "then a la fin du "Vcherche"

Mais quand je fais la manip, je me retrouve avec la même manipulation qu'avant, ce qui veux dire que ça me copie que la case A1

Il manquait bien un then...

Ici, ce sont les valeurs de A1:A6 (de la feuille "tableau insert" >>> dont il faudrait raccourcir le nom au passage) qui sont copiées. S'il n'y a rien en A2:A6, c'est normal que rien ne soit reporté sur la destination...

D'accord je commence à comprendre mieux le programme..

Bon du coup j'ai transposer ma ligne en colonne, j'ai fais le programme et il marche je vous en remercie !

Et maintenant, si je veux mettre qu'il fasse le même travail pour d'autre colonne (étant donnée que nous avons transposé les valeurs)

Est ce que je fais un truc comme ça ?

Sub test()
dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("A1").value 'vcherchee vaut valeur de A1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("A1").value = vcherchee 'si sa cellule A1 vaut vcherchee
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .range("A:F").rows(nvl).value = application.transpose(sheets("tableau insert").Range("A1:A6").value)
                'Anvl:Fnvl vaut A1:A6 de "tableau insert" (avec transposition)
                'exit for '<<< activer si on arrete la boucle dès qu'A1 est trouvé sur un onglet 'sortie boucle
            end if
        end if
    end with
next ws 'feuille suivante

dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("B1").value 'vcherchee vaut valeur de B1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("B1").value = vcherchee 'si sa cellule B1 vaut vcherchee
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .range("A:F").rows(nvl).value = application.transpose(sheets("tableau insert").Range("B1:B6").value)
                'Anvl:Fnvl vaut B1:B6 de "tableau insert" (avec transposition)
                'exit for '<<< activer si on arrete la boucle dès qu'B1 est trouvé sur un onglet 'sortie boucle
            end if
        end if
    end with
next ws 'feuille suivante
end sub

On est pas obligé de transposer, c'est plus simple d'éviter une transposition. Seulement, dans votre essai, vous avez mis A1:A6 et vous vouliez alimenter la ligne donc j'ai transposé logiquement.

Il vaut mieux éviter d'avoir des boucles successives qui effectuent le même traitement. Le mieux est de tout passer dans la même boucle.

Mais que voulez-vous faire exactement ?

Je crois que j'ai merdé en vous écrivant "A1:A6" au lien de "A1:F1"

En soit le but final sera que le "tableau insert" me permette de remplir automatiquement (avec un bouton) les autres onglets avec les données dans le tableau insert.

D'accord, dans ce cas, ce code sera plus approprié pour le moment :

Sub test()
dim vcherchee, ws as worksheet, nvl as long 'déclaration variables
vcherchee = sheets("tableau insert").range("A1").value 'vcherchee vaut valeur de A1 de "tableau insert"
for each ws in worksheets 'pour chaque feuille du classeur
    with ws 'avec la feuille en cours
        if .name <> "tableau insert" then 'si son nom est différent de "tableau insert"
            if .range("A1").value = vcherchee 'si sa cellule A1 vaut vcherchee
                nvl = .cells(.rows.count, 1).end(xlup).row + 1 'première ligne vide (dernière non vide + 1)
                .range("A:F").rows(nvl).value = sheets("tableau insert").Range("A1:F1").value
            end if
        end if
    end with
next ws 'feuille suivante
end sub

Oui mais comment exactement ? Au compte-goutte ou vous voulez ventiler tout le contenu de "tableau insert" sur les autres onglets en fonction du contenu en colonne A ?

Oui mais comment exactement ? Au compte-goutte ou vous voulez ventiler tout le contenu de "tableau insert" sur les autres onglets en fonction du contenu en colonne A ?
Je pense que tout ventiler est le mieux.
Pouvoir mettre mes données dans mon "tableau insert" et de pouvoir avec un bouton, mettre toutes les données au bon endroit.

Je suis vraiment impressionnée par ce que vous faite..

Voici un essai alors pour ventiler et le cas échéant créer les feuilles de destination.

Le tout repose sur des tableaux structurés, de mon point de vue impératifs pour ce genre d'opération. Celui de la feuille "tableau insert" doit être nommé "Base" pour la bonne exécution du code.

6test-pf.xlsm (235.06 Ko)

Cdlt,

Bonjour…

Lu ailleurs mais pensé par beaucoup : « arrggh, les tableaux structurés

Ma façon simplissime au point de vue syntaxe donc compréhension d’en traiter certaines demandes est décrite ici https://forum.excel-pratique.com/s/goto/973625 ainsi qu'avec les explications en dessous.

Voici une rapide adaptation en précisant que la gestion du tableau de données se limite à un nombre très limité de feuilles (2 ici). J’ai supprimé les MFC car vouloir enjoliver les choses amène toujours de nouvelles actions à programmer (Formules ou VBA).

Merci pour vos réponse !

3GB : Est ce qu'il serait possible de ne pas créer de nouvelle fiche ?

Bonjour à tous,

Je ne comprends pas ta question ? N'était-ce pas l'objectif de répartir les données sur différents onglets en fonction de la valeur en colonne A ?

La création est effectuée uniquement lorsque la feuille correspondante n'existe pas afin de garantir une homogénéité du modèle mais elle ne se produit pas lorsque la feuille existe déjà...

Les nouvelles données sont collées à la suite des précédentes donc il faut activer, pour une utilisation normale, la macro RAZ qui remet à jour le tableau Base.

La macro supp (bouton ) ne sert qu'à faire des tests...

Cdlt,

Rechercher des sujets similaires à "tableau qui insert feuille"