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 :

Application de prospection VBA - Sélection d'une ligne en cours de modification avec RANGE


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut Application de prospection VBA - Sélection d'une ligne en cours de modification avec RANGE
    Bonjour,

    Je crée actuellement une application pour mon travail qui consiste à enregistrer toutes les informations que je vais glaner lors de mes séances de prospection.

    J'ai crée deux Userforms se référant à deux onglets différents de ma feuille : un pour la saisie de nouvelles fiches client (Creation_FC), et l'autre pour la saisie de mes fiches prospection (Creation_FP). Mes deux feuilles (nommées 'Clients' et 'Prospection') sont communes par leurs champs 'Code client' et 'Nom société', en colonnes A et B

    Concernant mon Userform clients (Creation_FC) qui permet de créer, modifier mes informations prospects/clients, aucun souci d'incrémentation quand je crée de nouvelle fiches, je parviens bien à utiliser la commande ".Range("a65536").End(xlUp).Row + 1"

    J'ai tenté d'utiliser le même procédé pour l'autre Userform (Creation_FP) mais je rencontre un souci de controle dont je ne me dépètre pas.
    Dans la feuille correspondante, j'ai, par exemple, des colonnes 'Mode de contact 1', 'Type 1', 'Fonction 1', 'Mode de contact 2', 'Type 2', 'Fonction 2'

    Mes manipulations sont les suivantes (à chaque nouvel enregistrement, je souhaite ne pas écraser les données précédemment écrites) :
    - je sélectionne mon client via une ComboBox, puis je saisis mes infos de 'Mode de contact', 'Type', 'Fonction', puis j'enregistre (jusque là, tout va bien), puis je vide mes champs (mes données sont bien enregistrées, aucun souci)
    - je re-sélectionne le même client, puis, pour une nouvelle saisie dans les MEMES champs, j'indique dans mon code -- "If IsEmpty(Range("D2 : D1000")) Then .. -- ne pas réécrire dans les champs 'Mode de contact 1', 'Type 1', 'Fonction 1' mais plutôt dans les champs 'Mode de contact 2' 'Type 2', 'Fonction 2'.

    -> Le code que j'ai écris fonctionne très bien lorsqu'il y a 1 seul enregistrement dans ma feuille, mais pas quand j'agis sur une autre ligne.
    Je pense que le souci provient surement de mon Range, puisqu'il est défini sur la colonne D entière, donc la condition est toujours TRUE pour les autres enregistrements, mais je ne vois pas comment faire un 'Select' de la ligne en cours de modification, puis modifier le pointeur en conséquence.

    Bien entendu, je suis débutant en programmation car mon cœur de métier est plutôt son pendant, çàd l'administration systèmes et réseaux, donc veuillez pardonner mon manque de concision dans mes explications.

    D'avance, merci de vos suggestions. La solution doit être surement à votre portée d'experts, mais là, je sèche depuis 2 jours de recherches et de tests dans tout les sens :/


    Ci-après, un petit bout de code qui pourra peut-être vous éclairer :

    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
    Private Sub CommandButton1_Click() 'Affiche les informations de la ComboBox de recherche
     
    Dim L As Integer
     
    Set Ws1 = Sheets("Prospection")
    L = ComboBox100.ListIndex + 2
     
    TextBox1.Value = Ws1.Cells(L, 1) 'Code client
    TextBox2.Value = Ws1.Cells(L, 2) 'Société
     
    End sub
     
    Private Sub Save_Button_Click()
     
    Dim Ctrl As Control
    Dim Data1FieldEmpty As Boolean
    Dim R As Integer
    Dim L1 As Integer
     
    Set Ws1 = Sheets("Prospection")
     
    If MsgBox("Confirmez vous l'ajout de ces nouvelles données de prospection ?", vbYesNo, "Enregistrement de la saisie") = vbYes Then
     
    With Me
    L1 = Ws1.Range("a65536").End(xlUp).Row
     
    For Each Ctrl In Creation_FP.Controls
    R = Val(Ctrl.Tag)
    If R > 0 Then Ws1.Cells(L1, R) = Ctrl
    Next
     
    End With
     
    ' ---- Verification si Data1 est vide ----
    If IsEmpty(Range("D2 : D1000")) Then 'La colonne D représente "Date 1", date fixée dans par défaut dans une TextBox
    Data1FieldEmpty = False
     
    'Sauvegarde du 1er enregistrement
    Ws1.Range("E" & L1).Value = ComboBox1 'Rempli la colonne E, nommée Mode de contact 1
    Ws1.Range("F" & L1).Value = ComboBox2 'Rempli la colonne F, nommée Type 1
    Ws1.Range("J" & L1).Value = ComboBox3 'Rempli la colonne J, nommée Fonction 1
     
    Else
     
    Data1FieldEmpty = True
     
    MsgBox "Les champs Mode de contact 2, Type 2, Fonction 2" seront remplis", vbInformation
     
    'Sauvegarde du 2ème enregistrement (dans le but de ne pas écraser les premières données saisies)
    Ws1.Range("R" & L1).Value = ComboBox1 'Rempli la colonne R, nommée Mode de contact 2
    Ws1.Range("S" & L1).Value = ComboBox2 'Rempli la colonne S, nommée Type 2
    Ws1.Range("W" & L1).Value = ComboBox3 'Rempli la colonne W, nommée Fonction 2
     
    MsgBox "La fiche de prospection a été mise à jour pour ce client", vbExclamation, "Enregistrement effectué"
     
    For Each Ctrl In Me.Controls
    If TypeName(Ctrl) = "TextBox" Then Ctrl.Text = ""
    If TypeName(Ctrl) = "ComboBox" Then Ctrl.Text = ""
    Next Ctrl
     
    End If
    End If
    End If
    End If
     
    End Sub
    Si besoin de poster le projet (330Ko), dites le moi car j'espère ne pas avoir oublié d'informations importantes qui pourraient vous aider à y voir plus clair.
    D'avance, grand merci de vos réponses

  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
    13 176
    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 : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pas certain d'avoir bien compris ton problème mais peut-être que la lecture de cette contribution USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire pourra t'aider
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut
    Bonjour Philippe et merci pour cet exemple qui est très clair dans sa conception, je vais surement repartir sur des bases identiques en terme de code car c'est très épuré.


    Pour mieux illustrer ma question initiale, et, après avoir consulté le code de ce USERFORM, j'ai tenté de faire un test simple dans celui-ci :

    - Dans la feuille, j'ai ajouté 2 colonnes, une nommée Date1, l'autre Date2
    - J'ai aussi ajouté dans le userform UNE textbox 'Date' (dont le label est 'txtDate')

    Puis, je crée une nouvelle fiche, et je remplis tous mes champs (Nom, Prénom, Adresse, Date)

    Ce que je souhaiterais, c'est que lorsque je modifie cette même fiche, si la colonne Date1 contient déjà une valeur, ne pas l'écraser mais plutôt l'inscrire dans la colonne Date2

    En espérant avoir été plus clair car c'est vraiment le cœur de mon problème
    D'avance, grand merci de votre aide.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    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 : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Cela signifie si j'ai bien compris que dans le cas décrit
    - Dans la feuille, j'ai ajouté 2 colonnes, une nommée Date1, l'autre Date2
    - J'ai aussi ajouté dans le userform UNE textbox 'Date' (dont le label est 'txtDate')
    et
    Ce que je souhaiterais, c'est que lorsque je modifie cette même fiche, si la colonne Date1 contient déjà une valeur, ne pas l'écraser mais plutôt l'inscrire dans la colonne Date2
    Le nombre de contrôles du USERFORM n'est pas le reflet des champs de la liste de données et que donc le contrôle TextBox nommé txtDate doit avoir comme valeur le contenu de Date1 ou Date2 de l'enregistrement courant suivant que Date1 est vide ou pas.
    Je vois deux solutions, soit une condition comme l'instruction IF ou IIF, soit créer deux contrôles TextBox (txtDate1 et txtDate2)contenant respectivement les valeurs de Date1 et Date2 mais en mettant la propriété Visible à True ou False suivant les contenus de Date1 et Date2. Ce dernier scénario étant plus simple à gérer lors de l'écriture de l'enregistrement car il évitera une seconde procédure décisionnelle.
    Reste une question, que se passe-t'il si à la lecture de l'enregistrement courant Date1 et date2 contiennent une valeur ?

    Une autre option consisterait à afficher les deux TextBox mais en empêchant l'encodage de l'un des deux à l'aide de la propriété Enable
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. VBA EXCEL - Sélection d'une ligne suivant saisie
    Par brethomeau dans le forum Macros et VBA Excel
    Réponses: 48
    Dernier message: 15/11/2005, 17h41
  2. Réponses: 14
    Dernier message: 01/12/2004, 15h20
  3. Sélection d'une ligne dans un JTable
    Par dam21 dans le forum Composants
    Réponses: 3
    Dernier message: 28/07/2004, 12h57
  4. sélection d'une ligne DBGrid par clic
    Par duffman dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/05/2004, 13h45
  5. Déplacer la sélection d'une ligne dans un stringgrid
    Par jer64 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/03/2003, 00h57

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