[VBA]modifications de données

jc41 Messages postés 3 Statut Membre -  
gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   -
bonjour à tous
je suis débutant dans l'utilisation des macros et vba
j'ai créé un userform pour insérer mes données dans excel via un formulaire à remplir
mais je bloque sur la marche à suivre pour faire le chemin inverse
je m'explique : une fois rentré mes données je vais devoir les modifier de temps en temps et donc je souhaiterais par exemple avoir une cmdbouton pour retourner à mon formulaire avec les informations de la ligne choisie et pouvoir les modifier et de nouveau les réinsérer
merci de votre aide et je reste à disposition pour éclaircir mon souhait si je suis pas compréhensible pour tous
Configuration: Windows 2003
Internet Explorer 6.0

4 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    je doute un peu que tu puisses faire ta modification avec le userform de création,
    de manière simple et efficace.

    lorsque tu crées un nouvel enregistrement, tu insères ta ligne en bas de feuille,
    du moins je suppose.

    lorsque tu modifies, tu dois remettre les données sur la même ligne.
    dans ce cas là tu peux peut-être modifier ta ligne en double cliquant dessus,
    puis ouvrir une userform avec les données de la ligne
    tout cela lors de l'événement before double clic,
    et ce sera ainsi beaucoup plus facile à gérer.

    si je n'ai pas bien compris, précise ton projet.
    0
    1. jc41 Messages postés 3 Statut Membre
       
      bonjour

      c'est tout à fait mon besoin, mais je ne connais pas le code pour rappeler mes données dans un userform de modification, admettons que je saisie un nom, prénom, adresse, ville et cp, pour un changement d'adresse je dois modifier les champs adresse ville et cp. maintenant un mariage je dois modifier le nom. je pense que pour simplifier mon formulaire je dois rappeler toutes mes donées donc réutiliser un userform quasi identique à celui de création ?
      Merci de votre aide.
      0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    je pense que pour simplifier mon formulaire je dois rappeler toutes mes donées donc réutiliser un userform quasi identique à celui de création ?
    C'est tout à fait cela, le formulaire est identique, mais la fonction est complètement différente.

    je ne connais pas le code pour rappeler mes données dans un userform de modification,

    Dans la feuille concernée, tu crées cette macro :
    Public Sub Worksheet_BeforeDoubleClick(ByVal sel As Range, Cancel As Boolean)

    la valeur sel.row te donnes la ligne sur laquelle sont tes données.

    admettons que je saisie un nom, prénom, adresse, ville et cp
    donc le nom est en colonne 1, le prénom est en colonne 2,etc...

    Pour ramener, les données dans le formulaire tu mets :

    user.nom = cells(sel.row,1).value avec user.nom remplacé par ta zone de formulaire.

    idem pour le reste.

    après modification, c'est l'inverse :
    cells(sel.row,1).value = user.nom

    voilà la base et bon courage pour la réalisation.

    --

    toujours zen
    0
    1. jc41 Messages postés 3 Statut Membre
       
      tout d'abord merci de ton aide, j'ai saisie ta macro seulement j'ai une erreur de compilation qui survient pour simplifier la chose je te joint mon code de départ :

      >pour le code feuille :

      Private Sub lancemachinesvendues_Click()
      MachinesVendues.Show
      End Sub

      Private Sub machinesvendues_Click()

      End Sub

      Private Sub Worksheet_beforedoubleclick(ByVal sel As Range, cancel As Boolean)

      MachinesVendues = Cells(sel.Row, 1).Value

      End Sub


      >pour le userform :

      Private Sub CmdAnnuler_Click()
      Unload Me
      End Sub
      Private Sub CmdOK_Click()
      'on teste la saisie du client...
      If Me.TxtClient.Text = "" Then
      MsgBox "vous devez entrer un client"
      Me.TxtClient.SetFocus
      Exit Sub
      End If
      'on teste la saisie du département...
      If Me.TxtDpt.Text = "" Then
      MsgBox "vous devez entrer un département"
      Me.TxtDpt.SetFocus
      Exit Sub
      End If
      'on teste la saisie de la marque...
      If Me.TxtMarque.Text = "" Then
      MsgBox "vous devez entrer la marque"
      Me.TxtMarque.SetFocus
      Exit Sub
      End If
      'on teste la saisie de la type...
      If Me.Txttype.Text = "" Then
      MsgBox "vous devez entrer le type"
      Me.Txttype.SetFocus
      Exit Sub
      End If
      'on teste la saisie de la N°Série...
      If Me.Txtnserie.Text = "" Then
      MsgBox "vous devez entrer un N° de série"
      Me.Txtnserie.SetFocus
      Exit Sub
      End If
      'on teste la saisie de l'année ...
      If Me.Txtannee.Text = "" Then
      MsgBox "vous devez entrer l'année"
      Me.Txtannee.SetFocus
      Exit Sub
      End If
      'on teste la saisie de la pression...
      If Me.Txtpression.Text = "" Then
      MsgBox "vous devez entrer la pression"
      Me.Txtpression.SetFocus
      Exit Sub
      End If
      'on teste la saisie de nbh/an...
      If Me.Txtnbhan.Text = "" Then
      MsgBox "vous devez entrer le nombre d'heure de fonctionnement par an"
      Me.Txtnbhan.SetFocus
      Exit Sub
      End If
      'on teste la saisie de nbh/cycle...
      If Me.Txtnbhcycle.Text = "" Then
      MsgBox "vous devez entrer le nombre d'heure par cycle d'entretien"
      Me.Txtnbhcycle.SetFocus
      Exit Sub
      End If
      'conversion du nom et prénom en NOMPROPRE
      clientconverti = Application.WorksheetFunction.Proper(Me.TxtClient.Text)
      marqueconverti = Application.WorksheetFunction.Proper(Me.TxtMarque.Text)
      'mise en place des données dans la feuille de calcul
      Range("a65536").End(xlUp).Offset(1, 0).Value = clientconverti
      Range("c65536").End(xlUp).Offset(1, 0).Value = marqueconverti
      Range("b65536").End(xlUp).Offset(1, 0).Value = Me.TxtDpt.Text
      Range("d65536").End(xlUp).Offset(1, 0).Value = Me.Txttype.Text
      Range("e65536").End(xlUp).Offset(1, 0).Value = Me.Txtnserie.Text
      Range("f65536").End(xlUp).Offset(1, 0).Value = Me.Txtannee.Text
      Range("g65536").End(xlUp).Offset(1, 0).Value = Me.Txtpression.Text
      Range("h65536").End(xlUp).Offset(1, 0).Value = Me.Txtnbhan.Text
      Range("i65536").End(xlUp).Offset(1, 0).Value = Me.Txtnbhcycle.Text
      'on décharge le formulaire
      Unload Me 'de cette facon à la prochaine saisie les textbox seront vides à l'ouverture
      End Sub



      Private Sub UserForm_Click()

      End Sub

      merci d'apporter les modifs nécessaire, avec une petite annotation pour que je puisses comprendre mes erreurs. Encore une fois merci.
      0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    j'ai une erreur de compilation qui survient
    dans ce cas là tu est positionné sur l'erreur et il faudrait donner la ligne de code.

    ce doit être là MachinesVendues = Cells(sel.Row, 1).Value


    "MachinesVendues" c'est le nom de ta grille (form)
    l'appellation de ta zone c'est quelque chose comme "Me.TxtDpt.Text "

    dans "Cells(sel.Row, 1).Value" le 1 désigne la colonne,
    mais pour que ton code te permette de déplacer tes colonnes,
    il faudrait nommer la colonne des noms, par ex "patro"
    et alors tu peux mettre "Cells(sel.Row, range("patro").column).Value"
    et si tu insére une colonne avant ta colonne "patro",
    ton code continue de fonctionner sans problème.

    de même Range("a65536").End(xlUp).Offset(1, 0).Value = clientconverti

    devient
    Cells(65536, Range("patro").Column).End(xlUp).Offset(1, 0).Value = clientconverti

    bon courage et à bientôt.
    0
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Private Sub Worksheet_beforedoubleclick(ByVal sel As Range, cancel As Boolean)
    Me.TxtClient.Text = Cells(sel.Row, 1).Value


    C'est normal qu'il y ait erreur, car tu n'as pas lancé ton userform,
    et Me.TxtClient.Text n'est pas connu.

    tu dois mettre avant : grille_modifs.Show

    ensuite tu documentes tes zones, et ta macro est terminée.

    C'est la validation de la saisie de ta grille qui déclenchera
    la mise à jour ou l'abandon et donc tu dois avoir dans ta grille
    une zone qui enregistre la ligne à mettre à jour et
    cela peut être une zone non affichée (visible à false).

    @+
    0
    1. Otantik972
       
      bonjour,
      je commence en vb. je me suis donc appuyez sur votre sujet pour effectuer le même procédé a mon formulaire.

      Hors j'obtiens une erreur d'execution 424', voici mon bout de code :

      Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      UserForm1.Show

      UserForm1.TextBox1.Value = Cells(sel.Row, 3).Value Erreur d'éxecution '424'
      UserForm1.ComboBox22.Value = Cells(sel.Row, 4).Value
      UserForm1.TextBox2.Value = Cells(sel.Row, 5).Value
      UserForm1.TextBox3.Value = Cells(sel.Row, 6).Value
      UserForm1.TextBox27.Value = Cells(sel.Row, 7).Value
      UserForm1.TextBox28.Value = Cells(sel.Row, 8).Value
      UserForm1.TextBox13.Value = Cells(sel.Row, 9).Value
      UserForm1.ComboBox6.Value = Cells(sel.Row, 10).Value
      UserForm1.TextBox5.Value = Cells(sel.Row, 11).Value
      UserForm1.TextBox6.Value = Cells(sel.Row, 12).Value
      UserForm1.TextBox14.Value = Cells(sel.Row, 13).Value
      UserForm1.TextBox7.Value = Cells(sel.Row, 14).Value
      UserForm1.TextBox8.Value = Cells(sel.Row, 15).Value
      UserForm1.TextBox9.Value = Cells(sel.Row, 16).Value
      UserForm1.TextBox24.Value = Cells(sel.Row, 18).Value
      UserForm1.TextBox25.Value = Cells(sel.Row, 19).Value
      UserForm1.TextBox26.Value = Cells(sel.Row, 20).Value
      UserForm1.ComboBox20.Value = Cells(sel.Row, 22).Value
      UserForm1.ComboBox21.Value = Cells(sel.Row, 23).Value


      End Sub
      0
    2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      bonjour,

      Avec cette modif (en gras), cela devrait mieux fonctionner :

      Public Sub Worksheet_BeforeDoubleClick(ByVal sel As Range, Cancel As Boolean)
      
      0