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 :

incrémentation numéro de ligne Visual Basic


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut incrémentation numéro de ligne Visual Basic
    Bonjour,

    Je poste ce message car j'ai un problème de programmation!
    Je fais actuellement un masque de saisie pour une enquête de façon à ce que ce soit plus simple pour la personne qui va saisir les données, mais aussi que je récupère une table 'propre' pour analyser (je suis statisticienne).

    Il s'agit d'un formulaire simple qui demande de renseigner les initiales, le n°de dossier, la date de naissance, etc Et deux boutons: l'un qui permet d'annuler ce qui a été saisi et l'autre qui permet de poursuivre la saisie avec un autre userform et d'enregistrer.

    Ce que je voudrais c'est que lorsque le userform1 est ouvert :
    1. un numéro de ligne soit incrémenté automatiquement
    2. que la saisie se fasse sur la première ligne vide

    J'ai codé une partie, mais là je sèche! Lorsque je rentre un numéro de dossier, par exemple 123, alors je me retrouve avec trois lignes ayant: 1, 12, 123. Je ne comprends pas car les autres champs texte ne me font pas ça!

    J'ai mis en pièce jointe mon fichier Excel et VB

    Je n'ai pas de grande notion de Visual Basic donc si quelqu'un peut m'aider, je serai comblée !
    Merci d'avance!!

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    pour chercher la première ligne libre, tu peux consulter cette contribution d'ousk'l'nor

    Cordialement,

    PGZ

  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
    Ton approche consiste à reporter les données saisies dans ton userform vers la feuille "patient" au fur et à mesure de la saisie. C'est beaucoup de lignes de code, mais enfin, c'est un choix.

    Dans cette ligne de mire, j'ai déclaré une variable NewLig en début de module de ton usf, sa valeur sera reprise pour le transfert des données de chaque controle.
    le début est comme ceci
    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
    Option Explicit
     
    Dim NewLig As Long
     
    'Initialisation
    Private Sub UserForm_Initialize()
    Me.TextDate.Value = Format(Now(), "dd/mm/yyyy")
    Me.TextNaissance.Value = Format("dd/mm/yyyy")
    Me.TextTUT_ANNEE.Value = Format("dd/mm/yyyy")
    'Initialisation de la nouvelle ligne
    With Sheets("patient")
       NewLig = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    End With
    End Sub
     
    'N°de dossier
    Private Sub TextSUBJID_AfterUpdate()
    Sheets("patient").Range("A" & NewLig).Value = UCase(Me.TextSUBJID.Value)
    End Sub
    'Date
    Private Sub TextDate_AfterUpdate()
    Sheets("patient").Range("C" & NewLig).Value = Format(Me.TextDate.Value, "dd/mm/yyyy")
    End Sub
    'Examen effectué par
    Private Sub TextExam_AfterUpdate()
    Sheets("patient").Range("D" & NewLig).Value = UCase(Me.TextExam.Value)
    End Sub
    'Initiales du patient
    Private Sub TextInitial_AfterUpdate()
    Sheets("patient").Range("B" & NewLig).Value = UCase(Me.TextInitial.Value)
    End Sub
    'Date de naissance
    Private Sub TextNaissance_AfterUpdate()
    Sheets("patient").Range("E" & NewLig).Value = Format(Me.TextNaissance.Value, "dd/mm/yyyy")
    End Sub
    'Lieu de résidence
    Private Sub TextResid_AfterUpdate()
    Sheets("patient").Range("F" & NewLig).Value = Me.TextResid.Value
    End Sub
    'statut famo
    'célibataire
    Private Sub OptionCelib_Click()
    If Me.OptionCelib.Value = True Then Sheets("patient").Range("G" & NewLig).Value = Me.OptionCelib.Caption
    End Sub
    'marié
    Private Sub OptionMarie_Click()
    If Me.OptionMarie.Value = True Then Sheets("patient").Range("G" & NewLig).Value = Me.OptionMarie.Caption
    End Sub
    'divorcé
    Private Sub OptionDivorce_Click()
    If OptionDivorce.Value = True Then Sheets("patient").Range("G" & NewLig).Value = Me.OptionDivorce.Caption
    End Sub
    ' v|
    Private Sub OptionVeuf_Click()
    If Me.OptionVeuf.Value = True Then Sheets("patient").Range("G" & NewLig).Value = Me.OptionVeuf.Caption
    End Sub
    'vit en couple
    Private Sub OptionCouple_Click()
    If OptionCouple.Value = True Then Sheets("patient").Range("G" & NewLig).Value = Me.OptionCouple.Caption
    End Sub
    '...et le suite
    Et ne pas oublier de modifier le code du bouton suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandSuivant_Click()
    NewLig = NewLig + 1
    '...la suite
    End Sub

  4. #4
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut
    Merci beaucoup mercatog !

    Citation Envoyé par mercatog Voir le message
    Ton approche consiste à reporter les données saisies dans ton userform vers la feuille "patient" au fur et à mesure de la saisie. C'est beaucoup de lignes de code, mais enfin, c'est un choix.
    En fait je cherche juste à récupérer les infos saisies dans une table Excel, mais pas forcément au fur et à mesure de la saisie! Je t'avoues que j'ai trouvé ce type de code sur internet et je l'ai adopté car ça fonctionnait, mais si tu as un code plus court qui fait la même chose, je suis preneuse! Mais avec des explications! Le but est avant tout que je comprennes ce que je fais !

    En continuant sur mon code de départ:
    J'ai changé mon code par ce que tu m'as envoyé, mais j'ai encore des soucis!

    Avant toutes choses, je voudrais te poser des questions sur ce code que tu m'as envoyé:
    - A quoi servent les 'Me.' ?
    - pourquoi mets-tu 'AfterUpdate()' dans les private sub et non plus les 'Change()'? Qu'est-ce que ça change? Y-a-t-il un lien avec le 'load UserForm1' dans la commande du bouton suivant?
    - A quoi sert 'Ucase' ?

    Le problème que j'ai c'est que quand j'arrive sur le userForm, je complète un champs comme 'date' par exemple et lorsque je clique sur un autre champ (afin de le remplir), alors j'ai un message d'erreur:
    Erreur d'exécution '1004'
    Erreur définie par l'application ou par l'objet
    et ça me pointe (surlignage jaune) la ligne correspondante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("patient").Range("C" & NewLig).Value = Format(Me.TextDate.Value, "dd/mm/yyyy")
    Je suis vraiment désolé, mais j'ai un peu de mal avec Visual Basic pour le moment!

  5. #5
    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,
    1. Le Me indique l'usf, ça aide dans l'intelisense des contrôles. bon bref c'est un détail.
    2. J'ai choisi Afterupdate (lire après mise à jour) au lieu de Change parce que je ne veux reporter la donnée vers la feuille excel qu'une fois cette donnée est entièrement saisie dans le contrôle de mon usf
    3. Ucase permet de changer le texte en majuscule (aussi c'est un détail)
    4. pour l'erreur, remplace cette ligne par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("patient").Range("C" & NewLig).Value = Me.TextDate.Value

  6. #6
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut
    Je viens de remplacer la ligne mais toujours la même erreur! J'ai cette erreur pour n'importe quel champs et pas uniquement pour la date!
    Je remets le code en pièce jointe si tu souhaite y rejeter un coup d'oeil!
    En tous cas merci beaucoup pour tes réponses rapides!

Discussions similaires

  1. [Pratique] Effacer une ligne sous Visual Basic
    Par Overcrash dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/04/2010, 15h36
  2. Réponses: 3
    Dernier message: 07/10/2009, 11h55
  3. Compilation d'un Projet Visual Basic en ligne de commande
    Par Nico+10) dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/03/2007, 09h37
  4. Numéro automatique en visual basic et sur sur excel
    Par andregoub dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/06/2006, 22h08
  5. numéros de lignes dans visual c++
    Par heider dans le forum MFC
    Réponses: 7
    Dernier message: 24/08/2005, 14h06

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