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 Function

Au 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 Sub

Et 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 Sub

Encore 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 Sub

Cette 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!!

image
14gestion-libassi.zip (851.48 Ko)

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 Sub

Il 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 Sub

La recherche sera aussi possible sur la colonne civilité

Reste à vérifier sur MAC avant d'aller plus loin ou de faire autrement.

Rechercher des sujets similaires à "activation auto useform vba"