Copier ligne dans une nouvelle feuille si

Fermé
thomy54 Messages postés 10 Date d'inscription vendredi 8 mars 2013 Statut Membre Dernière intervention 14 octobre 2015 - 4 sept. 2014 à 17:26
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 10 sept. 2014 à 11:50
Bonjour,

Voici mon cas, j'ai une base de donnée avec dans une des colonnes le nom de l'utilisateur et j'aimerais que mon code VBA me copie dans une nouvelle feuille toutes les lignes avec le nom choisi

je déclare un variable avec le nom désiré mais après je ne sais pas comment coder le fait de copier les lignes où il y a le nom choisi.

Merci d'avance

Thomas

A voir également:

3 réponses

PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 4/09/2014 à 19:34
Dans cet exemple,
remplace feuil1 par le nom de la feuille ou ta base de données est.
remplace feuil2 par le nom de la feuille ou tu veux copier les données
Le nom à copier est entrée dans la case A1 donc la copie peut être dynamique.
On suppose que les données commemence à la ligne 4 et sont copié à la ligne 4,
On suppose qu'il n'y a pas de blanc dans la base de donnée, on copie, et la boucle s'arrête lorsqu'un vide est trouvé.
S'il y a des vide, il faut être créatif, rechercher durant 500 ligne, ou ajouter un FIN après le tableau et s'arrêter lorsqu'on trouve FIN.

L'exemple ne fait peut-être pas exactement ce que tu veux, mais tu peux adapter ce code selon tes besoins. Selon ou commencer les données, dans quel colonne est le nom.
Si tu veux que le nom choisi soit dynamique ou hard-codé (écrire Nom_choisi = "Sylvain".

Sub Macro3()

Dim Nom_Choisi As String
Dim Debut_Tableau As Integer
Dim Nouveau_tableau As Integer

Debut_Tableau = 4
Nouveau_tableau = 4

Nom_Choisi = Sheets("feuil1").Range("A1").Value

While Sheets("feuil1").Range("A" & Debut_Tableau).Value <> ""
If Sheets("feuil1").Range("A" & Debut_Tableau).Value = Nom_Choisi Then
Sheets("Feuil2").Rows(Nouveau_tableau).Value = Sheets("Feuil1").Rows(Debut_Tableau).Value
Nouveau_tableau = Nouveau_tableau + 1
End If
Debut_Tableau = Debut_Tableau + 1
Wend

End Sub
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
4 sept. 2014 à 19:32
Les variables
Debut_tableau, c'est ta base de donnée, on commence a chercher à la ligne 4, ensuite dans la boucle, on recherche la colonne A à partir de la ligne 4 jusqu'a temps qu'une case est égale "" donc vide.

Nouveau tableau. J'ai mis 4 aussi, quand le nom choisi est trouvé (dans la condition IF), la ligne 4 recoit le contenu de la ligne debut_tableau. et on incrémente Nouveau_tableau pour écrire sur la ligne suivante.

Debut_tableau est incrémenté que le nom celui choisi ou non, il faut boucler toute la base de donnée jusqu'a la fin,
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 8/09/2014 à 10:43
Bonjour

maquette de W ci jointe:
https://www.cjoint.com/?3IikGU5F7wT

sans aucune précision de ta part :-(
le nom recherché est dans une cellule nommée "nom", de m^me la ligne d'ent^te est en constante ainsi que la colonne des noms dans le code à adapter, enfin la feuille de base de données est nommée "bdd"

principe
on vérifie que le nom inscrit est bien dans la base de données (gestionnaire d'erreurs)
on ne boucle que sur les lignes où il y a le nom
et on les mémorise dans une variable tableau

On construit la feuille avec comme nom d'onglet le nom recherché
on copie la ligne d'entête et on restitue la variable tableau
on encadre le tableau

le code
Option Explicit
Option Base 1
'--
Const Col As Byte = 1 'colonne de recherche
Const Lig_ent As Byte = 3 'ligne des entêtes
'-----------
Sub selectionner_selon_nom()
Dim Qui As String, Dercol As Byte, Nbre As Integer, Entete
Dim Lig As Integer, Idy As Integer, Idx As Byte, T_qui()

'----------------initialisations
Application.ScreenUpdating = False
With ActiveSheet
     Qui = Range("nom") 'cellule nommée (adresse nom précisée dans la demande !)
     Dercol = .Rows(Lig_ent).Find("*", , , , , xlPrevious).Column
     'verif nom existant
     Nbre = Application.CountIf(.Range(.Cells(Lig_ent, Col), .Cells(10000, Col)), Qui)
     If Nbre = 0 Then GoTo Vide
     ReDim T_qui(Nbre, Dercol - Col + 1) 'tableau des lignes avec "qui"
     'mémorise la ligne d'ent^te
     Entete = .Range(.Cells(Lig_ent, Col), .Cells(Lig_ent, Dercol))
     
 '---------------------traitement sur feuille database
     ' recherche les lignes  avec "Qui"
     Lig = Lig_ent
     For Idy = 1 To Nbre
          Lig = .Columns(Col).Find(Qui, Cells(Lig, Col), xlValues).Row
     'mémorisation  des données à copier
          For Idx = Col To Dercol
               T_qui(Idy, Idx) = .Cells(Lig, Idx)
          Next Idx
     Next Idy
End With

'------------------construction de la feuille "qui"
Sheets.Add
With ActiveSheet
     .Move After:=Sheets("Bdd") ' A adapter nom de l'onglet base de données
    .Name = Qui
    .Range(.Cells(Lig_ent, Col), .Cells(Lig_ent, Dercol)) = Entete 'entêtes
     .Cells(Lig_ent + 1, Col).Resize(Nbre, Dercol - Col + 1) = T_qui 'restitution données de "qui"
     .Range(.Cells(Lig_ent, Col), .Cells(Lig_ent + Nbre, Dercol)).Borders.Weight = xlThin 'encadrement
End With
Exit Sub

'----------------gestionnaire d'erreur
Vide:
     MsgBox Qui & " Inconnu !", vbCritical
End Sub


Michel
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
10 sept. 2014 à 11:50
Merci ?
de rien...
0