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 :

UserForm : Alimenter une base de données en continu - Petit point sur macro à résoudre


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Employé administratif
    Inscrit en
    Février 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé administratif

    Informations forums :
    Inscription : Février 2014
    Messages : 77
    Points : 28
    Points
    28
    Par défaut UserForm : Alimenter une base de données en continu - Petit point sur macro à résoudre
    Bonjour,

    Je me suis aidé d'un modèle pour réaliser ma macro, mais seule la cellule A3 est sélectionnée et se remplie.
    L'entête du tableau commence dans la cellule A2.
    La cellule A3 se remplie, mais seulement la cellule A3 (pas les suivantes).
    Je souhaiterais que si la cellule A3 est remplie, sélectionne A4 et remplie A4, si la cellule A4 et remplie, sélectionne A5 et remplie, etc...
    Qu'est-ce qui cloche par rapport à l'exemple ci-dessous, qui fonctionne comme je le souhaiterais, c'est-à dire que le tableau se remplisse tant que le formulaire n'est pas fermé.
    Je n'arrive pas à voir la différence avec mon exemple.
    Ci-joint, ma réalisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub ANNULER_Click()
    'bouton ANNULER
    SaisieInfos.Hide 'cache le formulaire'
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub FERMER_Click()
    'Ferme le formulaire après demande de confirmation'
    If MsgBox("Confirmez-vous la fin de la saisie ?", vbQuestion + vbYesNo) = vbYes Then
    Unload Me 'supprime le formulaire de la mémoire'
    End If
    End Sub
    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
    Private Sub OK_Click()
    'bouton OK
    Dim Décalage As Integer
    'Sélection de la feuille de données'
    Sheets("Données").Select
    'si la base de données est vide, placer les informations à partir de A2'
    If Range("A2").Value = "" Then
    Décalage = 0
    Range("A2").Select
    Else
    'positionnement sur curseur de la première cellule vide'
    Décalage = 1
    Position = Range("A1").End(xlDown).Address
    Range(Position).Select
    Range("A1").End(xlDown).Select
    End If
    'Mise à jour de la base de données'
    ActiveCell.Offset(Décalage, 0).Range("A1").Select
    ActiveCell.Value = Distributeur
    ActiveCell.Offset(0, 1).Range("A1").Select
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Userform_Activate()
    'alimenter la liste Distributeur
    Dim DerDistributeur As String
    DerDistributeur = Range("B2").End(xlDown).Address 'définition de l'adresse du dernier Distributeur de la liste'
    Distributeur.RowSource = ("B2:") & DerDistributeur 'attribution des données source à la ComboBox Distributeur'
    Distributeur.ListIndex = 0 'sélection par défaut du premier élément de la liste'
    End Sub
    ##################################################################################################################################################################################################
    Ci-joint, l'exemple qui m'a permis de réaliser le modèle présenté ci-dessous :

    Début EXEMPLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub FIN_Click()
    SaisieInfos.Hide
    End Sub
    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
    Private Sub OK_Click()
    Dim Décalage As Integer
    'Vérification de la saisie des différentes informations'
    If NomPrenom = "" Or DateEmbauche = "" Or Salaire = "" Then
    MsgBox "VEUILLEZ SAISIR TOUTES LES INFORMATIONS"
    Else
    If TypeContrat <> "CDI" And DateFin = "" Then
    MsgBox "VEUILLEZ SAISIR LA DATE DE FIN DE CONTRAT"
    Else
    'Sélection de la feuille Données'
    Sheets("Salariés").Select
    'si la la base de données est vide, placer les informations à partir de A2'
    If Range("a2").Value = "" Then
    Décalage = 0
    Range("a2").Select
    Else
    'Positionnement sur curseur sur la première cellule vide
    Décalage = 1
    Position = Range("A1").End(xlDown).Address
    Range(Position).Select
    Range("A1").End(xlDown).Select
    End If
    'Mise à jour de la base de données
    ActiveCell.Offset(Décalage, 0).Range("a1").Select
    ActiveCell.Value = Usine
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.Value = Service
    ActiveCell.Offset(0, 1).Range("a1").Select
    ActiveCell.Value = NomPrenom
    ActiveCell.Offset(0, 1).Range("a1").Select
    ActiveCell.Value = TypeContrat
    ActiveCell.Offset(0, 1).Range("a1").Select
    ActiveCell.Value = CDate(DateEmbauche.Value)
    ActiveCell.Offset(0, 1).Range("a1").Select
    If TypeContrat <> "CDI" Then ActiveCell.Value = CDate(DateFin.Value)
    ActiveCell.Offset(0, 1).Range("a1").Select
    ActiveCell.Value = CCur(Salaire)
    'retour à la feuille Listes'
    Sheets("Listes").Select
    'Me.DateFin.Visible = False
    Me.EtiqDateFin.Visible = False
    NomPrenom = ""
    DateEmbauche = ""
    Salaire = ""
    DateFin = ""
    End If
    End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub TypeContrat_Change()
    If TypeContrat <> "CDI" Then
    'Me.DateFin.Visible = True
    Me.EtiqDateFin.Visible = True
    End If
    End Sub
    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
    Private Sub UserForm_Activate()
    'alimenter la liste Usine'
    Dim DerUsine As String
    DerUsine = Range("G2").End(xlDown).Address
    Usine.RowSource = ("G2:") & DerUsine
    Usine.ListIndex = 0
    'alimenter la liste Service'
    Dim DerService As String
    DerService = Range("H2").End(xlDown).Address
    Service.RowSource = ("H2:") & DerService
    Service.ListIndex = 0
    'alimenter la liste TypeContrat'
    Dim DerTypeContrat As String
    DerTypeContrat = Range("I2").End(xlDown).Address
    TypeContrat.RowSource = ("I2:") & DerTypeContrat
    TypeContrat.ListIndex = 0
    'masquer le textBox DateFin et son étiquette'
    'Me.DateFin.Visible = False
    Me.EtiqDateFin.Visible = False
    End Sub
    Fin EXEMPLE
    Quelqu'un peut-il corriger cette macro, dans le même type que l'exemple modèle ?
    Vous en remerciant par avance, pour la contribution apportée.

    Cordialement

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 932
    Points : 28 927
    Points
    28 927
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En structurant et en découpant ton code, tu aurais plus de chances d'arriver à un résultat satisfaisant
    Exemple pour une plage de deux colonnes avec un UserForm contenant deux contrôles TextBox nommés TextBox1 et TextBox2 et deux CommandButton nommés CmdOk et CmdCancel.
    Code bien entendu à adapter pour ton cas.
    Je n'ai pas prévu de MsgBox si on clique sur Cancel mais je suppose que tu pourras facilement l'ajouter

    La procédure d'initialisation avec la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
    Dim rng As Range
    Private Sub UserForm_Initialize()
     InitRange
    End Sub
    Les deux procédures événementielles des contrôles CmdOK et CmdCancel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub cmdCancel_Click()
     Unload Me
    End Sub
    ' ====
    Private Sub cmdOk_Click()
     WriteRecord
     InitTextBox
    End Sub
    Procédure d'écriture dans la plage de données (pour cet exemple on ajoute 1 au nombre de lignes de la plage.
    Normalement, je prévois un argument pour le n° de ligne où doit s'écrire les données pour pouvoir utiliser cette procédure à la fois pour la modification de données et pour un ajout de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub WriteRecord()
     With rng
     .Cells(.Rows.Count + 1, 1) = Me.TextBox1
     .Cells(.Rows.Count + 1, 2) = Me.TextBox2
     End With
     InitRange ' Recalcul la plage
    End Sub
    Procédure permettant d'assigner à la variable Rng la référence à la plage de données. A recalculer chaque fois que l'on ajoute une ligne à cette dernière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub InitRange()
     Set rng = ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
    End Sub
    Procédure qui efface les valeurs des contrôles TextBox et rend le focus à TextBox1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub InitTextBox()
     With Me: .TextBox1 = "": .TextBox2 = "": .TextBox1.SetFocus: End With
    End Sub

Discussions similaires

  1. [XL-2003] UserForm : Alimenter une base de données
    Par BtjpsspgrW dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/09/2014, 08h32
  2. alimenter une base de données en important automatiquement un fichier excel
    Par ApprentiDeveloppeur dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/04/2010, 07h58
  3. [AC-2007] Formulaire d'entrée pour alimenter une base de donnée
    Par vieux plongeur dans le forum IHM
    Réponses: 2
    Dernier message: 10/07/2009, 06h17
  4. [Conception] Alimenter une base de données à partir d'un fichier texte
    Par gharbi5 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/10/2007, 13h12
  5. Réponses: 3
    Dernier message: 13/08/2006, 10h50

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