Concaténer les infos de 2 TextBox et l'enregistrer dans le tableau

Bonjour.

En fait j'ai 3 questions.

1) Comment concaténer les infos de 2 TextBox (TextBoxNom et TextBoxPrenom) pour ne faire qu'1 champs (NomPrenom) dans le TableauClients ?

2) rechercher si dans le TableauClients il existe déjà un client du même nom et prénom .

Si oui, Alors je déclenche l'ouverture d'une MsgBox

3) comment inclure dans la phrase d'une MsgBox le champ [NomPrenom] ?

MsgBox ("Le client [NomPrenom] existe déjà à cette adresse :" & vblf &

[Adresse + CP + Ville], vbyesno, "LE CLIENT EXISTE DÉJÀ")

Merci d'avance.

Soyez indulgent, j'ai écrit tout ça depuis mon smartphone. :)

Salut papicx

Qu'est-ce qui est indiqué dans la charte de ce forum

Un fichier joint vaut mieux que trois milliards d'explications

A la revoyure

Bonsoir,

Salut papicx

Qu'est-ce qui est indiqué dans la charte de ce forum

Un fichier joint vaut mieux que trois milliards d'explications

A la revoyure

J'ai juste cliqué sur "Répondre", et une citation aléatoire...

image

Bruno, si tu ne veux plus participer à l’entraide, cesse d'essayer de donner des "conseils"...

Tout le monde n'a pas la maîtrise que tu "penses" avoir.... Ils ont aussi le droit de poser des questions, sans avoir des réponses "cash"

Mais bon, tu participes, à ton niveau, à l'extinction des forums, au profit de l'IA

A bon entendeur

Bon, allez, on se calme !

C'est vrai qu'avec un fichier joint, c'est plus clair.

Soyez indulgent, j'ai écrit tout ça depuis mon smartphone. :)

Je vous ai fait donc un petit fichier avec ce qu'il faut pour ma demande.

Comme vous pouvez le voir, la mère Denis à 2 motos à la même adresse.

LAFÉE Clochette a 2 domiciles et 2 motos différentes. (hé oui, le monde change... lol )

Si je ne me suis pas planté, les 2 cas devraient pouvoir être pris en compte.
Évidemment, ce tableau a été rempli à la main, c'est pour illustrer ma demande.

Merci à vous d'avance.

2025 07 25 231049
14classeur1.xlsm (28.16 Ko)

Salut le breton

Bruno, si tu ne veux plus participer à l’entraide, cesse d'essayer de donner des "conseils"...

Tout le monde n'a pas la maîtrise que tu "penses" avoir.... Ils ont aussi le droit de poser des questions, sans avoir des réponses "cash"

Mais bon, tu participes, à ton niveau, à l'extinction des forums, au profit de l'IA

A bon entendeur

Si tu crois que mes petites interventions vont y changer quelques choses... tu te mets le doigt dans l'œil jusqu'au coude

Changes tes pensées également, mais tu ne changera pas le monde... citation d'un mec de 1898... t'es sérieux là

Bonjour papicx

Voici un exemple pour le code du bouton [Ajouter]

'   bouton AJOUTER
Private Sub CB_AjouterClient_Click()
  Dim ShClt As Worksheet
  Dim Lo As ListObject, NewLig As ListRow
  Dim NomPrénom As String
  ' Définir la feuille de travail
  Set ShClt = ThisWorkbook.Sheets("Clients")
  ' Définir le TS de cette feuille
  Set Lo = ShClt.ListObjects("TableauClients")
  ' Concaténer le nom et prénom
  NomPrénom = Me.TextBoxNom & " " & Me.TextBoxPrenom
  If ClientExiste(Lo, NomPrénom, Me.TextBoxAdresse, Me.TextBoxCP, Me.TextBoxVille) Then
    MsgBox "Le client [" & NomPrénom & "] existe déjà !à cette adresse :" & vbLf _
    & "[" & Me.TextBoxAdresse & " " & Me.TextBoxCP & " " & Me.TextBoxVille & "]", vbCritical, "LE CLIENT EXISTE DÉJÀ"
    Exit Sub
  End If
  ' Sinon on ajoute les infos
  Set NewLig = Lo.ListRows.Add
  With NewLig
    .Range(Lo.ListColumns("NomPrenom").Index).Value = NomPrénom
    .Range(Lo.ListColumns("adresse").Index).Value = TextBoxAdresse.Value
    .Range(Lo.ListColumns("CP").Index).Value = TextBoxCP.Value
    .Range(Lo.ListColumns("Ville").Index).Value = TextBoxVille.Value
    .Range(Lo.ListColumns("Moto").Index).Value = ComboBoxMoto.Value
    .Range(Lo.ListColumns("Couleur").Index).Value = ComboBoxCouleur.Value
    .Range(Lo.ListColumns("Immatriculation").Index).Value = TextBoxImmatriculation.Value
  End With
  ' // Nous pouvons libérer la mémoire des objects inutiles.
  Set NewLig = Nothing: Set Lo = Nothing: Set ShClt = Nothing
  MsgBox "Le client" & vbCrLf & "" & TextBoxNom & " " & TextBoxPrenom & " " & vbCrLf & "a été ajoutée à la liste des clients.", vbOKOnly + vbInformation, "CONFIRMATION"
End Sub

Et la fonction ClientExiste() qui va avec, à mettre dans un module

Function ClientExiste(Ts As ListObject, nomClient As String, Adresse As String, CP As Long, Ville As String) As Boolean
  Dim LigTs As Long
  ' Parcours de la première colonne du tableau
  For LigTs = 1 To Ts.ListRows.Count
    If StrComp(Ts.DataBodyRange(LigTs, 1).Value, nomClient, vbTextCompare) = 0 And _
      StrComp(Ts.DataBodyRange(LigTs, 2).Value, Adresse, vbTextCompare) = 0 And _
      CStr(Ts.DataBodyRange(LigTs, 3).Value) = CStr(CP) And _
      StrComp(Ts.DataBodyRange(LigTs, 4).Value, Ville, vbTextCompare) = 0 Then
      ClientExiste = True
      Exit Function
    End If
  Next LigTs
  ClientExiste = False
End Function

Ceci dit, je ne sais pas quoi faire si le client existe déjà, pour l'instant je sors du bouton valider

A+

bonjour papicx, JExcel2fr,

c'est assez facile de trouver ses infos :

Sub Filtrage()
     Dim c     As Range, Arr, b, b2, Nom, Arr2
     For Each c In Range("TableauClients[NomPrenom]").Cells
          Nom = c.Value
          s = Replace("filter(TableauClients[[moto]:[Immatriculation]], TableauClients[NomPrenom]=@1,""Erreur"")", "@1", Chr(34) & Nom & Chr(34))     'filtrer les infos de ses motos
          Arr = Evaluate(s)
          If VarType(Arr) = vbString Then
               MsgBox "Ce type n'a aucun moto connu", vbInformation, Nom
          Else
               On Error Resume Next
               b = False: b = (UBound(Arr, 2) = 3)     'si la personne a plusieurs motos, le résultat est une matrice 2D
               On Error GoTo 0
               If Not b Then motos = Application.Index(Arr, 1) Else motos = Join(Application.Transpose(Application.Index(Arr, , 1)), vbLf)
               b2 = False
               If b Then
                    s = Replace("unique(filter(TableauClients[[adresse]:[Ville]], TableauClients[NomPrenom]=@1,""Erreur""))", "@1", Chr(34) & Nom & Chr(34))     'filtrer les infos de ses adresses
                    Arr2 = Evaluate(s)
                    On Error Resume Next
                    b2 = (UBound(Arr2, 2) = 3)     'si la personne a plusieurs motos, le résultat est une matrice 2D
                    On Error GoTo 0
               End If
               MsgBox IIf(b, "ces motos sont ", "Son moto est ") & vbLf & motos & IIf(b2, vbLf & vbLf & "attention, sur plusieurs adresses !!!", ""), vbInformation, Nom
          End If
     Next
End Sub

re,

avec l'userform maintenant. Attention, dès que le nom et prénom sont connus, l'adresse sera proposée. Alors, on n'a plus qu'à se demander des choses au moment de l'ajoute.

PS. Pour chaque élément dans le userform, vous verrez une propriété "TabIndex" avec un integer, pour le moment assez aléatoire . Modifiez-les d'une manière ascendant, dans la séquence que vous voulez les choisir. Donc vous commencez avec "1" pour le nom, puis c'est normal quand vous utilisez le bouton "TAB" que vous sautez vers le "prénom", donc son "tabindex" sera le "2". De cette manière vous attribuez le 3, 4, ... à 'l'adresse, code postal, ville, modèle, couleur, immatr., Ajouter, Fermer. Comme ça, votre userform sera plus pratique.

10classeur1-73.xlsm (36.05 Ko)

Re,

J'aime bien les mecs qui sortent leur science avec des codes que seul eux peuvent comprendre

Ca sert à quoi du coup

cela concerne quel poste ?

Je suppose que la macro du poste de 12:52 s'explique elle-même quand vous la lancez ...

Bonjour à vous deux.

@JExceL2fr

Ceci dit, je ne sais pas quoi faire si le client existe déjà, pour l'instant je sors du bouton valider

Dans les msgBox que j'avais préparées dans le fichier joint, il y avait 2 msgbox imbriquées l'une dans l'autre.
Quand le Client existe, il était demandé s'il voulait faire une nouvelle fiche et affichait l'adresse complète déjà enregistrée,

si OUI, on continuait avec l'adresse existante et là une seconde msgbox proposait soit de fermer le formulaire (NON) car la moto affichée était la bonne (c'est pour faire des devis dans l'étape suivante), soit (OUI) et on enregistrait une moto supplémentaire.

si NON, on continuait en enregistrant une nouvelle adresse on poursuivait en enregistrant une nouvelle moto.

