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 :

Sécurisation de macro excel de conversion. [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 37
    Par défaut Sécurisation de macro excel de conversion.
    Bonjour j'ai crée une macro de conversion grace a l'aide de certains membres du forum que je remercie en passant.

    J'ai donc crée une petite "interface" excel (pas de userform).

    Ma macro marche,maintenant je voudrais la "sécuriser" en effet je dois la transmettre a des utilisateurs qui n'ont pas une grande connaissance dans excel et pour faire simple je voudrais les empecher de faire explosé la macro par des manipulations involontaires.

    Ma macro convertit un fichier excel en csv en prenant des valeurs dans diffèrentes colonnes ,je voudrais effectuer un test sur le fichier source pour savoir si il correspond au formalisme de ma macro donc compter le nombre de colonne minimum / maximum,le type de donnée afin qu'un utilisateur novice ne puisse rentrer un fichier incompatible.


    Voila le code de ma macro.

    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
    Sub Convert_File()
     
    'Définition des variables
        Dim chemin_acces_fichier As String
        Dim xfile_source As Excel.Application
        Dim donnees_H1 As Range
        Dim donnees_H2 As Range
        Dim EAN As String
        Dim EAN_convert As String
        Dim PRICE As Double
        Dim PRICE_convert As String
        Dim PRICE_2 As Double
        Dim PRICE_convert_2 As String
        Dim Price_3 As Double
        Dim PRICE_CONVERT_3 As String
        Dim Destinataire As String
        Dim First_concurrent As String
        Dim Second_concurrent As String
        Dim Third_concurrent As String
        Dim path_fichier
        path_fichier = ThisWorkbook.Path & "\" & "Conversion.csv"
        Dim deb_exe As Date, temps As Date, fin_exe As Date
        deb_exe = Time
     
    'Initialisation des variables
        Set xfile_source = CreateObject("Excel.Application")
        EAN = ""
        EAN_convert = ""
        PRICE = 0
        PRICE_convert = 0
     
     
     
    'Récupération du fichier à convertir
        Application.FileDialog(msoFileDialogOpen).Show
        chemin_acces_fichier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
     
        xfile_source.Workbooks.Open (chemin_acces_fichier)
        xfile_source.Visible = False
     
    'Zone de manipulation des donnee présentes dans le fichier
        Set donnees_H1 = xfile_source.Range(xfile_source.Range("B3"), xfile_source.Range("E65000").End(xlUp))
     
    'Ouverture du fichier de destination pour integration sur serveur METI
    Open path_fichier For Output As #1
     
    Destinataire = "000161"
    First_concurrent = Range("C10")
    Second_concurrent = Range("C11")
    Third_concurrent = Range("C12")
     
     
    'Parcourir la plage de données pour récupérer convertir les EAN et les prix
        For i = 1 To donnees_H1.Rows.Count
            EAN = donnees_H1.Cells(i, 1)
            PRICE = donnees_H1.Cells(i, 4)
     
            EAN_convert = String(13 - Len(Trim(EAN)), "0") & EAN
            PRICE_convert = String(6 - Len(Trim(PRICE * 100)), "0") & PRICE * 100
     
            Print #1, Destinataire & EAN_convert & First_concurrent & PRICE_convert
     
            'Verification de la présence d'un prix dans la colonne contenant le rang tarifaire numéro 2
            'Si il y a un prix alors je l'ajoute au fichier sinon je ne fais rien
            'Recherche de la valeur par accès absolue
     
            If IsEmpty(xfile_source.Cells(i + 2, 6)) = False Then
                PRICE_2 = xfile_source.Cells(i + 2, 6)
                PRICE_convert_2 = String(6 - Len(Trim(PRICE_2 * 100)), "0") & PRICE_2 * 100
                Print #1, Destinataire & EAN_convert & Second_concurrent & PRICE_convert_2
            End If
     
            'Verification de la présence d'un prix dans la colonne contenant le rang tarifaire numéro 3
            'Si il y a un prix alors je l'ajoute au fichier sinon je ne fais rien
            'Recherche de la valeur par accès absolue
     
            If IsEmpty(xfile_source.Cells(i + 2, 7)) = False Then
                Price_3 = xfile_source.Cells(i + 2, 7)
                PRICE_CONVERT_3 = String(6 - Len(Trim(Price_3 * 100)), "0") & Price_3 * 100
                Print #1, Destinataire & EAN_convert & Third_concurrent & PRICE_CONVERT_3
            End If
     
        Next
     
        Close #1
        xfile_source.Application.DisplayAlerts = False
        xfile_source.Application.Quit
     
        fin_exe = Time
        temps = fin_exe - deb_exe
        MsgBox ("Fin d'éxecution du programme" & Chr(10) & "Delais d'éxecution : " & temps)
    End Sub
    En vous remerciant et bon week end

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tiens j'ai déjà vu ce code quelque part

    quand tu veux blinder ton code pour neutraliser toutes actions qui le feraient planter, et que tu ne sais pas ce qu'il fait sécuriser... il est pratique de faire soi-même des tests, en adoptant volontairement les actions contraires à ce que tu attend de l'utilisateur

    par exemple, à cet endroit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.FileDialog(msoFileDialogOpen).Show
        chemin_acces_fichier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
    si l'utilisateur ne sélectionne rien et ferme (ou annule) la fenêtre ... que va-t-il se passer ?
    quelle est la conséquence sur la ligne de code suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xfile_source.Workbooks.Open (chemin_acces_fichier)

    En gros, essaye de délibérément faire planter ta macro ... pour trouver les failles et les sécuriser
    Quand t'aura pris le coup, t'auras une méthode et du "vécu" pour sécuriser tes programmes durant leur rédaction ... ce qui va alléger la phase de test/recettage de tes programmes

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 37
    Par défaut
    Salut joe,

    Oui joe ,je pense que ta déjà du voir ce code .

    C'est ce que je fais en essayant de mettre des fichiers "poubelles".

    si l'utilisateur ne sélectionne rien et ferme (ou annule) la fenêtre ... que va-t-il se passer ?
    quelle est la conséquence sur la ligne de code suivante ?
    J'ai déjà test on reçois une erreur argument incorrect et on peut relancer la macro en renseignant le fichier.


    En faite j'ai quelques problèmes et je pense que tu as surement des pistes joe:


    Quand on arrive a lancer une conversion avec un fichier qui fait planté la macro ,on est obligé de fermé excel y a-t-il une commande ou un "tricks" pour vider la macro des fichiers "poubelles" et la faire se réinitialiser (comme si on lancait le fichier comme la premiére fois )

    Mes résultats sont dans un fichier conversion.xls ,si j'ai déja ouvert le fichier conversion.xls (d'une conversion précédente ) j'ai l'erreur fichier déjà ouvert,comment par exemple ajouter que la macro enregistre la conversion en ajoutant un numéro (du genre conversion2.xls)

    Je voudrais effectuer un test qui compte le nombre de colonne de mon fichier source ,par exemple minimum 5 colonnes sinon un message d'erreur se lance.

    Merci encore de ton aide je devrais te payer quelques biéres

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    J'ai pris volontairement cet exemple, car l'erreur n'est pas trop bloquante.

    mais, si tu étais un utilisateur qui n'y connait rien au VBA. Tu lances le programmes et tu as un message d'erreur de VBA qui est du chinois ... c'est pas pratique !

    Il vaut mieux gérer l'erreur, plutôt que de demander à l'utilisateur de faire des efforts de compréhension (déjà qu'il a pas réussi à choisir correctement son fichier ...)

    voici un traitement basique qu'il faut encore complexifier (ne laisser la possibilité de choisir que l'extension voulue etc...)

    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
    Sub Test()
     
    Dim Conforme As Boolean
     
    ' tant qu'on a pas sélectionné un seul fichier
    While Conforme = False
     
        ' affiche la boite de dialogue
        With Application.FileDialog(msoFileDialogFilePicker)
            .Show
     
            ' on regarde combien de fichier son sélectionnés
            Select Case .SelectedItems.Count
                Case 0
                    If MsgBox("Vous n'avez pas choisi de fichier." & vbCrLf & "Continuer le programme ?", vbYesNo) = vbNo Then Exit Sub
     
                Case 1
                    Workbooks.Open (.SelectedItems(1))
     
                    ' permet de sortir de la boucle car on a bien choisi un seul fichier
                    Conforme = True
     
                Case Else
     
                    MsgBox ("Vous ne pouvez pas choisir plusieurs fichiers à la fois")
     
            End Select
        End With
    Wend
     
     
    End Sub
    Je te propose un accompagnement par étape

    On règle les problèmes un par un, en respectant la chronologie de ton code

    tu verras que procédant ainsi, tu limite les effets cascades... et régler le problème 1 va peut être supprimer la survenance d'un problème 14/15/16 etc..

    Plus le problème est "haut" dans la chronologie, plus il doit être sécurisé pour limiter les effets de bord

    J'aimerai comprendre pourquoi tu utilises ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Initialisation des variables
        Set xfile_source = CreateObject("Excel.Application")
    en général, j'utilise ça quand je manipule plusieurs instances Excel dans une même procédure ... afin d'éviter de les confondre

    Ceci étant dis, on est en train de parler de ton premier nœud : ouvrir un fichier (cf mon post précédent)
    Il est capital que tu prévois tous les cas pour valider l'ouverture du fichier en respectant toutes les conditions nécessaires au bon déroulement :

    - nombre de fichiers sélectionnables (déjà prévu dans mon exemple)
    - extension du fichier
    - date de dernières modification
    - nom
    - répertoire dans lequel il est situé
    - etc... toute caractéristique du fichier, c'est toi qui choisi ce qu'il te faut

    à toi de dresser ta liste des contraintes, et ensuite on se fait des jolis contrôle de respect de ces contraintes.
    si une contrainte n'est pas réalisée, tu peux prévenir l'utilisateur de ce qui ne va pas : gros avantage pour lui (il sait ce qu'il faut faire) et surtout pour toi (t'es pas sollicité pour des bêtises)


    A toi de jouer, j'attend ta liste

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 37
    Par défaut
    Salut joe !

    Je travail sur la liste et je revien vers toi ,en début de semaine j'ai souvent d'autres tâchse et ma fin de semaine je l'utilise pour améliorer cette macro.

    Pour l'utilisation de ce code je n'ai pas d'explication concréte, en effet je pense (je ne me souviens plus )mais j'ai du trouver cela par des recherches internets ,et quand on est débutant comme moi, on ne se pose pas de question tant que cela marche ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Initialisation des variables
        Set xfile_source = CreateObject("Excel.Application")
    Bonne journée

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

Discussions similaires

  1. [LibreOffice][Tableur] Conversion d'une macro Excel en macro libreoffice
    Par Guijack dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 28/02/2015, 21h56
  2. [XL-2003] Macro VBA excel de conversion
    Par Tikepi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/09/2010, 17h59
  3. [XL-2007] Conversion des macros Excel 2003 en Excel 2007
    Par fidecourt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/05/2009, 18h18
  4. Conversion macros excel 2003 en 2007
    Par cadouxmi dans le forum Excel
    Réponses: 2
    Dernier message: 16/02/2009, 09h24
  5. Probleme de conversion entre . et , avec une macro excel
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/01/2007, 22h26

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