Activation auto d'une UseForm VBA
Salut à tous,
Il est tout à fait normal que tu ai cette erreur le tableau structuré ne contenant pas de ligne. Je te conseille de créer un fonction qui va gérer le MaxId.
Pour se faire copie ce code dans le module1 :
Public Function GetMaxID(Optional ByVal Tableau As Excel.ListObject, Optional ByVal Column As String = "Num Client")
If Tableau Is Nothing Then
Set Tableau = Feuil4.Range("Tableau2").ListObject
End If
With Tableau
If .ListRows.Count > 0 Then
Dim MaxId As Long
MaxId = Application.WorksheetFunction.Max(.ListColumns(Column).DataBodyRange) + 1
Else
MaxId = 1
End If
End With
GetMaxID = MaxId
End FunctionAu passage tu renommes Num Client en enlevant les espaces superflues. Dans les entête du tableau structuré.
Ensuite tu appelles la fonction dans Initialize :
Private Sub UserForm_Initialize()
ComboBox1.List() = Array("M.", "Mme", "Mlle")
Label11 = Module1.GetMaxID
End SubEt dans CommandButton1_Click()
'...
'...
.Item(lig, 5) = TextBox3.Text
.Item(lig, 6) = TextBox4.Text
.Item(lig, 7) = TextBox5.Text
.Item(lig, 8) = TextBox6.Text
.Item(lig, 9) = TextBox7.Text
End With
End With
End If
Call ViderUSF 'ou ViderUSF
Label11 = Module1.GetMaxID
End SubEncore une fois il serait bon de donner des noms explicite aux contrôles et procédures que tu emploie...
Je viens de modifier et le module et même constat ! Je pense que j'ai vraiment dû louper une étape mais malheureusement je ne l'a vois pas.
Je vous transmet donc mon fichier, vous aurez surement plus de chance
Oui exact. C'est dû au fait que votre tableau clients ne contient pas encore de ligne. Et donc en gros Databodyrange n'existe pas encore
Faites simple,, modifiez le code initialize comme ceci
Private Sub UserForm_Initialize()
ComboBox1.List() = Array("M.", "Mme", "Mlle")
With Sheets("Clients").ListObjects(1)
If .ListRows.Count = 0 Then
Label11 = 1
Else: Label11 = WorksheetFunction.Max(.ListColumns(1).DataBodyRange) + 1
End If
End With
End SubCette fois tout fonctionne correctement et je vous en remercie encore une fois énormément !!
Si je peux me permettre, il me reste 2 derniers points:
=> 1) Est-il possible lors de l'ouverture du USF de pouvoir arriver directement dans le classeur "FicheClient" afin (lors de la validation de la saisie du ou des nouveaux clients) de ne pas à avoir à chercher et ouvrir le classeur correspondant.
=> 2) En faisant des essais, je me rend compte que la CommandButton2 (MODIFIER) n'a pas grand intérêt dans cette configuration. Il me semble peut être plus pertinent de pouvoir plutôt avoir une fonction "Recherche" via le USF ou un bouton commande sur la "FicheClient" directement afin de pouvoir modifier au besoin les coordonnées clients aisément.
Espérant avoir été suffisamment clair de mes demandes et renouvelle ma plus grande sympathie
=> 1) Est-il possible lors de l'ouverture du USF de pouvoir arriver directement dans le classeur "FicheClient" afin (lors de la validation de la saisie du ou des nouveaux clients) de ne pas à avoir à chercher et ouvrir le classeur correspondant.
Je suppose que c'est à moi que vous vous adressez ?
Si oui, je n'ai pas compris lorsque vous parlez de classeur. Vous parlez de la feuille Client ?
Si oui, la sub initialize pourrait plutôt être celle-ci
Private Sub UserForm_Initialize()
ComboBox1.List() = Array("M.", "Mme", "Mlle")
With Sheets("Clients")
.Activate
With .ListObjects(1)
If .ListRows.Count = 0 Then
Label11 = 1
Else: Label11 = WorksheetFunction.Max(.ListColumns(1).DataBodyRange) + 1
End If
End With
End With
End Sub=> 2) En faisant des essais, je me rend compte que la CommandButton2 (MODIFIER) n'a pas grand intérêt dans cette configuration. Il me semble peut être plus pertinent de pouvoir plutôt avoir une fonction "Recherche" via le USF ou un bouton commande sur la "FicheClient" directement afin de pouvoir modifier au besoin les coordonnées clients aisément.
Là il y a plein de possibilités. En premier je dirais de voir combien de clients vous pourriez avoir.
Après soit une combo de choix qui reprend tous les clients ou mieux peut-être faire une listbox ou listview mais cela impliquera des changements partout dans ce que je vous ai proposé.
Si vous voulez voir un exemple dites-moi.
Re Dan,
Cette fois si tout est parfait !! Et encore je tiens à renouveler mes remerciements pour votre aide !!
Concernant le point 2, je vais dans un premier temps supprimer la CommandButton2 "Modifiez" et voir dans la pratique si cela à du sens.
Je n'hésiterai pas à revenir vers vous si besoin...
Une très belle journée à tous
Ok. Merci du retour
Concernant le point 2, je vais dans un premier temps supprimer la CommandButton2 "Modifiez" et voir dans la pratique si cela à du sens.
C'est une bonne pensée. Des fois à force de compliquer on ne s'y retrouve plus
Après si vous faites CTRL + F sur votre feuille, excel vous donnera aussi l'info que vous pouvez modifier. Et là, plus simple et pas besoin d'USF...
Sinon si vous partez pour remettre les modifications via bouton sur USF, voici une idée parmi d'autres mais avec une USF supplémentaire et avec une listbox
- Click sur le lien --> https://forum.excel-pratique.com/excel/outil-vba-pour-la-compta-135552/2#p834954
- prendre le fichier "iproc-comptabilite-V2.xlsm"
- Ouvrir le fichier (attention il arrive directement sur l'ouverture de l'userform)
- En dessous cliquer sur le bouton RECHERCHER qui va ouvrir une Userform Recherche
- Activer la textbox en haut
- tapez une lettre au choix. Cela va montrer la liste de tous les articles enregistrés
- choisir une ligne et double clique dessus --> Cela va ramener les infos dans l'userform 1
Bonne journée
Bonjour à tous,
Donc on prenant le temps de présenter le fichier à mon amie pour sa boutique, elle m'informe qu'elle a plus de 300 client(e)s et que donc en effet une recherche rapide serait un vrai plus!
J'ai donc suivi et regarder votre fichier "iproc-comptabilite-V2.xlsm" qui m'a donné beaucoup d'information. J'y ai donc apporté des modifications à mon fichier et tout semble correct. Mais pour pas changé, j'ai une légère erreur...
Lors de la sélection "Recherche" dans l'USF et nouveau USF s'ouvre bien mais je n'arrive pas à récupérer de façon automatique lors de la saisie dans la TEXTBOX l'information souhaité!! => La LISTBOX reste vide ...
Je vous envoie une capture écran pour que se soit plus clair:
Merci encore mille fois pour votre aide!!
Bonjour
OK. Je regarde cela et reviens vers vous.
NB : Pouvez-vous confirmer que votre amie vous n'est pas ou ne sera pas sur excel MAC.
Cordialement
Re,
Je vous confirme qu’elle utilise un Mac, cela change? Je pensais qu’aujourd’hui il était compatible sans problème…
Bonjour,
Je vous confirme qu’elle utilise un Mac, cela change? Je pensais qu’aujourd’hui il était compatible sans problème…
Oui il y a des fonctionnalités qui ne fonctionnent pas avec Excel Mac. Donc l'approche peut être ou est souvent différente.
Chose à vérifier :
- quelle est la version excel sur le MAC
- savez-vous utiliser l'USF actuelle sur son MAC.
Lors de la sélection "Recherche" dans l'USF et nouveau USF s'ouvre bien mais je n'arrive pas à récupérer de façon automatique lors de la saisie dans la TEXTBOX l'information souhaité!! => La LISTBOX reste vide ...
Oui car il faut adapter le code car la feuille de référence dans le fichier que vous regardiez est la feuille BDD ou objet "Feuil1"
Ici la feuille de référence est la feuille Clients ou l'objet "Feuil4"
On aurait pu changer seulement cette référence de Feuil1 par Feuil4. Toutefois comme vous êtes en tableau structuré, remplacez tout le code par celui ci-après.
Private Sub TextBox1_Change()
'Macro Dan
Dim lg As Integer, i As Integer
Dim prem
Dim c As Range
Dim TS As ListObject
Dim premligTS As Byte
If ok Then Exit Sub
Me.ListBox1.Clear
Set TS = Feuil4.ListObjects(1) 'Tableau structure feuille clients
premligTS = TS.HeaderRowRange.Row 'ligne de tete du tableau structure
If Me.TextBox1 <> vbNullString Then
With TS.ListColumns(4).DataBodyRange
Set c = .Find("*" & Me.TextBox1.Value & "*", LookIn:=xlValues)
If Not c Is Nothing Then
prem = c.Address
i = 0
Do
Me.ListBox1.AddItem
With TS.DataBodyRange
Me.ListBox1.List(i, 0) = .Item(c.Row - premligTS, 1).Value 'Num client
Me.ListBox1.List(i, 1) = .Item(c.Row - premligTS, 2).Value 'Civilité
Me.ListBox1.List(i, 2) = .Item(c.Row - premligTS, 3).Value 'Prénom
Me.ListBox1.List(i, 3) = .Item(c.Row - premligTS, 4).Value 'Nom
Me.ListBox1.List(i, 4) = .Item(c.Row - premligTS, 5).Value 'Adresse
Me.ListBox1.List(i, 5) = .Item(c.Row - premligTS, 6).Value 'Code Postal
Me.ListBox1.List(i, 6) = .Item(c.Row - premligTS, 7).Value 'Ville
Me.ListBox1.List(i, 7) = .Item(c.Row - premligTS, 8).Value 'Téléphone
Me.ListBox1.List(i, 8) = .Item(c.Row - premligTS, 9).Value 'E-mail
End With
Set c = .FindNext(c)
i = i + 1
Loop While Not c Is Nothing And c.Address <> prem
End If
End With
End If
Set c = Nothing
End SubIl faudra adapter la propriété ColumnWidths de la listbox pour que toutes les infos soient bien positionnées
Essayé en mettant ces valeurs-ci dans la propriété --> 60 pt;60 pt;72 pt;90 pt;145 pt;72 pt;90 pt;80 pt;139,95 pt
Crdlt
Bonjour,
Je comprends mieux avec ce nouveau code !!
La phase de "recherche" fonctionne parfaitement cette fois-ci, toute fois serait-il possible de faire les recherches non pas seulement avec le NOM (comme actuellement) mais aussi par le NUM CLIENT et/ou le PRENOM ?
Concernant vos questions sur son MAC, je verrai avec elle ce soir ou demain et reviendrai vers vous!
Merci encore pour votre générosité de la transmission
Bonjour,
La phase de "recherche" fonctionne parfaitement cette fois-ci, toute fois serait-il possible de faire les recherches non pas seulement avec le NOM (comme actuellement) mais aussi par le NUM CLIENT et/ou le PRENOM ?
Essayez le code comme ceci :
Private Sub TextBox1_Change()
'Macro Dan
Dim lg As Integer, i As Integer
Dim prem
Dim c As Range
Dim TS As ListObject
Dim premligTS As Byte
Dim existe As Boolean
If ok Then Exit Sub
Me.ListBox1.Clear
Set TS = Feuil4.ListObjects(1) 'Tableau structure feuille clients
premligTS = TS.HeaderRowRange.Row 'ligne de tete du tableau structure
If Me.TextBox1 <> vbNullString Then
With TS.ListColumns(1).DataBodyRange.Resize(, 4)
Set c = .Find("*" & Me.TextBox1.Value & "*", LookIn:=xlValues)
If Not c Is Nothing Then
prem = c.Address
i = 0
Do
'verifie si ligne existe dans listbox
For j = 1 To ListBox1.ListCount
If Me.ListBox1.List(j - 1, 0) = CStr(.Item(c.Row - premligTS, 1).Value) Then existe = True: Exit For
Next j
If existe = False Then
Me.ListBox1.AddItem
With TS.DataBodyRange
Me.ListBox1.List(i, 0) = .Item(c.Row - premligTS, 1).Value 'Num client
Me.ListBox1.List(i, 1) = .Item(c.Row - premligTS, 2).Value 'Civilité
Me.ListBox1.List(i, 2) = .Item(c.Row - premligTS, 3).Value 'Prénom
Me.ListBox1.List(i, 3) = .Item(c.Row - premligTS, 4).Value 'Nom
Me.ListBox1.List(i, 4) = .Item(c.Row - premligTS, 5).Value 'Adresse
Me.ListBox1.List(i, 5) = .Item(c.Row - premligTS, 6).Value 'Code Postal
Me.ListBox1.List(i, 6) = .Item(c.Row - premligTS, 7).Value 'Ville
Me.ListBox1.List(i, 7) = .Item(c.Row - premligTS, 8).Value 'Téléphone
Me.ListBox1.List(i, 8) = .Item(c.Row - premligTS, 9).Value 'E-mail
End With
i = i + 1
End If
Set c = .FindNext(c)
existe = False
Loop While Not c Is Nothing And c.Address <> prem
End If
End With
End If
Set c = Nothing
End SubLa recherche sera aussi possible sur la colonne civilité
Reste à vérifier sur MAC avant d'aller plus loin ou de faire autrement.