Copier infos selon n° de client

Bonjour,

Je vient demander de l'aide car j'ai bon chercher, essayer divers code que je trouve sur le net

et le modifier (du moins avec le peut de connaissance que j'ai en vba) mais rien ne fonctionne.

Je repart donc de zéro

Je suis entrain de terminer mon petit programme de gestion pour mon activité.

Il me faudrait un code VBA lier à un bouton qui me permettrais de recopier plusieurs infos du clients selon une cellule (celle ou j'indique le numéro du client)

La liste client ne se trouve pas sur la même page elle se trouve sur : Listings_clients

En colonne A : le numéro du client de 1 à "infini"

B : nom

C : prénom

D : nom société

E : Rue et n°

F : code postal

G : ville

H : tel

I : Mail

J : n° tva

la cellule ou j'indique le n° du client à recopier est en M9 sur la page : "Facture"

et sur la page facture les données sont trier de cette sorte :

C14 : Nom

D14 : Prénom

E14 : Nom de société

G14 : Rue et n°

J14 : code postal

K14 : ville

M14 : tel

N14 : Mail

P14 : TVA

Si une personne pourrais m'aider merci mille fois

Bonjour Geoffrey027 et bienvenue,

Au cours de tes recherches, tu aurais pu utilement lire ces infos utiles ... un fichier comme support serait le bienvenu (pas ton "vrai" fichier: une copie allégée avec une trentaine de coordonnées "bidons")

Tu sais, par ailleurs, que tu peux obtenir le même résultat avec une formule? Ça ne conviendrait pas?

Merci, voici le fichier en pièce jointe.

Oui sa je sais limite le faire en formule, mais dans mon cas je ne peut pas mettre de formule dans les cases des infos clients, car si celui ci n'existe pas je doit pouvoir entrer du texte dedans.

donc dans le fichier il y à une page Facture et dedans il y à en M9 la case ou on marque le N° du client.

Juste à coté le bouton "OK" pour valider l'importation des données (qui est sur la page listings clients

2eme macro =

et éventuellement en Q9 (liste avec Oui et Non) j'aimerais une macro aussi que si dans la case Q9 SI il est marqué OUI alors il recopie les infos clients :

C14 : Nom

D14 : Prénom

E14 : Nom de société

G14 : Rue et n°

J14 : code postal

K14 : ville

M14 : tel

N14 : Mail

P14 : TVA

dans la page listings clients un à la suite de l'autre

est ce possible ?

Merci

Je commence réellement le 01/04 donc je suis un peut à cours de temps pour que tout soit fini pour mon activité :/ aie aie cv aller :p

Oui sa je sais limite le faire en formule, mais dans mon cas je ne peut pas mettre de formule dans les cases des infos clients, car si celui ci n'existe pas je doit pouvoir entrer du texte dedans

... en même temps, tu dis que tu es un peu court au niveau temps!? Je ne voudrais pas donner l'impression d'ergoter, mais dans les deux situations (nouveau client ou pas) tu dois tout de même encoder toutes les infos le concernant. Ce que je propose, c'est que tu te simplifies la vie en complétant d'abord ton Listing Clients, puis ensuite ta facture. On peut effectivement compléter les coordonnées par macro, si nécessaire.

Il y a déjà des particularités, dans ton code qui vont te faire "perdre du temps" ... comme -à chaque modification du contenu de ta TextBox- le fait de lire les 5000 lignes de ton Listing Clients, même s'il en contient beaucoup moins.

Tant qu'à faire, tu pourrais aussi cliquer sur un item de la ListBox, pour garnir tes champs en ligne 14.

D'autre part, il y a dans le Module2 un bout de code qui devrait se trouver dans le module lié à une feuille particulière (mais qui contient des erreurs concernant les noms des feuilles)?

Bonjour,

Une piste. Procédure à attacher à un bouton et à adapter selon tes besoins :

Sub Coordonnees()

    Dim FeFacture As Worksheet
    Dim FeClients As Worksheet
    Dim PlgClient As Range
    Dim Cel As Range
    Dim Tbl
    Dim NumClient As Long
    Dim I As Integer

    Set FeFacture = Worksheets("Facture")
    Set FeClients = Worksheets("Listings_clients")

    NumClient = FeFacture.Range("M9")

    'comme les cellules cible ne se suivent pas, inscrit dans un tableau le numéro des colonnes
    Tbl = Array(3, 4, 5, 7, 10, 11, 13, 14, 16)

    'défini la plage sur la colonne A de la feuille "Listings_clients" à partir de A2 (la 1ère ligne ayant probablement les entêtes)
    With FeClients: Set PlgClient = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    'effectue la recherche
    Set Cel = PlgClient.Find(NumClient, , xlValues, xlWhole)

    'si trouver...
    If Not Cel Is Nothing Then

        'redéfini la plage sur la ligne de la cellule recherchée à partire de la colonne B (la colonne A ayant les numéros clients)
        With FeClients: Set PlgClient = .Range(.Cells(Cel.Row, 2), .Cells(Cel.Row, .Columns.Count).End(xlToLeft)): End With

    End If

    'comme les colonnes ne se suivent pas, une boucle est nécessaire pour la récup des valeurs
    For I = 1 To PlgClient.Count

        FeFacture.Cells(14, Tbl(I - 1)).Value = PlgClient(1, I).Value

    Next I

End Sub

Je comprend,

Pour le Module2 c'était un test mais qui en fonctionne pas donc c'est à supprimer...

J'ai penser aussi pour chaque nouveau client, aller sur la page listings et le rajouter "manuellement" mais je trouvais l'idée "d'import - export de données par vba bcp + pro que de s'amuser à changer de page pour chaque choses.

Cliquez sur l'item listbox peut être une autres solution qui me convient en effet...

Et pour la liste client de 5000 je pense pas arriver jusque la du moins tant que maintenant donc c'est vrai que je peut limiter la quantités...

Maintenant je suppose que sa dépend de la rapidité du pc ? car chez moi c'est fluide ...

Merci These :

Sa à l'air de fonctionner sans que je modifie quoi que sa soit de ton code,

juste une des dernières lignes qui fait "erreur" et est souligner en jaune :

FeFacture.Cells(14, Tbl(I - 1)).Value = PlgClient(1, I).Value

mais en tout cas malgré l'erreur il recopie ce qu'on lui demande .... bizare

Re-bonjour,

Salut Theze,

Voici une solution pour inscrire les infos, lors de la sélection dans la ListBox:

Private Sub ListBox1_Click()
    Cells(14, 3) = ListBox1.List(ListBox1.ListIndex, 0)
    Cells(14, 4) = ListBox1.List(ListBox1.ListIndex, 1)
    Cells(14, 5) = ListBox1.List(ListBox1.ListIndex, 2)
    Cells(14, 7) = ListBox1.List(ListBox1.ListIndex, 3)
    Cells(14, 10) = ListBox1.List(ListBox1.ListIndex, 4)
    Cells(14, 11) = ListBox1.List(ListBox1.ListIndex, 5)
    Cells(14, 13) = ListBox1.List(ListBox1.ListIndex, 6)
    Cells(14, 14) = ListBox1.List(ListBox1.ListIndex, 7)
    Cells(14, 16) = ListBox1.List(ListBox1.ListIndex, 8)
End Sub

En modifiant comme suit le code de la Sub TextBox1_Change, tu ne parcours plus les 5000 lignes, mais uniquement les cellules depuis B4, jusqu'à la dernière cellule non-vide en colonne B:

Private Sub TextBox1_Change()
ListBox1.Clear
With Sheets("Listings_clients")
derLigne = .Cells(Rows.Count, 2).End(xlUp).Row
For Each cellule In .Range("B4:B" & derLigne)
If cellule <> 0 Then
If InStr(LCase(cellule), LCase(TextBox1.Value)) > 0 Then
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = cellule.Value
ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(cellule.Row, 3)
ListBox1.List(ListBox1.ListCount - 1, 2) = .Cells(cellule.Row, 4)
ListBox1.List(ListBox1.ListCount - 1, 3) = .Cells(cellule.Row, 5)
ListBox1.List(ListBox1.ListCount - 1, 4) = .Cells(cellule.Row, 6)
ListBox1.List(ListBox1.ListCount - 1, 5) = .Cells(cellule.Row, 7)
ListBox1.List(ListBox1.ListCount - 1, 6) = .Cells(cellule.Row, 8)
ListBox1.List(ListBox1.ListCount - 1, 7) = .Cells(cellule.Row, 9)
ListBox1.List(ListBox1.ListCount - 1, 8) = .Cells(cellule.Row, 10)
ListBox1.List(ListBox1.ListCount - 1, 9) = .Cells(cellule.Row, 11)
End If
End If
Next cellule
End With
End Sub

Re,

Comme tu n'as pas posté de fichier, j'ai dû interpréter donc, il ce peut qu'il y ai dans la base de donnée un champ supplémentaire après TVA et donc, en fin de boucle ça plante ! Donc, remplace la boucle par celle-ci :

For I = 0 To UBound(Tbl)

    FeFacture.Cells(14, Tbl(I)).Value = PlgClient(1, I + 1).Value

Next I

Hello U. Milité,

Comme Geoffrey027 n'a pas posté de fichier, je suis parti depuis sa demande :

Il me faudrait un code VBA lier à un bouton qui me permettrais de recopier plusieurs infos du clients selon une cellule (celle ou j'indique le numéro du client)

donc, sans prendre en considération qu'il puisse exister un quelconque ActiveX que ce soit sur la feuille ou un UserForm !

Merci these sa fonctionne YOUPIIIIEEE

As tu un code sans trop en demander pour faire l'inverse ?

Si en Q9 il es marquer "OUI" alors si je clic sur Enregistrer il recopie les données du client dans la page listings clients ... ?

voila ou j'en suis (piéces jointe)

U. Milité »

merci en effet la liste est plus légère du coup. mais étant vraiment novice ou bête du coup quand je tape quelque chose dans la barre de recherche sa ne fonctionne pas.... il recherche rien

mais la listbox en dessous elle fonctionne

@Theze: il y a bien un fichier, mais dans le second message de Geoffrey027 (ou ci-dessous, pour une version plus "light")

merci en effet la liste est plus légère du coup. mais étant vraiment novice ou bête du coup quand je tape quelque chose dans la barre de recherche sa ne fonctionne pas.... il recherche rien

mais la listbox en dessous elle fonctionne

Je crois bien que je n'ai rien compris

En pièce jointe, ton fichier allégé ...

dans le fichier que tu me renvoie maintenant, le code est :

Private Sub ListBox1_Click()

Cells(14, 3) = ListBox1.List(ListBox1.ListIndex, 0)

Cells(14, 4) = ListBox1.List(ListBox1.ListIndex, 1)

Cells(14, 5) = ListBox1.List(ListBox1.ListIndex, 2)

Cells(14, 7) = ListBox1.List(ListBox1.ListIndex, 3)

Cells(14, 10) = ListBox1.List(ListBox1.ListIndex, 4)

Cells(14, 11) = ListBox1.List(ListBox1.ListIndex, 5)

Cells(14, 13) = ListBox1.List(ListBox1.ListIndex, 6)

Cells(14, 14) = ListBox1.List(ListBox1.ListIndex, 7)

Cells(14, 16) = ListBox1.List(ListBox1.ListIndex, 8)

End Sub

'LISTBOX liste déroulante'

Private Sub TextBox1_Change()

ListBox1.Clear

With Sheets("Listings_clients")

derLigne = .Cells(Rows.Count, 2).End(xlUp).Row

For Each cellule In .Range("B4:B" & derLigne)

If cellule <> 0 Then

If InStr(LCase(cellule), LCase(TextBox1.Value)) > 0 Then

ListBox1.AddItem

ListBox1.List(ListBox1.ListCount - 1, 0) = cellule.Value

ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(cellule.Row, 3)

ListBox1.List(ListBox1.ListCount - 1, 2) = .Cells(cellule.Row, 4)

ListBox1.List(ListBox1.ListCount - 1, 3) = .Cells(cellule.Row, 5)

ListBox1.List(ListBox1.ListCount - 1, 4) = .Cells(cellule.Row, 6)

ListBox1.List(ListBox1.ListCount - 1, 5) = .Cells(cellule.Row, 7)

ListBox1.List(ListBox1.ListCount - 1, 6) = .Cells(cellule.Row, 8)

ListBox1.List(ListBox1.ListCount - 1, 7) = .Cells(cellule.Row, 9)

ListBox1.List(ListBox1.ListCount - 1, 8) = .Cells(cellule.Row, 10)

ListBox1.List(ListBox1.ListCount - 1, 9) = .Cells(cellule.Row, 11)

End If

End If

Next cellule

End With

End Sub

Je doit garder l'ancien code + le nouveau un en dessous de l'autre ?

Oups je vient de comprendre, !!!

quand on clic sur la ligne sa l'envoie direct en dessous je suis co* en fait mdr

et beh heu parfait sa MERCI et désolé de ne rien comprendre de suite lol

Re,

Une procédure pour ajouter à la base de données les valeurs entrées dans la feuille "Facture" et à lier à ton bouton "Enregistrer" :

Sub Enregistrer()

    Dim FeFacture As Worksheet
    Dim FeClients As Worksheet
    Dim Tbl
    Dim Lig As Long
    Dim I As Integer

    Set FeFacture = Worksheets("Facture")
    Set FeClients = Worksheets("Listings_clients")

    'recherche de la première ligne vide dans la base de données
    With FeClients: Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1: End With 'sur colonne A

    'comme les cellules cible ne se suivent pas, inscrit dans un tableau le numéro des colonnes
    Tbl = Array(3, 4, 5, 7, 10, 11, 13, 14, 16)

    'comme les colonnes ne se suivent pas, une boucle est nécessaire pour la récup des valeurs
    For I = 0 To UBound(Tbl)

        FeClients.Cells(Lig, I + 2).Value = FeFacture.Cells(14, Tbl(I)).Value

    Next I

    'incrémente le numéro client par rapport à la valeur de la cellule du dessus
    FeClients.Cells(Lig, 1).Value = FeClients.Cells(Lig - 1, 1).Value + 1

End Sub

Super

Merci à vous deux grâce à vous tout fonctionne

Me reste à remettre le tout dans mon BON fichier mais le plus gros est fait oufff =)

""" Pas de suite, mais je pourrais faire appel à vous via cette page pour un autre codage ?

En effet une fois fini, le plus dur reste à faire...

j'ai des autres pages comme : facture - facturier2018 et devis2018

en gros quand je crée une nouvelle facture me faut une macro qui enregistre la facture et recopie

chaque cellule dans la base de données facturier2018 ou devis2018 selon l'entête...

c'est assez conséquent à faire mais voila je demande toujours ...

ou du moins le début du code que je puisse moi même rajouter que la cellule x ce copie en cellule y ...

fin voila dite moi quoi et je vous enverrais cela """

Re,

Selon le cas, il sera peut être plus judicieux d'ouvrir un autre post mais tu peux, si tu préfères, continuer sur celui-ci !

Merci, je vais terminer quelques petites choses et je vous envoie sa après.

C'est possible de rajouter une condition à ton code enregistrer ?

Si la case Q9 = "Oui" alors la macro s’effectue pour enregistrer le client,

par contre si Q9 = "Non" alors il ne fait rien.

Et donc si possible rajouter en fin de code, qu'il change la case Q9 pour que à chaque fois il soit remis sur "Non"

Rechercher des sujets similaires à "copier infos client"