Ceci dit, je n'ai pas réussi à faire que ton fichier fonctionne, même en corrigeant le NomPrénom par NomClient qui semble être la variable commune entre la fonction et le formulaire.
Il enregistre bien un client supplémentaire, mais ne détecte pas ceux déjà existant, et je n'ai pas trouvé pourquoi.
Merci tout de même de m'avoir soumis cette proposition.


@BsAlv,

votre fichier fonctionne et je l'ai complété pour forcer les majuscules.

Je n'ai pas vu le cas où on a un client qui a plusieurs motos, ni même une, à une adresse.
Je pense que le code n'est pas terminé.

merci d'avance

Bonjour,

J'ai un peu amélioré la saisie des nouveaux Clients.
La moto doit être ajoutée obligatoirement,

La couleur n'est pas obligatoire, on est invité à la renseigner ou pas.

idem pour l'immatriculation.

re,

je pensais que j'avais télécharger un fichier ce matin, apparament non. Donc voilà ...

quelle combinaison se pose une problème ?

Bonjour Bart,

Je vous remercie pour cette nouvelle proposition.
Je vais étudier ce fichier et voir pour une nouvelle demande.
En gros, je voudrais éviter la création de doublons (cas de SANTA Klaus par exemple). Mais aussi permettre la création de nouvelle fiche avec une moto différente.

En fait, dans la petite fenêtre qui propose les adresses existantes, d'afficher les motos qui s'y rapportent.

Ssi la moto existe dans les propositions et que l'opérateur est sur le point de créer un doublon, qu'il puisse sortir de la procédure.

J'ai vu dans le codage que une MsgBox existe et afficherait que "ce type n'a aucune moto" .
Je n'ai pas réussi à créer les conditions pour qu'elle s'affiche.

merci d'avance

bonjour, je vois que t'as utilisé la propriété "tabindex" pour la séquence. Tu peux la consulter/modifier aussi dans l'editeur VBA Image>TabSequence (ou ce que tu vois là en français)

image

Ah oui, merci bien, je vais explorer cette fonctionnalité.

Quand j'ai posté le fichier, je l'ai fait un peu "à la va-vite" d'où je n'ai pas correctement mis les TableIndex dans le bon ordre.

en français, c'est comme ça.

2025 07 30 123743

Concernant la fenêtre

En fait, dans la petite fenêtre qui propose les adresses existantes, d'afficher les motos qui s'y rapportent.

mettre les motos serait perturbant en fait.

En fait, il faudrait que les adresses s'affichent comme actuellement, c'est très bien. ne change rien.

La suite serait qu'en ayant sélectionné l'adresse, qu'une msgbox s'ouvre pour indiquer qu'il y a 1 ou plusieurs motos et indiquer lesquelles, immatriculation comprise, puis de proposer soit d'ajouter une moto à cette adresse (la msgbox existe dans le fichier) , soit de sortir de la procédure.

J'ai des Client qui ont plusieurs motos du même type et même couleur, la différence est donc l'immatriculation.
Le but étant d'éviter de pouvoir créer un doublon.

Merci bien.

re,

je montre l'information connu pour ce client dans un listbox en haut, autrement on a le msgbox "ce type n'a aucune moto"

la macro "tableau_Unique" supprime les doublons (=les colonnes B:H identiques!)

Bonjour Bart,

Je n'ai pu répondre ces derniers jours car j'étais très occupé.
Ta proposition est super top !

MERCI BEAUCOUP.

En fait, c'est tellement bien que j'ai fait une capture d'écran pour les lecteurs qui seraient intéressés.

2025 08 03 115944

Bonsoir,

J'ai transposé les codes dans mon fichier excel et la solution proposée ne fonctionne pas.

La listBox ne s'affiche pas quand on saisi un nom et prénom qui existe déjà.
Comme d'hab, j'ai du zappé un truc. Ça fait 2 heures que je cherche et je ne trouve pas.
J'ai copié les codes des modules ( le module1 de la solution est transposé dans le module8 de mon fichier) et, bien sûr,

J'ai fait un copier-coller de la ListBox1 dans mon fichier. Tout semble s'être bien dupliqué.

je ne comprends pas pourquoi ça ne fonctionne pas.

mon fichier

votre solution (j'ai juste ajusté les largeurs des colonnes dans la ListBox)

Merci d'avance

Bonjour à tous,

J'ai trouvé mon erreur ! Enfin !

La nuit porte conseil...

Comme je le supposais, j'avais oublié une ligne qq part.
En fait, pour la trouver, j'ai d'abord mis la ListBox en visible puis en faisant de multiples tests, j'ai vu qu'aucune information ne s'affichaient dedans.
De là, je me suis posé la question de savoir comment était déclenché cette recherche d'adresse.
La ligne manquante se situait juste dans la saisie du prénom, tout à la fin. (logique quoi. )
Du coup, j'ai ajouté un commentaire pour le mettre en évidence.

Private Sub TextBoxPrenom_afterupdate()

.../...     

    ' // recherche les adresses en doublon
     RechercheAdresse
End Sub

Voici mon fichier corrigé donc.

Rechercher des sujets similaires à "concatener infos textbox enregistrer tableau"