IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Formulaire de saisie sur excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Conseillée commerciale
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseillée commerciale
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Formulaire de saisie sur excel
    Bonjour,

    je ne sais pas si je suis sur le bon emplacement, un peut perdu entre (Excel et VBA), je sollicite votre savoir faire afin de pouvoir résoudre une anomalie au niveau d'un formulaire (userform) de saisie que je viens de créer pour un tableau excel.

    je suis vraiment novice en VBA, j'ai donc suivi un Tutorial sur le net pour créer un formulaire de saisie pour mon tableau excel de 28 colonnes, dont le première colonne "A" doit en principe marqué le dernier N° de code client +1 à la ligne vide suivante, Hors que cela ne fonctionne pas, et le N° de code se met sur la colonne "B" et le tout se met sur la même ligne en écraser la saisie précédente, et si je veux commencer la saisie en choisissant un code client en premier, j'obtiens une erreur d’exécution

    donc j'ai 3 problème :
    - Code client n'est pas attribué automatiquement et saisi sur la colonne "B" au lieu de la colonne "A"
    - l'ajout d'une saisie se fait toujours sur la même ligne "4" en écrasant le contenu précédent au lieu de passer automatiquement à la ligne vide suivante

    ci-joint vous trouverez le fichier avec le code VBA et le Userform, je vous prie de bien vouloir m'aider
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    Dans un premier temps, si le nom de tes texbox et ComboBox étaient un peu plus explicite, ça serait beaucoup plus simple pour toi pour lire ton code.

    par exemple, ComboBox1 correspond au code client => pourquoi tu l'appelle pas, par exemple, CmbCodeClient.
    et ainsi de suite pour tous tes contrôles utilisés dans ton formulaire.

    De même, tes textbox, renomme les en commençant par Txt, par exemple txtTel1.

    Ça sera beaucoup plus simple pour toi pour t'y retrouver dans ton code.

    Ensuite, normalement, pour moi, lorsque l'on met une ComboBox dans un formulaire, celle-ci doit être pré-renseignée par des valeurs par défaut. Est-ce normal que ça ne soit pas le cas ?

    Dans ton code pour rajouter un client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Private Sub CommandButton1_Click()
     Dim L As Integer
    If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
     L = Sheets("Feuil1").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
     Range("B" & L).Value = ComboBox1
    Range("C" & L).Value = ComboBox2
    Range("D" & L).Value = ComboBox3
    Range("E" & L).Value = ComboBox4
    Range("F" & L).Value = TextBox1
    Range("G" & L).Value = ComboBox5
    Range("H" & L).Value = TextBox2
    Range("I" & L).Value = TextBox3
    Range("J" & L).Value = TextBox4
    Range("K" & L).Value = TextBox5
    Range("L" & L).Value = ComboBox6
    Range("M" & L).Value = ComboBox7
    Range("N" & L).Value = ComboBox8
    Range("O" & L).Value = TextBox6
    Range("P" & L).Value = ComboBox9
    Range("Q" & L).Value = ComboBox10
    Range("R" & L).Value = TextBox7
    Range("S" & L).Value = ComboBox11
    Range("T" & L).Value = TextBox8
    Range("U" & L).Value = ComboBox12
    Range("V" & L).Value = ComboBox13
    Range("W" & L).Value = ComboBox14
    Range("X" & L).Value = ComboBox16
    Range("Y" & L).Value = ComboBox15
    Range("Z" & L).Value = TextBox9
    Range("AA" & L).Value = TextBox10
    Range("AB" & L).Value = TextBox11
    Range("AC" & L).Value = TextBox12
     End If
    Tu commence à la colonne B => du coup tu as tout qui est décalé. Normalement, Combobox1 va dans la colonne A

    Du coup, forcément, pour l'ajout d'un client, vu que tu regardes la colonne A, mais que tu inscrit à partir de la colonne B, ta valeur L est toujours identique, vu que tu ne met jamais rien dans ta colonne A

    En espérant, par ces derniers points, avoir répondu à tes interrogations
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Vous les promoteurs immobiliers!! Comme c'est difficile avec vous
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B" & L).Value = ComboBox1
    C'est à dire, tu écris en colonne B et comme la colonne A reste vide, cette ligne te donnera toujours la première cellule vide de la colonne A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = Range("A65000).End(xlUp).Row + 1
    Je te propose une idée plus facile et plus adaptable en utilisant le double clique sur la feuille.
    Si c'est une ligne déjà remplie, les contrôles de l'userform se rempliront par les données déjà existantes. On peut alors modifier ou supprimer ce qu'on souhaite
    Si c'est une ligne vide, on ajoute de nouvelles données.

    Aussi, il est souhaitable de nommer tes contrôles convenablement pour faciliter la maintenance et l'évolution du code: Au lieu de ComboBox1 on fera cboCodeClient ou cboCodeClient_1 (le 1 pour indiquer que c'est en liaison avec la colonne 1)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Conseillée commerciale
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseillée commerciale
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Je vous remercie énormément pour vos réponse et surtout pour votre réactivité,
    je vais essayer d'appliquer vos recommandations et je vous tiendrais au courants
    merci merci beaucoup

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Conseillée commerciale
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseillée commerciale
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Nikeeeel; Merci mercatog et illight vous me sauvez la vie là !!! vous êtes les meilleurs.

    les écritures sur la même ligne, ainsi que le décalage au niveau de la saisie du code client sont réglés en changeant ça

    Range("B" & L).Value = ComboBox1

    Par ça :

    Range("A" & L).Value = ComboBox1

    j'avoue que c'est bête, moins bête maintenant que vous m'avez expliqué

    maintenant j'ai un problème avec le bouton modifier

    Quand je sélectionne un client via son code, j'ai toutes les autres cases qui sont remplient automatiquement, c'est beau et c'est ce que je veux, je veux que ça se passe aussi avec la colonne "G" mais quand je modifie une entrée et que je clique sur modifier j'obtiens l'erreur (Erreur d’exécution '-2147024809 (80070057) alors que la saisie d'un nouveau client marche parfaitement maintenant.

    j'aimerais aussi soi automatisé la saisie d'un nouveau code client est ce possible avec ce que j'ai ?

    ou si non comment je fait pour affiché le formulaire en mode modification en cliquant sur une ligne déjà rempli et l'affiché en mode nouvelle saisie en double cliquant sur une ligne vide si c'est bien cela que vous vouliez dire (mercatog) ??.

    Merci d'avance

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour

    Voila le début de la proposition

    J'ai renommé tes contrôles convenablement comme ceci PrefNom_Suff
    Pref: préfixe Txt, Cbo ou Cmd (TextBox, ComboBox ou Bouton)
    Nom: Nom indicatif du contrôle
    Suff: Suffixe (nombre) indiquant la colonne de la feuille en lien avec le contrôle

    Exemples:
    CboModePaiem_12: c'est la ComboBox mode paiement liée avec la colonne L (12ème colonne)
    TxtClient_6: TextBox nom client liée à la colonne F

    J'ai ajouté une feuille CONFIG dans laquelle j'ai ajouté les items des différentes combobox. Preuve, il est plus facile d'ajouter une banque dans cette feuille de l'écrire en dur dans le code

    Les différentes colonnes sont nommées dynamiquement, c'est à dire on peut y ajouter des données sans toucher au code.

    Pour nommer les plages, j'ai utiliser la formule (exemple pour la liste des banques)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER(CONFIG!$D$1;;;NBVAL(CONFIG!$D:$D)+1)
    Le feuille de travail est nommée BD


    Code:

    Dans un module standard, j'ai déclaré les 2 variables publiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
     
    Public Nouv As Boolean                           'True si c'est une nouvelle entrée, sinon une entrée déjà existante
    Public Lig As Long                               'La ligne où lire ou écrire

    Dans le module de la feuille BD:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit
     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     
    If Target.Row > 1 Then
        Cancel = True
        Lig = Target.Row
        If Range("A" & Lig) = "" Then
            Nouv = True
            Lig = Cells(Rows.Count, 1).End(xlUp).Row + 1
        Else
            Nouv = False
        End If
        UserForm1.Show
    End If
    End Sub

    Dans le module de l'userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Option Explicit
    Dim Ws As Worksheet
     
    Private Sub UserForm_Initialize()
     
    Me.CboCodeClient_1.Enabled = False
    Me.CboModePaiem_12.RowSource = "ModePaiem"
    Me.CboCAFPI_13.RowSource = "Cafpi"
    Me.CboTypeCred_14.RowSource = "TypeCredit"
    Me.CboStatutDoss_17.RowSource = "StatutDoss"
    Me.CboBankClient_16.RowSource = "Bank"
    Me.CboMoisDepot_21.RowSource = "ListeMois"
    Me.CboAnneeDepot_22.RowSource = "ListeAnnees"
    Me.CboBankSelect_19.RowSource = "Bank"
     
    Set Ws = Worksheets("BD")
    ADDATA
    If Not Nouv Then IMPORT
    End Sub
     
    Private Sub ADDATA()
     
    If Nouv Then
        Me.CboCodeClient_1.Value = Lig - 1
        With Me.CmdValid
            .Caption = "Nouveau client"
            .BackColor = 180
        End With
    Else
        Me.CboCodeClient_1.Value = Ws.Range("A" & Lig)
        With Me.CmdValid
            .Caption = "Modifier client"
            .BackColor = 568712
        End With
    End If
    End Sub
     
    Private Sub CmdValid_Click()
     
    EXPORT
    Unload Me
    End Sub
     
    Private Function NUMCOL(ByVal Ctr As Control) As Integer
    Dim Tmp As String
     
    Tmp = Ctr.Name
    NUMCOL = Val(Mid(Tmp, InStrRev(Tmp, "_") + 1))
    End Function
     
    Private Sub EXPORT()
    Dim Ctr As Control
     
    If Lig > 0 Then
        For Each Ctr In Me.Controls
            If Left(Ctr.Name, 3) = "Cbo" Or Left(Ctr.Name, 3) = "Txt" Then Ws.Cells(Lig, NUMCOL(Ctr)) = Ctr.Value
        Next Ctr
    End If
    End Sub
     
    Private Sub IMPORT()
    Dim Ctr As Control
     
    If Lig > 0 Then
        For Each Ctr In Me.Controls
            If Left(Ctr.Name, 3) = "Cbo" Or Left(Ctr.Name, 3) = "Txt" Then Ctr.Value = Ws.Cells(Lig, NUMCOL(Ctr))
        Next Ctr
    End If
    End Sub
     
    Private Sub CmdQuit_Click()
     
    Unload Me
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     
    Lig = 0
    Nouv = False
    Set Ws = Nothing
    End Sub

    Fichier exemple

Discussions similaires

  1. Créer un formulaire de saisie sous Excel
    Par melchi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/02/2009, 11h42
  2. Formulaire de contacts sur Excel 2003
    Par enretard dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/07/2008, 11h06
  3. Débutant-Insertion dans table valeurs saisies sur formulaire
    Par Michel Hubert dans le forum Access
    Réponses: 2
    Dernier message: 14/04/2006, 19h38
  4. débutant-Insertion dans table valeurs saisies sur formulaire
    Par Michel Hubert dans le forum Access
    Réponses: 2
    Dernier message: 13/04/2006, 09h07
  5. entrée sur un formulaire de saisie
    Par aujero dans le forum Access
    Réponses: 2
    Dernier message: 22/02/2006, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo