none
Urgent, Etat des modifications dans Excel RRS feed

  • Question

  • Bonjour à tous,
    Dans le cadre d'un projet j'ai besoin de connaitre toutes modifications effectuées sur une feuille Excel (pas la modification générale du classeur). Modification de tout objet de la feuille (image, zone de texte, cellule...).
    Je vais etre informer lorsqu'on desactive l'onglet de la feuille. Une petite précision: je n'ai pas forcement besoin de savoir l'objet qui a été modifié mais juste qu'il y a eu une modification sur la feuille.
    Je te remercie d'avance

     

    samedi 22 septembre 2007 14:00

Réponses

  •  

    Ok,

     

    Voici un exemple de code que j'ai fait vite fait a l'arraché. Il s'agit d'une application Windows avec juste une textbox multiligne qui s'appelle TextBox1.

    Vous avez juste à déposer un TextBox sur le formulaire, de le déclarer Multilignes; puis de copier le code ci-dessous dans le code du formulaire:

     

    Code Snippet

    Public Class Form1

        Private _watcher As System.IO.FileSystemWatcher
        Private _xlsFileName As System.String = "monFichier.xls"
        Private _xlsFolderPath As System.String = "C:\temp\"

        ''' <summary>
        ''' Instancie et initialise le FileSystemWatcher privé
        ''' </summary>
        ''' <returns>True, si l'instanciation et l'initialisation de l'objet s'est correctement passée</returns>
        ''' <remarks></remarks>
        Private Function InitWatcher() As Boolean
            Try
                If Me._watcher Is Nothing Then
                    Me._watcher = New System.IO.FileSystemWatcher()
                    Me._watcher.EnableRaisingEvents = False
                    Me._watcher.Filter = Me._xlsFileName
                    Me._watcher.NotifyFilter = IO.NotifyFilters.Size Or IO.NotifyFilters.LastWrite
                    Me._watcher.IncludeSubdirectories = False
                    Me._watcher.Path = Me._xlsFolderPath
                    AddHandler Me._watcher.Changed, AddressOf WatchEventhandler
                End If

                Return True

            Catch ex As Exception
                ' placer ici votre code de gestion d'erreur
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
                Return False
            End Try
        End Function

        ''' <summary>
        ''' Gestionnaire d'événement qui sera appelé chaque fois que le fichier sera modifié.
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks>
        ''' Attention!!! En principe la méthode WatchEventhandler ne peut pas mettre directement
        ''' à jour le TextBox car elle est appelé sur un thread différent
        ''' que celui qui a crée l'instance du formulaire
        ''' La ligne qui appelle la propriété static "CheckForIllegalCrossThreadCalls" est un pis aller qu'il faut éviter
        ''' en utilisant la méthode Me.TextBox1.InvokeRequired
        ''' pour transférer l'éxécution de ce thread à celui qui a crée le formulaire
        ''' </remarks>
        Private Sub WatchEventhandler(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
            Try

                System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = False

                Dim msg As String = System.DateTime.Now & " : Le fichier a été modifié"
                Me.TextBox1.Text &= (msg & vbCrLf)

            Catch ex As Exception
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
            End Try
        End Sub

        ''' <summary>
        ''' Démarre le processus de surveillance du fichier
        ''' </summary>
        ''' <returns>True, si la processus a correctement démarré</returns>
        ''' <remarks></remarks>
        Private Function StartWatcher() As Boolean
            Try
                If Not InitWatcher() Then
                    Return False
                End If

                Me._watcher.EnableRaisingEvents = True

                Return True

            Catch ex As Exception
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
                Return False
            End Try
        End Function

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                If Not Me.StartWatcher() Then
                    Me.TextBox1.Text = "Impossible de surveiller le fichier"
                    Return
                End If

                Me.TextBox1.Text = System.DateTime.Now & " : La surveillance a démarrée" & vbCrLf
            Catch ex As Exception

            End Try
        End Sub
    End Class

     

     

    Attention, ce code ne gère pas la finalisation du FileSystemWatcher quand le formulaire se ferme. Le code de finalisation du FileSystemWatcher doit être mis en place dans le cadre d'une application en production.

     

    dimanche 23 septembre 2007 15:02

Toutes les réponses

  • Bonjour,

     

    Il existe une classe dans le framework ( 2.0) qui permet de monitorer tout ce qui se passe sur le système de fichiers de la machine.

    Il s'agit de la classe System.IO.FileSystemWatcher.

     

    Avec cette classe, vous pouvez monitorer un fichier unique spécifique sur le disque ( par exemple votre fichier Excel) et être notifié chaque fois qu'une modification est effectuée sur ce fichier.

     

     

     

    samedi 22 septembre 2007 20:35
  • Votre solution est peut etre la bonne mais je suis pas un pro en vba.  je suis alle voir : http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemiofilesystemwatchermemberstopic.asp

     mais je ne compends rien. Peux tu me faire un debut de code que j'essayerai d'adapter par la suite.

    merci d'avance

    dimanche 23 septembre 2007 10:07
  • Bonjour,

     

    Il s'agit de développer une véritable application .NET autonome par exemple sous la forme d'un projet de type "Application Windows" sous Visual Studio 2005.

     

    Voulez-vous développer en VB.NET ou en VB6 ?

    Votre Post précédent laisse planer une ambiguité à ce sujet.

     

     

    dimanche 23 septembre 2007 11:32
  • Je veux  développer en VB.NET.

    dimanche 23 septembre 2007 13:07
  •  

    Ok,

     

    Voici un exemple de code que j'ai fait vite fait a l'arraché. Il s'agit d'une application Windows avec juste une textbox multiligne qui s'appelle TextBox1.

    Vous avez juste à déposer un TextBox sur le formulaire, de le déclarer Multilignes; puis de copier le code ci-dessous dans le code du formulaire:

     

    Code Snippet

    Public Class Form1

        Private _watcher As System.IO.FileSystemWatcher
        Private _xlsFileName As System.String = "monFichier.xls"
        Private _xlsFolderPath As System.String = "C:\temp\"

        ''' <summary>
        ''' Instancie et initialise le FileSystemWatcher privé
        ''' </summary>
        ''' <returns>True, si l'instanciation et l'initialisation de l'objet s'est correctement passée</returns>
        ''' <remarks></remarks>
        Private Function InitWatcher() As Boolean
            Try
                If Me._watcher Is Nothing Then
                    Me._watcher = New System.IO.FileSystemWatcher()
                    Me._watcher.EnableRaisingEvents = False
                    Me._watcher.Filter = Me._xlsFileName
                    Me._watcher.NotifyFilter = IO.NotifyFilters.Size Or IO.NotifyFilters.LastWrite
                    Me._watcher.IncludeSubdirectories = False
                    Me._watcher.Path = Me._xlsFolderPath
                    AddHandler Me._watcher.Changed, AddressOf WatchEventhandler
                End If

                Return True

            Catch ex As Exception
                ' placer ici votre code de gestion d'erreur
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
                Return False
            End Try
        End Function

        ''' <summary>
        ''' Gestionnaire d'événement qui sera appelé chaque fois que le fichier sera modifié.
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks>
        ''' Attention!!! En principe la méthode WatchEventhandler ne peut pas mettre directement
        ''' à jour le TextBox car elle est appelé sur un thread différent
        ''' que celui qui a crée l'instance du formulaire
        ''' La ligne qui appelle la propriété static "CheckForIllegalCrossThreadCalls" est un pis aller qu'il faut éviter
        ''' en utilisant la méthode Me.TextBox1.InvokeRequired
        ''' pour transférer l'éxécution de ce thread à celui qui a crée le formulaire
        ''' </remarks>
        Private Sub WatchEventhandler(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
            Try

                System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = False

                Dim msg As String = System.DateTime.Now & " : Le fichier a été modifié"
                Me.TextBox1.Text &= (msg & vbCrLf)

            Catch ex As Exception
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
            End Try
        End Sub

        ''' <summary>
        ''' Démarre le processus de surveillance du fichier
        ''' </summary>
        ''' <returns>True, si la processus a correctement démarré</returns>
        ''' <remarks></remarks>
        Private Function StartWatcher() As Boolean
            Try
                If Not InitWatcher() Then
                    Return False
                End If

                Me._watcher.EnableRaisingEvents = True

                Return True

            Catch ex As Exception
                Me.TextBox1.Text &= (ex.Message & vbCrLf)
                Return False
            End Try
        End Function

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                If Not Me.StartWatcher() Then
                    Me.TextBox1.Text = "Impossible de surveiller le fichier"
                    Return
                End If

                Me.TextBox1.Text = System.DateTime.Now & " : La surveillance a démarrée" & vbCrLf
            Catch ex As Exception

            End Try
        End Sub
    End Class

     

     

    Attention, ce code ne gère pas la finalisation du FileSystemWatcher quand le formulaire se ferme. Le code de finalisation du FileSystemWatcher doit être mis en place dans le cadre d'une application en production.

     

    dimanche 23 septembre 2007 15:02