Afficher toutes les cellules non vides
Bonjour,
Je débute sur VBA et je me trouve complètement bloquée sur ma macro.
J'ai un onglet avec toutes les données sur des personnes. J'ai d'abord des infos personnelles (nom, prénom, adresse etc.) puis, si la personne a suivi les formations (il s'agit surtout d'habilitations et permis), la date de validité de son permis apparait dans la colonne correspondant à la formation suivie.
Je voudrais, dans un autre onglet, pouvoir afficher la "fiche" d'une personne avec ses données personnelles et surtout la liste de ses formations.
Pas de soucis pour la recherche par le nom et l'affichage des données personnelles. Par contre, je n'arrive pas à faire en sorte que la macro cherche les cellules non vides de la personne puis les affiche dans des cellules différentes ! Pour le moment, la macro cherche les cellules non vides mais ensuite elle ne m'affiche que la dernière cellule trouvée...
Je vous mets mon fichier simplifié en PJ pour que vous puissiez vous faire une meilleure idée de la situation. Bien sûr dans la réalité j'ai plutôt 50 colonnes sur les formations et 500 personnes à suivre.
J'espère avoir été claire, n'hésitez pas si vous avez des questions!
Merci d'avance de votre aide.
Bonsoir Louise, bonsoir le forum,
Je te propose le code ci-dessous :
Sub Macro1()
Dim F As Worksheet 'déclare la variable F (onglet Formulaire)
Dim D As Worksheet 'déclare la variable D (onglet Données)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Set F = Worksheets("Formulaire") 'définit l'onglet F
Set D = Worksheets("Données") 'définit l'onglet D
F.Range("A7").Offset(2, 0).ClearContents 'efface d'éventuelle anciennes données du formulaire
If F.Range("B3") = "" Or Range("B4") = "" Then 'condition : si B3 ou B4 est vide
MsgBox "Vous devez renseigner les nom et prénom" 'message
Range("B" & IIf(Range("B3").Value = "", 3, 4)).Select 'sélectionne la première cellule vide de la plage B3:B4
End If 'fin de la condition
TV = D.Range("A5").CurrentRegion 'définit le tableau TV (dans ton exemple la plage A3:G10)
For I = 4 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs (en partan de la quatrième)
If TV(I, 1) = F.Range("B3") And TV(I, 2) = F.Range("B4") Then 'condition 1 : si les nom/prénom coïncident
For J = 3 To UBound(TV, 2) 'boucle sur toutes les colonnes du tableau des valeurs TV (en partant de la troisième)
If TV(I, J) <> "" Then 'condition 2 : si la donnée ligne I colonne J de TV n'est pas vide
Set DEST = F.Range("A" & Application.Rows.Count).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
DEST.Value = TV(I, J) 'renvoie dans DEST la date de la formation
DEST.Offset(0, 1).Value = TV(2, J) 'renvoie dans DEST décalée d'une colonne à doite l'intitule de la formation
End If 'fin de la condition 2
Next J 'prochaine colonne de la boucle 2
Exit For 'sort de la boucle 1
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle 1
End SubBonsoir,
Je souligne que c'est assez rare et très intéressant de voir ici un code commenté comme celui-ci
Merci à Thauthème de cet effort
P.
Ca fonctionne, c'est génial merci beaucoup ThauThème !
Les explications étaient excellentes j'ai facilement pu adapter ce code à mon tableau initial
Belle journée à vous!
Bonjour le fil, bonjour le forum,
@Patrick
Tes commentaires me font très plaisir. Souvent, je fais comme Ducros. Je me demande pourquoi je me décarcasse car les demandeurs ne sont pas foutus de modifier la moindre ligne malgré les commentaires.
En fait, c'est en faisant systématiquement cela pour moi même que j'ai progressé en VBA. Aujourd'hui, il est très rare que je ne commente pas mes codes. On me reproche parfois de faire du clé-en-main alors que certains ne font que donner le chemin pour aboutir à la solution. La fameuse phrase : il vaut mieux apprendre à pécher que donner du poisson... je me dis que commenter les codes c'est un peu apprendre à pécher...
@Louise
Content que ça convienne, je me suis pas décarcassé pour rien, pour une fois...