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 :

Amelioration fichier csv de suivi de modifications d'une BD [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Amelioration fichier csv de suivi de modifications d'une BD
    Bonsoir,

    Il y a quelques temps EngueEngue (que je salue et remercie) m'a aidé pour ce fichier. Il me permet de répertorier dans un fichier csv les modifications effectuées sur une feuille de mon fichier. je suis aperçu que toutes mes saisies étaient répertoriées et ce même si ce sont de nouvelles données. alors que ce qui m’intéresse vraiment ce sont les modifications de ces dernières.

    je voudrai donc que les données insérées dans une ligne vide ne soient pas répertoriées dans le fichier csv.

    je joins mon fichier à l'enregistrement de celui-ci, il crée un fichier nommé "Modif-BD.csv" en C:\

    Je vous remercie pour votre aide.

    Cordialement,
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    A mon avis, si tu permets aux utilisateurs de faire des entrées directement sur la feuille, c'est extrêmement complexe de faire la différence entre une entrée sur une ligne vide et une modification sur une ligne non vide.

    Il faut donc interdire toute entrée ou modification manuelles sur la feuille et plutôt utiliser un formulaire pour faire les modifications et les nouvelles entrées.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Docmarti,

    Je te remercie d'avoir répondu à mon post. En fait, J'avais oublié de préciser que pour les modifications je passe par un formulaire.
    Sur le fichier que je travaille, des techniciens saisissent de données sur une feuille excel.
    Celles-ci sont ensuite transférées sur un fichier de stockage (BD).
    Puis sur ce dernier, en utilisant un formulaire des collaborateurs effectuent d'éventuelles corrections.
    Étant des personnes donc faillibles, d'autant plus qu'il s'agit de relevés électriques quotidiens.
    Je voudrai donc garder une trace des modifications afin de corriger la base de données.
    Le fichier sur lequel je travaille est volumineux et contient des données confidentielles.
    S'il vous faut un fichier avec un formulaire, pour me proposer une solution, je le mettrai en ligne le plus tôt possible.

    Je te remercie beaucoup.

    Cordialement,

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Oui, il faudrait voir le classeur contenant le formulaire pour voir le code.

    S'il vous faut un fichier avec un formulaire, pour me proposer une solution, je le mettrai en ligne le plus tôt possible.
    Dans ton formulaire, le code de sauvegarde des modifications devra indiquer CestUneModification = True pour que la modification soit ajoutee a ton fichier csv. Puis annuler cette commande par CestUneModification = False.

    Exemple :

    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
    Private Sub CommandButton1_Click()
     
    CestUneModification = True
     
    Set wf = ThisWorkbook.Worksheets("BD")
    wf.Activate
     
    col = 1: ligne = 3
    wf.Cells(ligne, col).Offset(1, 0).Select
    wf.Cells(ligne, col).Select
     
    wf.Cells(ligne, col).Value = TextBox1.Text
     
    col = 2: ligne = 3
    wf.Cells(ligne, col).Offset(1, 0).Select
    wf.Cells(ligne, col).Select
     
     
    wf.Cells(ligne, col).Value = TextBox2.Text
     
    CestUneModification = False
     
    End Sub
    'Module 1 modifié :
    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
     
    'Ajouter la variable publique CestUneModification
    Public CestUneModification As Boolean 
     
    Public reference As String
    Public feuille As String
    Public av As String
    Public nv As String
    Public utilisateur As String
    Public datemodif As String
     
     
    Sub ecriture()
     
    If Not CestUneModification = True Then Exit Sub 'Ecrire uniquement s'il s'agit d'une modification
     
    If nv = av Then Exit Sub 'Ne pas ajouter si la nouvelle valeur et l'ancienne sont identiques
     
    If Dir("c:\Modif-BD.CSV") = "" Then
     
       Open "c:\Modif-BD.CSV" For Append As 1
    Print #1, " Feuille;Cellule;Ancienne valeur;Nouvelle valeur;Changée par;Modifiée le" ' & vbCrLf
    Close 1
     
    End If
    SetAttr "c:\Modif-BD.CSV", vbNormal
     
    Open "c:\Modif-BD.CSV" For Append As 1
     
     
    Print #1, feuille & ";" & reference & ";" & av & ";" & nv & ";" & utilisateur & ";" & datemodif ' & vbCrLf
    Close 1
    SetAttr "c:\Modif-BD.CSV", vbReadOnly
     
    End Sub

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Docmarti,

    je te remercie pour ton code, je vais essayer de l'adapter à mon fichier.

    Comme j'ai travaillé très tard pour faire un fichier similaire au mien mais sans données confidentielles, je le joins. La feuille BD et le formulaire sont identiques à mon fichier original.

    je vous signal que je suis débutant, donc mon codage n'est pas très orthodoxe mais il fonctionne bien.

    Merci pour ton aide.

    Cordialement,
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re,

    J'ai essayé d'adapter ton code, donc voici ce que j'ai fait, j'ai rajouté la variable CetUneModification" au botuon de validation de l'userform:
    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
    Private Sub Cmd_Valider_Click()
     
    If TextBox2.Value = "" Then                                  'VAL3
    MsgBox "Aucune sélection!"
    Exit Sub
    Else
    CestUneModification = True
     
    Set c = F.[B:B].Find(Me.ListBox1, LookIn:=xlValues)
     
      If Not c Is Nothing Then
    On Error Resume Next
         F.Cells(c.Row, 9).Value = CDbl(Me.TextBox4.Value)       'VAL7 colI
         F.Cells(c.Row, 10).Value = CDbl(Me.TextBox5.Value)      'VAL8 col J
         F.Cells(c.Row, 13).Value = CDbl(Me.TextBox6.Value)      'VAL11 col M
         F.Cells(c.Row, 14).Value = CDbl(Me.TextBox7.Value)      'VAL12 col N
         F.Cells(c.Row, 15).Value = CDbl(Me.TextBox8.Value)      'VAL13 col 13
         F.Cells(c.Row, 16).Value = Me.TextBox9                  'VAL14 col 14
         F.Cells(c.Row, 17).Value = Me.TextBox10                 'VAL15 col 15
     
         ListBox1_Click
     
    MsgBox "Correction terminée!", vbInformation
     
    End If
    End If
     
    CestUneModification = False
     
    End Sub
    J'ai gardé le même code (code de EngueEngue) sur la feuille "BD":
    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 Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
    nv = Target.Value
    Else
    nv = "Valeur inconnue"
    End If
    utilisateur = Environ("Username")
    datemodif = Now
    reference = Target.Address
    feuille = Target.Worksheet.Name
     
    Call ecriture
     
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count = 1 Then
    av = Target.Value
    Else
    Sur le fichier de suivi généré, les anciennes valeurs ne sont pas reprises et les TextBox non modifiés sont repris (considérés comme modifiés, alors qu'ils ne l'ont pas été). Je n'ai fait le test qu'en modifiant la valeur d'un seul TextBox.

    Je joins le fichier modifié.

    Merci pour ton aide.

    Cordialement,
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Le code de EngueEngue fonctionne bien si tu sais t'en servir. Ce qui n'est pas le cas.
    Pour que le code de EngueEngue qui se trouve dans Sub Worksheet_SelectionChange s'exécute, il faut déclencher l'événement SelectionChange de la feuille. Comment? Avec la commande Select, on sélectionne n'importe quelle autre cellule, puis on sélectionne ensuite la cellule que nous voulons voir traitée par le code de EngueEngue dans la procédure Worksheet_SelectionChange.

    C'est une facon indirecte compliquée d'appeler une procédure.

    Ton code suivant modifie une cellule. Il déclenche donc l'événement Worksheet_Change et la procédure Sub Worksheet_Change s'exécute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     F.Cells(c.Row, 9).Value = CDbl(Me.TextBox4.Value)       'VAL7 colI
    La valeur nv est mise à jour. Mais la valeur av n'a pas été mise à jour parce que tu n'as pas déclenché préalablement l'événement SelectionChange.

    Je ne te conseille pas de mettre ton code dans les événements Worksheet_Change ou Worksheet_SelectionChange.

    J'ai modifié ton premier programme.
    Worksheet_Change ou Worksheet_SelectionChange sont supprimés et remplacés par la procédure ModifierCetteCellule.
    La procédure Cmd_Valider_Click est modifiée pour appeler ModifierCetteCellule.
    La procédure Ecriture est remplacée par la procédure EcritureModifications.

    J'ai ajouté la gestion d'erreur à ton code car il est impossible de programmer efficacement sans la gestion d'erreur dans chacune des procédures. Quand une erreur survient dans le code, un MsgBox apparait. Pèse alors sur CTRL-Pause pour interrompre le programme. Mets le curseur sur Resume et pèse sur CTRL-F9 puis sur F8. Ca te conduit à la ligne qui a causé l'erreur. Il ne te reste plus qu'à trouver la cause de l'erreur.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/09/2012, 09h30
  2. [PR-2007] Suivi des modifications sur une tâche via userform
    Par metmtl dans le forum VBA Project
    Réponses: 0
    Dernier message: 03/03/2010, 11h01
  3. Modification d'un fichier csv ?
    Par dauphin34000 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2008, 14h07
  4. Suivi de modification sur une feuille Excel
    Par Ibrahima1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/09/2007, 18h25
  5. fichier CSV modification des données.
    Par suya95 dans le forum Excel
    Réponses: 8
    Dernier message: 26/07/2006, 12h22

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