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 :

problème modifier ligne a partir d'userform


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut problème modifier ligne a partir d'userform
    voici mon problème, j'ai creé un userform et je voudrais que le bouton modifier puisse modifier la ligne d'une feuille excel sur base du nom qui se trouve sur la case nom. avant de modifier, il doit demander confirmation à l'utilisateur. j'ai developpé deux codes différents mais sans grand résultat.
    voici le 1er:
    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
    Private Sub btnmodifier_Click()
    Dim q As String
    Dim i As Integer, fin&
    i = 2
    fin = Feuil5.Range("A" & Rows.Count).End(xlUp).Row
     
        Do While T_codeproduit.Value <> Feuil5.Cells(i, 1)
            i = i + 1
            If i > fin Then MsgBox " Le code spécifié n'existe pas ": GoTo 1
        Loop
        q = MsgBox("Confirmer modification?", vbCritical + vbYesNo)
        If q = vbYes Then
            Feuil3.Cells(i, 1) = T_codeproduit
            Feuil3.Cells(i, 1).Offset(0, 1) = T_prenom
            Feuil3.Cells(i, 1).Offset(0, 2) = T_nom
            Feuil3.Cells(i, 1).Offset(0, 3) = T_categorie
            Feuil3.Cells(i, 1).Offset(0, 4) = T_prixdachat
            Feuil3.Cells(i, 1).Offset(0, 5) = T_prixunitairedevente
            Feuil3.Cells(i, 1).Offset(0, 6) = T_stockreel
            Feuil3.Cells(i, 1).Offset(0, 7) = T_stockminimum
            Feuil3.Cells(i, 1).Offset(0, 8) = T_delaidereapprovisionnement
            MsgBox "Opéraion effectuée"
            Unload Me
            produits.Show
        End If
    1       MsgBox "Veuillez introduire un code peoduit"
    End Sub
    et le 2è
    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 btnmodifier_Click()
    Dim objtr As String
    Dim q As String
    Dim trouveNom As Range
        objtr = T_nom
        If T_nom <> "" Then
     
           Set trouveNom = [A:A].Find(objtr)
            If Not trouveNom Is Nothing Then
               q = MsgBox("modifier " & objtr & " ? ", vbCritical + vbYesNo)
                If q = vbYes Then
                    Feuil2.Rows(trouveNom.Row) = T_nom
               End If
                Unload Me
                employes.Show
            End If
        Else
            MsgBox " Introduisez un nom à supprimer"
        End If
    End Sub
    quelqu'un pourrait juste m'aider à y apporter des modifications pour que ca marche??

    le fichier sur le quel je travaille est joint. feuille employes
    merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé Avatar de smacksime
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    Bonjour,
    J'ai regardé attentivement votre code, et j'ai créer un Label en dessous de votre SpinButton qui retourne la valeur de la ligne affiché;
    De ce label, je peux modifier le champ "nom" grâce à la valeur retournée.
    Il vous faut adapter le code maintenant à votre sauce et si le label vous gêne, n'hésitez pas à changer la valeur Visible.
    A vous lire
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    merci ca marche, j'ai adapté et tout va pour le mieux

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonjour a tout les deux
    bien que la solution da smacksime est bonne je te propose quelque chose de plus propre que d'utiliser des controls pour memoriser une variable sans vouloir offencer smacksime bien sur
    jonathan00243 j'ai regarder un peu ton fichier

    j'ai commencer par ton userform "employes"

    j'ai revu le code ici et la un peu partout

    effectivement tu utilise des boucle doloop et wile a tout bout de champ
    c'est un peu lourd a mon goût
    a la place j'utilise la fonction "find le mot .row(ligne)" beaucoup plus rapide
    ensuite pour pouvoir modifier un ligne tu ne peu pas utiliser le textbox t_nom"
    pour la simple et bonne raison c'est que si tu modifie le nom (donc nouveau nom il ne te trouvera pas la ligne

    alors solution

    puisque tu base tout sur ton spin bouton

    au change de celui ci
    tu donne a la variable "nomrecherche" que j'ai déclaré en haut de module (donc disponible a tout moment) le mot de la cellule correspondant au numéro du spinbutton voila pour çà

    ensuite si tu fait une recherche par le bouton recherche la ligne est déterminée par encore une fois le "find mot .row"

    ensuite tu unload et reload ton usf pas la peine tu remet les textbox a vides tout simplement

    enfin j'ai modifier plein de petits truc notamment le spin button le max et le min

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    le min =2
    le max = Feuil2.Range("A65536").End(xlUp).Row
    tu n'a plus qu'a remplacer tout ton code dans le userform" employes" par le mien

    tu a maintenant la solution au même problème dans tes autres userforms


    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    Dim nomrecherche As String
    Dim ligne As Long
    Private Sub btncreer_Click()
    'ici a fin de gagnier du temp et de la memoire j'ai supprimer ta boucle do wile et je les remplacer par la variable i _
    dont la valeur prend directement lle numero de la ligne suivante la derniere ligne utilisée
    i = Sheets("employes").Cells(Rows.Count, 1).End(xlUp).Row + 1
     
    If T_nom.Value = "" Then ' si le t_nom est vide
    MsgBox "Veuillez completer le nom"
    Else
    'sinon
     
     
     
     
     
     
    ThisWorkbook.Sheets("employes").Cells(i, 1) = T_nom
    ThisWorkbook.Sheets("employes").Cells(i, 2) = T_prenom
    ThisWorkbook.Sheets("employes").Cells(i, 3) = T_fonction
    ThisWorkbook.Sheets("employes").Cells(i, 4) = T_matricule
    ThisWorkbook.Sheets("employes").Cells(i, 5) = T_datedenaissance
    ThisWorkbook.Sheets("employes").Cells(i, 6) = T_adresse
    ThisWorkbook.Sheets("employes").Cells(i, 7) = T_codepostal
    ThisWorkbook.Sheets("employes").Cells(i, 8) = T_ville
    ThisWorkbook.Sheets("employes").Cells(i, 9) = T_pays
    ThisWorkbook.Sheets("employes").Cells(i, 10) = T_salairebrutannuel
    ThisWorkbook.Sheets("employes").Cells(i, 11) = T_numerodetelephone
    ThisWorkbook.Sheets("employes").Cells(i, 12) = T_numerodegsm
    ThisWorkbook.Sheets("employes").Cells(i, 13) = T_email
    MsgBox "Opération effectuée"
    End If
    'ici on vide les textboxs pour eviter de reloader le userform comme tu le fesait avant
    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "TextBox" Then ctrl.Value = ""
    Next
    End Sub
     
    Private Sub btnmodifier_Click()
    Dim objtr As String
    Dim q As String
     
        objtr = nomrecherche
        If T_nom <> "" Then
    '****************************************
    With Sheets("employes").Range("a1:a" & Sheets("employes").Cells(Rows.Count, 1).End(xlUp).Row)
        Set c = .Find(objtr, LookIn:=xlValues)
        If Not c Is Nothing Then q = MsgBox("modifier " & objtr & " ? ", vbCritical + vbYesNo)
     
                If q = vbYes Then
           If i = 0 Then i = ligne
            ligne = c.Row
     
    ThisWorkbook.Sheets("employes").Cells(i, 1) = T_nom
    ThisWorkbook.Sheets("employes").Cells(i, 2) = T_prenom
    ThisWorkbook.Sheets("employes").Cells(i, 3) = T_fonction
    ThisWorkbook.Sheets("employes").Cells(i, 4) = T_matricule
    ThisWorkbook.Sheets("employes").Cells(i, 5) = T_datedenaissance
    ThisWorkbook.Sheets("employes").Cells(i, 6) = T_adresse
    ThisWorkbook.Sheets("employes").Cells(i, 7) = T_codepostal
    ThisWorkbook.Sheets("employes").Cells(i, 8) = T_ville
    ThisWorkbook.Sheets("employes").Cells(i, 9) = T_pays
    ThisWorkbook.Sheets("employes").Cells(i, 10) = T_salairebrutannuel
    ThisWorkbook.Sheets("employes").Cells(i, 11) = T_numerodetelephone
    ThisWorkbook.Sheets("employes").Cells(i, 12) = T_numerodegsm
    ThisWorkbook.Sheets("employes").Cells(i, 13) = T_email
     
    '***********************************************
     
    End If
     
    End With
    End If
    nomrecherche = ""
    End Sub
     
    Private Sub btnquitter_Click()
    Unload Me
    End Sub
    Private Sub btnrecherche_Click()
      If T_nom.Value = "" Then
        MsgBox "Veuillez introduire un nom "
        Exit Sub
      End If
     With Sheets("employes").Range("a1:a" & Sheets("employes").Cells(Rows.Count, 1).End(xlUp).Row)
        Set c = .Find(T_nom, LookIn:=xlValues)
        If Not c Is Nothing Then
        Me.SpinButton2 = c.Row
      Else
        MsgBox "Aucun résultat !" & Chr(10) & "Essayez à nouveau "
     
      End If
    btncreer.Enabled = False
    nomrecherche = T_nom
    End With
     
    End Sub
     
    Private Sub btnsupprimer_Click()
    'ici on va faire plus simple et plus rapide que ta boucle do/loop
    If T_nom <> "" Then
    With Sheets("employes").Range("a2:a" & Sheets("employes").Cells(Rows.Count, 1).End(xlUp).Row) ' avec la plage a2 jusqu'a la derniereligne rempli _
    du sheets "employes"
    Set c = .Find(T_nom, LookIn:=xlValues) 'on va tester si le nom qui est dans le "T_NOM" existe
        If Not c Is Nothing Then 'si il existe
     
    Sheets("employes").Rows(.Find(T_nom, LookIn:=xlValues).Row).Delete 'la ligne comportant ce nom sera supprimer
    Else
    ' si il existe pas le message box te le signalant
    MsgBox "ce nom n'existe pas" & vbCrLf & "entrez un nom a nouveau"
    End If
    End With
    End If
    'ici on vide les textboxs pour eviter de reloader le userform comme tu le fesait avant
    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "TextBox" Then ctrl.Value = ""
    Next
    End Sub
     
     
     
     
    Private Sub F_employes_Click()
     
    End Sub
     
    Private Sub SpinButton2_Change()
    Dim i As Long
     
     
       i = Me.SpinButton2.Value
       With Feuil2
        nomrecherche = .Cells(i, 1)
        ligne = i
        T_nom = .Cells(i, 1)
        T_prenom = .Cells(i, 2)
        T_fonction = .Cells(i, 3)
        T_matricule = .Cells(i, 4)
        T_datedenaissance = .Cells(i, 5)
        T_adresse = .Cells(i, 6)
        T_codepostal = .Cells(i, 7)
        T_ville = .Cells(i, 8)
        T_pays = .Cells(i, 9)
        T_salairebrutannuel = .Cells(i, 10)
        T_numerodetelephone = .Cells(i, 11)
        T_numerodegsm = .Cells(i, 12)
        T_email = .Cells(i, 13)
      End With
     
    End Sub
     
    Private Sub SpinButton2_SpinDown()
       If Me.SpinButton2.Value < 2 Then Me.SpinButton2.Value = Feuil2.Range("A65536").End(xlUp).Row
     End Sub
     
    Private Sub SpinButton2_SpinUp()
      If Me.SpinButton2.Value > Feuil2.Range("A65536").End(xlUp).Row Then Me.SpinButton2.Value = 2
    End Sub
     
     
     
    Private Sub T_datedenaissance_Change()
     Dim Valeur As Byte
        T_datedenaissance.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
        Valeur = Len(T_datedenaissance)
        If Valeur = 2 Or Valeur = 5 Then T_datedenaissance = T_datedenaissance & "/"
    End Sub
     
    Private Sub T_numerodetelephone_Change()
     
    End Sub
    en esperant t'avoir été utile
    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    je dois dire que je suis bluffé, agréablement surpris. tout ton code fonctionne correctement. cependant tu as retiré deux options: pour le bouton suprimer et modifer, il effectue les actions directements sans demander confirmation. serait-l possible de les ajouter? voici ce que j'ai fait:

    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
    Private Sub btnsupprimer_Click()
    dim q as string
    If T_nom <> "" Then
    With Sheets("employes").Range("a2:a" & Sheets("employes").Cells(Rows.Count, 1).End(xlUp).Row)
    Set c = .Find(T_nom, LookIn:=xlValues)
        If Not c Is Nothing Then
        msgbox " confirmer suppression?",vbYesNo
        if q=vbYes then
    Sheets("employes").Rows(.Find(T_nom, LookIn:=xlValues).Row).Delete
    end if
    Else
    MsgBox "ce nom n'existe pas" & vbCrLf & "entrez un nom a nouveau"
    End If
    End With
    End If
    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "TextBox" Then ctrl.Value = ""
    Next
    End Sub
    mais ca ne marche pas, pareil pour modifier. pendant que j'y suis. puis je te demander comment faire pour que lorsque j'ajoute un achat de produit dans la feuille ventes, le stock réel dans la feuille produits augmente de 1, lorsque je supprime un achat, que le stock reel dans la feuille produits diminue de 1. pareil pour la vente, lorsque j'augmente une vente dans la feuille vente, que le stock reel dans la feuille produit diminue de 1 et inversement.

    merci infiniment pour ton temps et ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Problème pour modifier et enregistrer à partir de textbox
    Par inwhiskywetrust dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 20/03/2015, 12h23
  2. [XL-2010] VBA - Modifier une image à partir d'un Userform
    Par soso882 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/09/2014, 18h58
  3. [Toutes versions] Modifier la caption de l'userform en 1 seule ligne
    Par patricktoulon dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/03/2013, 19h26
  4. Problème extraire ligne d'une table
    Par bubi dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/11/2005, 10h35
  5. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53

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