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 :

Vérifier la version d'un classeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut Vérifier la version d'un classeur
    Bonjour à tous

    J'ai créé une petite application en VBA sur Excel. Etant donné que l'on peut être plusieurs simultanément à utiliser l'application, je l'ai enregistré en xlt afin que chacun travail sur une copie. Seulement, les utilisateurs ont tendance à s'en faire une copie de sauvegarde ce qui me gène puisqu'ils ne bénéficieront pas automatiquement des mises à jours.
    Aussi, j'aimerais qu'à l'ouverture du fichier (lors de la création de la copie donc) il y ai un test. Si l'original à changé par rapport à une version définie, alors j'averti l'utilisateur. Sinon je le laisse faire une copie si il le souhaite.

    Je re-précise que je ne tient pas à brider les utilisateurs, mais juste qu'ils ne passent pas à coté de la mise à jour.

    J'ai eut quelques idées mais qui ne me plaisaient pas car pas super fonctionnelles. Je ne les mentionnerais pas pour ne pas brouiller vos idées qui je le sais seront fantastiques

    Merci d'avance !

    PS: Mon appli lance le classeur excel qui ne contient que des bases de données et affiche un userform depuis lequel tout est fait. Si vous avez la solution pour ne plus afficher excel ca peut être intéressant aussi, et aussi désactiver systématiquement la possibilité d'enregistrer serait une solution de dernier recours. Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Bonjour,
    Voici deja comment cacher excel au demarrage et laisser seulement l'userform

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Workbook_Open()
    Application.Visible = False
    UserForm1.Show
    End Sub
    pour fermer sans enregistrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
         ThisWorkbook.Saved = True
    End Sub
    puis pour tes problemes de version, pourquoi n'enregistres tu pas la version dans un fichier texte a part puis a l'ouverture du fichier , avec un evenement, tu lis ton fichier texte et tu verifies ta version. Et a la fermeture de ton fichier "source" mis a jour, tu mets un evenement qui va mettre a jour ton fichier texte. Je ne sais pas si je suis clair.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Si si tu es très clair.
    En fait je ne maitrise pas trop le VBA et je me suis habitué à python donc pour ouvrir lire/écrire des fichiers, ca m'a pas trop attiré ! lol. Mais effectivement c'est une solution que je vais ré-envisager.
    Faut aussi que je fasse attention aussi aux 2 principaux cas :
    * Le cas ou j'édite le xlt
    * Le cas ou l'utilisateur utilise sa copie xls

    C'est un peu déjà à ce niveau que j'avais lutté. Je récupérais un peu à la barbare le nom du fichier actuel et je le comparais à une cellule qui contenait le chemin vers l'original (contraignant lorsque je change le chemin d'enregistrement)
    Ensuite j'ai lutté aussi pour écrire correctement les dates et les comparer (date enregistrée et date de l'original... Impossible de trouver un truc du genre timestamp en nombre à virgule flottante (un coup j'obtenais la date format anglais , un autre coup la date en francais...)

    D'autres idées peut être un peu plus sympa et propres que ce que j'avais fait ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    En fait ta version elle se caracterise comment?

    - par un numere? V 1.1
    - par une date? 2007-09-29
    - est ce que la version apparait dans le nom du fichier?

    sinon un petit lien pour utiliser les fichier texte avec VBA:

    http://warin.developpez.com/access/fichiers/#LII-D

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Je n'ai encore rien décidé. Je me moque de suivre les évolutions, donc à priori, ce qui me parait le plus pratique, c'est la date. Ca a en plus l'avantage de ne pas risquer d'être répété dans la durée (une réinitialisation du numéro de version et toutes les versions obsolètes deviennent "à jour") tandis que la date ne se répètera (à priori ) jamais
    Le nom de fichier ne changera jamais (enfin si il change ca ne sera pas pour le numéro de version)

    Merci au passage pour le lien

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par da991319 Voir le message
    Bonjour,
    Voici deja comment cacher excel au demarrage et laisser seulement l'userform

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Workbook_Open()
    Application.Visible = False
    UserForm1.Show
    End Sub
    Je viens de faire ca et malheureusement le userform apparait derrière l'explorateur windows depuis lequel je lance mon application
    Mais bon, ce n'est pas trop le sujet du topic pour le moment ... Je verrais ca ensuite. Merci

  7. #7
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    1-
    Pour lire dans un fichier texte
    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
     
    Sub lirefichier()
    'récupérer le contenu d'un fichier texte dans une variable
    'DocMartin, mpfe
       Dim NomDeFichier As String
       Dim NoFichier As Integer
       Dim LongueurFichier As Long
       Dim MaVariable As String
     
        NomDeFichier = "C:\Users\Fred\Desktop\DerniereVersion.txt"
        NoFichier = FreeFile()
        'Ouvre le fichier en mode lecture.
        Open NomDeFichier For Input As #NoFichier
            LongueurFichier = FileLen(NomDeFichier)
            MaVariable = Input(LongueurFichier, NoFichier)
        Close NoFichier
        'Tout le fichier se trouve dans la variable MaVariable
        'qu'il suffit de décortiquer et de répartir à votre gré
        'dans le classeur.
        'Par exemple, pour voir les 5 premiers caractères dans la
        'fenêtre exécution:
        Debug.Print MaVariable, Mid(MaVariable, 1, 5)
     
    End Sub
    2-
    Pour faire une comparaison sur les dates tu peux les inscrire
    sous la forme
    Format(Now, "#####.####")
    et ensuite comparer si inférieur ou non

    ce qui est avant le . ce sont les jours depuis 1900 ou 1904 suivant le calendrier coché dans les préférences.

    Après le point, 00:00:00 donne et 23:59:59 donne 0.9999

    j'espère que ça t'aidera

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Ok je te remerci pour ca.

    J'ai fait des premiers tests mais ca déconne. Faut que je débug, je vous tient au courant.
    Si vous avez d'autres solutions n'hésitez pas

  9. #9
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    il faut en premier enregistrer ton fichier .txt vierge.
    et modifier la ligne
    NomDeFichier = "C:\Users\Fred\Desktop\DerniereVersion.txt"

    Maj + clic sur le fichier et "Copier en tant que chemin d'accès" sur Windows
    pour copier le chemin avec les "

    F

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    Une autre solution pourrait consister à ajouter une propriété personnalisée directement dans ton classeur sous forme de date, et ensuite lire cette propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox ThisWorkbook.CustomDocumentProperties("DateVersion").Value


    De plus, en utilisant la librairie DSO, il est possible de lire les propriétés, sans ouvrir les classeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub LireProprietesPersonnalisees_DSO()
        'Nécessite d'activer la référence "DSO OleDocument Properties Reader 2.0"
        'http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q224351
        Dim DSO As DSOFile.OleDocumentProperties
     
        Set DSO = New DSOFile.OleDocumentProperties
     
        'Attention: Le fichier doit être préalablement fermé!
        DSO.Open sfilename:="C:\Documents and Settings\mimi\dossier\NomModèle.xlt"
        MsgBox DSO.CustomProperties.Item("DateVersion").Value
        DSO.Close
    End Sub


    Pour plus d'informations:

    http://silkyroad.developpez.com/VBA/...etesClasseurs/



    bonne journée
    michel

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous et bon Dimanche

    Alors en remettant un peu toutes les idées, en prenant ce qui me convenait le mieux j'arrive à un résultat correcte :
    Lors de l'enregistrement, si le document est mon XLT, alors je met la date dans une cellule. Si ce n'est pas mon XLT alors je n'écrit pas la date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'test si le classeur en cours est le modèle
    If Range("cheminXLT").Value = ActiveWorkbook.FullName Then
        'si oui on met à jour le champ de version
        If Not Cancel Then
            'on mémorise la date d'enregistrement dans la cellule "version"
            Range("version").Value = Format(Now, "#####.####") + 0.0001 'FormatDateTime(Now) ' Year(Now) & Month(Now) & Day(Now) & Hour(Now) & Minute(Now) & Second(Now) 'FormatDateTime(Now) 'DateSerial(Year(Now), Day(Now), Month(Now)) & " " & TimeSerial(Hour(Now), Minute(Now), Second(Now) + 10)
        End If
    Else
        'si non, on ne met pas à jour
        MsgBox "Attention, ce document n'est qu'une copie du document original." & vbCrLf & "Il est fortement conseillé de n'utiliser que le modèle d'origine."
    End If
     
    End Sub
    LA date est donc écrite dans cette cellule uniquement si c'est le XLT

    Et lors de l'ouverture, si le document N'EST PAS le XLT alors je récupère la date de version dans ma cellule qui va bien, et je la compare à la date d'enregistrement de mon XLT. Je ne fait ce test que si le document a été enregistré (exit la copie du XLT)
    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
     
    Private Sub Workbook_Open()
    '
    ' vérification de la version
    '
    'test si le classeur en cours est le modèle
    If Range("cheminXLT").Value = ActiveWorkbook.FullName Then
        'si oui, alors on ne vérifie pas la date
        ' et on averti l'utilisateur qu'il s'apprète à modifier le modèle
        MsgBox "ATTENTION ! Vous allez éditer le modèle..." & vbCrLf & "Si vous ne savez pas ce que vous faites," & vbCrLf & " alors abandonnez maintenant sans enregistrer"
    Else
        Dim DateOriginal As Double
        Dim DateVersion As Double
        On Error Resume Next 'désactivation du gestionnaire d'erreur
        Err.Clear 'suppresion des messages d'erreur
        ' on récupère la date d'enregistrement du fichier XLT
        DateOriginal = Format(FileDateTime(Range("cheminXLT").Value), "#####.####")
        ' on récupère la date de version mémorisé dans les paramètres
        DateVersion = Range("version").Value
        If Err.Number = 53 Then
            'si on récupère l'erreur 53, c'est que ce classeur n'a pas été enregistré
            ' il s'agit donc de la copie non enregistré du xlt
            'MsgBox "Copie non enregistrée"
        Else
            If DateOriginal > DateVersion Then
                'la version du modèle est plus récente que ce classeur
                'MsgBox DateDocument
                MsgBox "Une nouvelle version existe !"
            Else
                MsgBox "Cette version est toujours conforme"
            End If
        'Application.Visible = False
            formulaire.Show
        End If
    End If
     
    End Sub
    Je n'ai donc pas utilisé de fichier txt contenant la date car ca m'était inutile
    Je n'ai pas utilisé les propriétés personnalisées puisque j'ai une feuille dans mon classeur qui contient différent paramètres (chemin des fichiers, date de version, email de l'administrateur etc...)

    Merci à tous et si vous avez de plus belles idées, elles sont toujours bonne à prendre !

    Bonne continuation

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

Discussions similaires

  1. [AppleScript] Vérifier la version d'un logiciel et choisir une action en fonction
    Par gwenhadu75 dans le forum AppleScript
    Réponses: 0
    Dernier message: 20/01/2012, 15h54
  2. Réponses: 0
    Dernier message: 15/04/2011, 14h20
  3. Vérifier la version de Windows
    Par momo187 dans le forum C#
    Réponses: 17
    Dernier message: 29/11/2010, 14h27
  4. Vérifier la version de ma base
    Par curt dans le forum Access
    Réponses: 2
    Dernier message: 02/12/2007, 17h28
  5. Comment vérifier ceci : version=20061025 ?
    Par innova dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/11/2006, 15h43

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