Rechercher et transférer les données d'un tableau à un autre

Bonjour à tous,

J'ai appris Excel et un peu de VBA il y a 30 ans, mais j'avoue avoir oublié et Excel a pas mal évolué depuis. Je ne sais plus trop comment faire la chose suivante.

J'ai 1 page "Dashboard" dans lequel je voudrais piloter des événements qui sont dans 12 autres feuilles, une par mois. Dans chaque feuille il y a un agenda ligne par ligne dans lesquels je décris des événements culturels.

Je tente de faire une macro qui va chercher dans une feuille, mettons "jan" pour Janvier, les titres et les dates des événements. Mais ceux-ci ne sont pas les uns sous les autres, il peut y avoir des lignes vides, tout dépend de la date, s'il y a un événement ou pas.

Ma question : comment faire une boucle qui passe d'une ligne à l'autre, test si la cellule est pleine, puis la copie dans le dashboard, et si elle est vide, descendre jusqu'à la prochaine case pleine ?

Merci beaucoup de votre aide.

Bonjour et bienvenue,

Merci de joindre un fichier à ta demande pour une aide adaptée du forum.

Cdlt.

Oui, le voilà.

Merci.

Bonjour Vania,

Comme le dit Jean-Eric avec un fichier c'est plus simple...

Sinon je dirai : (J'ai pas de PC sur moi, je fais de tête soyez indulgent)

Sub Remplissage_DashBoard()

'LES VARIABLES
Dim FeuilleDash as worksheet
Dim LigneDash as integer 
Dim LesFeuillesDesMois as worksheet
Dim DernièreLigneDeLaFeuille as integer

'DEFINITION DE LA FEUILLE DASH
Set FeuilleDash = worksheets("Dashboard")
LigneDash = 2 'Si tu veux commencer par la ligne 2

'NETTOYAGE ANCIENNE DONNEES
FeuilleDash.range("A2:" & chr(64 + FeuilleDash.cells(1,FeuilleDash.Column.Count).End(XlToLeft).column & FeuilleDash.Range("A65535").End(XlUp).row).ClearContents

'REMPLISSAGE
'Pour toutes les feuilles du fichier
For each LesFeuillesDesMois in ThisWorkbook.Worksheets
           'Si le nom est différent de Dashboars
           If LesFeuillesDesMois.name <> "Dashboard" then
                      'On cherche la dernière ligne                     
                       DernièreLigneDeLaFeuille = LesFeuillesDesMois.range("A65535").End(XlUp).row
                      'Boucle sur toutes les lignes
                      For i = 1 to DernièreLigneDeLaFeuille 
                                 'Si la colonne A de cette cellule n'est pas vide                         
                                  If LesFeuillesDesMois.cells(i,"A") <> "" then 'Si la donnée que tu cherches est en colonne A
                                              LesFeuillesDesMois.rows(i).EntireRow.Copy
                                              FeuilleDash.rows(LigneDash).EntireRow.Select
                                              Sélection.PasteSpecial
                                              LigneDash = LigneDash + 1
                                 End if
                      Next
           End if
Next

'NETTOYAGE MEMOIRE EXCEL
Set FeuilleDash = Nothing

End Sub

A tester maintenant

A bientot

Je viens de voir ton fichier, je reprend le code

Sub Remplissage_DashBoard() 
'LES VARIABLES
Dim FeuilDash as worksheet
Dim LigneDash as integer
Dim LaFeuilleMois as worksheet
Dim LigneMois as integer

'DEFINITION DASH
Set FeuilDash = ThisWorkbook.sheets("Dashboard")
LigneDash = 6

'NETTOYAGE
FeuilDash.range("B" & LigneDash & ":C" & FeuilDash.Range("B65535").End(XlUp).row).ClearContents 

'DEFINITION FEUILLE MOIS
Set LaFeuilleMois = worksheets(left(FeuilDash.cells(4,"B"),3))
LigneMois = LaFeuilleMois.Range("B65535").End(XlUp).row

'REMPLISSAGE
For i = 4 to LigneMois
     If LaFeuilleMois.cells(i,"C") <> "" then
          FeuilDash.cells(LigneDash,"B") = LaFeuilleMois.cells(i,"B")
          FeuilDash.cells(LigneDash,"C") = LaFeuilleMois.cells(i,"C")
          LigneDash = LigneDash + 1
    End if
Next

'VIDE LA MEMOIRE EXCEL
Set FeuilleDash = nothing
Set LaFeuilleMois  = nothing

End sub

A tester

Bonjour Moul,

Je viens d'essayer la macro, j'avoue que je n'y comprends pas grand chose à toutes ces variables, mais ça marche du feu de Dieu !

Mille mercis. J'imagine que je n'ai plus qu'à copier cette macro, en changeant son nom, pour chacune des feuilles, non ?

Déjà c'est fantastique ! Vraiment merci beaucoup.

Vania

Bonjour Vania,

Je vais commenter chaques Lignes du code.

Sub Remplissage_DashBoard() 
'LES VARIABLES
Dim FeuilDash as worksheet      '-> La feuille Dashboard
Dim LigneDash as integer        '-> La première Ligne de la feuille Dashboard ou les données seront renseignées.
Dim LaFeuilleMois as worksheet  '-> La feuille du mois sélectionner
Dim LigneMois as integer        '-> La dernière Ligne de la feuille mois sélectionnée.

'DEFINITION DASH
Set FeuilDash = ThisWorkbook.sheets("Dashboard")   'On défini la variable FeuilDash comme étant la feuille Dashboard
LigneDash = 6                                      'On donne la valeur de la première ligne de remplissage de la feuille Dashboard

'NETTOYAGE
'Sur la feuille dashboard on efface les précédentes données du range "B6:C & dernière ligne utiliser en colonne B de la feuille dashboard
FeuilDash.range("B" & LigneDash & ":C" & FeuilDash.Range("B65535").End(XlUp).row).ClearContents 

'DEFINITION FEUILLE MOIS
'On défini lafeuillemois comme étant la feuille dont le nom est les trois caractère à gauche de la cellule B4 de la feuille Dashboard
Set LaFeuilleMois = worksheets(left(FeuilDash.cells(4,"B"),3))  
'On cherche la dernière ligne de cette feuille
LigneMois = LaFeuilleMois.Range("B65535").End(XlUp).row

'REMPLISSAGE
'Boucle sur toutes les lignes en commencant par la 4 de la feuille du mois selectionnée
For i = 4 to LigneMois
     If LaFeuilleMois.cells(i,"C") <> "" then      'Si la colonne C de cette ligne est non vide
          'On recopie la valeur de la colonne B dans la feuille dashboard ligne LigneDash, colonne B
          FeuilDash.cells(LigneDash,"B") = LaFeuilleMois.cells(i,"B") 
          'On recopie la valeur de la colonne C dans la feuille dashboard ligne LigneDash, colonne C     
          FeuilDash.cells(LigneDash,"C") = LaFeuilleMois.cells(i,"C")      
          LigneDash = LigneDash + 1                                        'On incrémente Lignedash
    End if
Next

'VIDE LA MEMOIRE EXCEL
Set FeuilleDash = nothing
Set LaFeuilleMois  = nothing

End sub

As tu compris ?

Par conséquent le programme cherche pour le mois selectionnée en B4 de la feuille dashboard. Il est donc valables pour toutes les feuilles.

A toi de le mettre dans un control ou en lancement automatique lors de la modification de la cellule B4

A bientot

Super ! J'ai même le droit à un petit cours, formidable.

Là effectivement, je comprends nettement mieux.

Si je veux mettre un petit tableau supplémentaire dans le dasboard, pour le mois de février par exemple, il me suffirait juste de modifier la cellule qui va chercher les trois premiers caractères du mois, c'est bien ça ?

Exactement,

Si la cellule = January -> le programme nettoie la feuille dashboard, selectionne la feuille Jan et récupère les infos si la colonne C est non vide.

Si la cellule = February -> le programme nettoie la feuille dashboard, selectionne la feuille Feb et récupère les infos si la colonne C est non vide.

etc...

Tout tourne sur la cellule en elle même.

Maintenant pour lancer le programme, tu peux :

- Creer un bouton sur la feuille Dashboard

- Mettre ce programme sur VB dans la feuille en question dans la fonction : Worksheet_Change(target as range). En précisant

If target.address = "$B$4" then

'Tout le programme (sans la première ligne (sub ....) et sans la dernière ligne (end sub))

End if

La fonction worksheet change se déclenche dès qu'une cellule de la feuille est modifier manuellement. Autrement dit lorsque tu modifie la cellule B4 le programme se lancera automatiquement. ATTENTION : En cas de mauvaise saisie dans la cellule une erreur peut se déclenché. Étant donnée que l'on cherche une feuille avec les trois premier caractères de la cellule B4. Si cette feuille n'existe pas ... -> Erreur.

A bientôt

Cher Moul,

Tout marche très bien, je suis ravi.

Voici la version final de mon fichier XL. J'ai mis dans le dashboard l'ensemble des 12 mois pour avoir une vue d'ensemble. Comment faire pour que tous les mois se rafraîchissent d'un seul coup ?

Merci encore pour l'aide apporté.

Pardon, voici le fichier....

Le voici !

J'espère que cela te conviendra.

A bientot

Avant je met un warning.

Tu ne dois pas avoir plus de 11 activités par mois sinon tu écrasé les autres mois....

On peux réfléchir à une autre option si il faut comme des listboxs ou autre.

Bonne fin de soirée

Bonjour Moul,

Fantastique, la macro semble un peu plus complexe, mais grâce à vos explications précédentes et actuelles j'ai pu suivre le déroulé en pas à pas. Donc en gros, j'ai tout compris ou presque. Un petit mot que je ne saisis pas : dans le code VBA, qu'est-ce que ReDim par rapport à Dim ? C'est juste histoire que je continue à apprendre.

En tous cas, vous avez été d'une aide précieuse, car tout seul je m'embrouillais sacrément entre les boucles if, then, end if, do loop, loop while, for next... Pas facile de s'y retrouver et surtout de savoir quoi choisir.

Idem, j'ai appris grâce à vous que l'on peut faire des égalités de cellules entre les pages pour afficher les contenu au lieu de faire copier-coller et des A/R entre les pages, c'est très précieux. Mille mercis, vraiment. :-)

Vania

Bonjour,

Dim sert à déclarer toutes sortes de variables.

Et Redim (via docs.microsoft.com) :

"L’instructionReDim est utilisée pour dimensionner ou redimensionner un tableau dynamique qui a déjà été formellement déclaré à l’aide d’une instruction Private, Public, ou Dim avec des parenthèses vides (sans indice de dimension)."

Autrement dit, j'ai déclaré une première fois ma variable tableau PositionMois avec Dim.

Et via Redim, je précise que cette variable possède 13 valeurs qui vont de 0 à 12 mais j'utilise rarement la 0

OK, un peu trop haut niveau pour moi, mais super explication.

Encore une fois mille mercis.

Au plaisir :-)

Rechercher des sujets similaires à "rechercher transferer donnees tableau"