guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006
-
9 août 2006 à 15:55
sarrpas
Messages postés1Date d'inscriptionmercredi 1 février 2006StatutMembreDernière intervention25 septembre 2006
-
25 sept. 2006 à 14:26
Bonjour,
Je cherche à créer un système de signature électronique pour du personnel intervenant sur des fichiers excels, sans avoir à retouché le code si du personnel s'ajoute. Le fonctionnement serait le suivant:
- L'utilisateur fini une tache, et insère la date dans une cellule, ce qui déclenche une macro de mot de passe.
- une userform s'ouvre, le technicien saisie son mot de passe (crypté ***), et appuie sur Ok
(j'utilise un autre fichier excel, qui me sert de base de données pour le personnel, ce fichier contient dans une colonne le mot de passe, et dans une autre colonne (en face), le chemin de leur signature correspondante (*:\*****\****.jpg), ce système me permettra de rajouter du personnel et modifiant cette bdd sans toucher au code, ni à d'autres fichiers excel.)
- je fais ensuite une recherche verticale dans la macro, qui, en fonction du mot de passe, va me chercher le chemin de l'image de la signature
- j'insère ensuite la photo dans une cellule (ou ensemble de cellule) bien précise.
En théorie, c'est trés bien, mais en pratique, je rencontre quelques problèmes:
- pour la textbox, je n'y parviens pas, je fais pour l'instant avec un inputbox (les caractères saisis ne sont donc pas cryptés)
- j'arrive à trouver le chemin de la photo, je l'affiche (avec une msgbox), mais lorsque je veux insérer la photo (activesheet.pictures.insert(chemin)), cette commande me fais une erreur, comme si elle ne pouvais pas insérer un chemin qui à été trouvé à l'aide d'une recherche verticale (le chemin change en fonction du mot de passe saisi)
- Autre problème, il faudrait que ce code soit une fonction de excel (function) car il y a de nombreux endroits où cette signature servira, et dans de nombreux documents
Voilà, j'ai essayé d'être le plus clair possible, mais ce n'est pas évident, donc, aprés de nombreuses recherches, je cherche quelqu'un qui pourrait m'aider.
Merci par avance
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 9 août 2006 à 17:28
Soit dit entre nous, si ta liste de mot de passe et des utilisateurs est dans un fichier Excel, la sécurité du truc n'est pas vraiment assurée ^^
Sinon, étant par nature anti-formulaire, je te présente une solution qui fonctionne avec 2 ou 3 petits aménagements, tu pourras adapter à ton cas sans soucis je pense.
Mise en place :
Un fichier Excel gérant tes utilisateurs et mots de passe : Données.xls
Colonne A : Les utilisateurs
A1: Toto
A2 : Tata
A3 : Titi
Colonne B : Les mots de passe
B1: 123
B2: 456
B3: 789
Colonne C : Concaténation des 2 (en effet, ce que tu vas contrôler, c'est bien que le mot de passe corresponde à 1 utilisateur)
C1: =A1 & B1
C2: =A2 & B2
C3: =A3 & B3
Colonne D : Chemin de l'image
D1: C:\Signature\Toto.jpg
D2: C:\Signature\Tata.jpg
D3: C:\Signature\Titi.jpg
(A ce propos, comme tes images bougeront peut être, rentrer les chemins en dur est bien fastidueux je trouve, tu ferais mieux de fonctionnenr en chemin relatif : Un sous répertoire à l'endroit où tu mets ton fichier Excel pour stocker les signatures, tu n'as plus qu'à rentrer le nom du fichier image sans t'occuper du chemin et ça fonctionnera nickel. Surtout si tu es amené à déplacer ton appli).
Je sélectionne les cellules C1 à D3 et je crée une zone de nom :
Menu Insertion\Nom\définir et je lui donne le nom ControlePw. (à noter que si tu adaptes à ton cas, il faut absolument que la colonne contenant la concaténation soit la 1ere de la zone crée, sinon, ça ne fonctionnera pas).
Mon premier fichier est prêt.
Deuxième fichier, celui qui figurera ton interface. J'ai fait au plus simple, tu adapteras :
En B1 se situe la cellule où ton utilisateur rentrera son nom, son matricule, etc ... (tu peux même faire une liste de saisie à partir du fichier Excel où la liste des utilisateurs est enregistrée, pour être sûr de la saisie).
En B2 se situe la cellule où sera tapé le mot de passe (effectivement, il sera en clair, mais tu peux t'arranger, y a plein de moyens en jouant sur les protections de cellule, de feuilles ...)
Les bases sont données : Il te reste une chose à faire, vérifier que les éléments saisis sont corrects, sont bien liés et remonter l'image.
Dans la cellule B3, je vais rentrer une formule qui va m'afficher le chemin de l'image si le nom d'utilisateur et le mot de passe sont trouvés et bien liés (si tu veux que ça reste caché, tu peux mettre cette formule dans une autre feuille d'Excel et la masquer).
B3: =SI(ESTERREUR(RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX))=VRAI;"Nok";RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX))
Que fait cette formule ?
RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX) va chercher dans la zone de nom qu'on a crée si la concaténation du nom d'utilisateur et du mot de passe existe, et afficher la 2eme colonne de la zone.
Donc, si en B1 on a Tata et en B2 456, cela va remonter C:\Signature\Tata.jpg dans la cellule. Si ça ne trouve rien, #N/A.
D'où la formule ESTERREUR : si la remontée est #N/A, la cellule contiendra VRAI, autrement, FAUX.
Et j'insère maintenant ma fonction SI qui dit que si une erreur est remontée, la cellule B3 affiche Nok, et autrement, elle affiche le chemin de la signature.
Ma toute petite tricherie à présent : je n'arrive pas à insérer l'image dans une cellule via le code. La macro enregistrée ressort un code qu'à priori, Excel n'arrive pas à interpréter O_o.
Pas grave, on crée un objet Image qui restera de toutes façons attachées à une cellule.
Et on crée un Bouton, que tu appelles comme tu veux : Mise à jour, Signature, etc ...
On colle ce tout petit bout de code :
Private Sub CommandButton1_Click()
Dim Temp As String
Temp = Worksheets("Feuil1").Range("B3").Value
If Temp <> "Nok" Then
Image1.Picture = LoadPicture(Temp)
End If
End Sub
Je précise le Woksheets parce que je suppose que ton fichier ne fera pas qu'une feuille, et en fonction de l'endroit où tu affiches le chemin de l'image, tu en auras besoin.
Voilà, ton fichier est donc prêt :
Pour la mise à jour, il n'y a qu'une seule chose à faire : quand tu rajoutes des utilisateurs, pense à agrandir la zone de Nom ControlePw pour que les nouveaus soient pris (ou insère les avant la dernière ligne, comme ça, la zone de Nom s'agrandit automatiquement).
Dernière chose : Ca fonctionne bien, très bien même, mais ce n'est pas très sécurisé . D'un autre côté, je ne comprends pas l'intêret de mettre la liste de mot de passe dans un fichier Excel que n'importe qui pourra consulter (même protégé, oon trouve toujours une astuce, sans compter que ça se "crack" très facilement donc )
guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006 9 août 2006 à 18:39
Merci Molenn,
Je te remercie pour la rapidité de ta réponse: ca a pas trainer.Alors, première chose, il faut absolument que le code soit entrer dans une textbox (il ne faut pas qu'on puisse lire ce que le technicien entre).
Deuxième chose, pour l'objet image, je ne peux pas procéder ainsi vu le nombre de signature élec à faire (environ 300). c'est pour cela qu'il me faut absolument utiliser "function", pour que je puisse ciblé des cellules, qui serviront au déclenchement, au positionnement de l'image, à son dimensionnement. Si tu préfère, je peux avoir 5 signature élec dans une seule feuille, donc faire avec des objets me semble trop long. L'idée est d'avoir une cellule où le technicien insère la date du jour, cette action génére l'ouverture de la textbox, il entre son code, et lorsqu'il valide, sa signature s'insère dans la cellule (désigné dans function), et à son format.
En fait, ce qu'il me faudrais (je sais pas si ca existe), c'est la commande d'insertion d'image, mais qui accepte une variable à la place du chemin d'accés "".
Niveau sécurité, je suis celui qui s'y connais le plus de la boite, alors t'inquiète pas pour le "crackage" des fichiers, ca risque pas.
L'intéret du mot de passe est le suivant: je travaille dans l'aero, et toutes les actions doivent etre signé, mais en ce moment, c'est fait plus ou moins à la fin , avec une copie du document en parallèle qui est renseigné (ce qui fait un doublon), ce système de signature permet de valider dans le système, et de pas avoir à resigné à la fin.
J'ai pas eu le temps de tester ta soluce, mais je le fais demain à la première heure, en tout cas, merci beaucoup pour le temps que tu y a consacrer.
@+
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 10 août 2006 à 14:35
Alors, après avoir fait tout plein de tests, je peux te proposer ceci :
Je garde mon classeur "Données.xls" qui contient les users, les mots de passe, la concaténation des 2 et le chemin de l'image. Par contre, tu peux laisser tomber la zone de nom.
Le 2ème fichier Excel : "Interface.xls"
Je ne me suis pas occupé de gérer l'apparition de la TextBox si la date est renseignée. Tu as l'air de savoir le faire.
J'ai donc une cellule dans laquelle sera inscrit le nom d'utilisateur (idem que le post précédent, tu peux créer liste blabla ^^) : B1
Une TextBox que j'appelle txt_MotPasse avec une "*" pour masquer la saisie.
Un bouton pour appeler la signature.
Ci-joint le code à mettre dans le bouton :
Private Sub CommandButton2_Click()
Dim ID As String
Dim Chemin As String
Dim NumLigne As String
Dim Image As String
'Concaténation du User et du Pw
ID = Worksheets("Feuil1").Range("B1").Value & txt_MotPasse.Text
'Ici, j'ai donc reconstitué ce qui est normalement l'identifiant unique dans ton fichier du personnel
'Recherche dans le classeur du Personnel
'Ouverture du classeur "Données.xls"
Chemin = "C:\Données.xls" 'Je rentre le chemin en dur dans une variable, plus simple à visualiser quand ça change et puis, tu peux remplacer par un chemin relatif, à toi de voir.
Workbooks.Open (Chemin)
'Rendre les fichiers invisibles le temps du contrôle (sinon, ton fichier avec les mots de passe du personnel sera visible... Comme je n'ai pas crée de nouvelle instance Excel, je rends tout invisble le temps du traitement, très court).
Application.Visible = False
'Recherche de l'ID
Workbooks("Données.xls").Activate
'Avec la méthode Find, je vais récupérer l'adresse de la cellule contenant l'ID, en extraire le N) de ligne et reconstituer ainsi l'adresse de la cellule contenant le chemin de l'image)
Workbooks("Données.xls").Worksheets("Feuil1").Cells.Find(What:=ID, After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
True, SearchFormat:=False).Activate
'Récupération de la ligne
NumLigne = Right(ActiveCell.Address, (Len(ActiveCell.Address) - InStrRev(ActiveCell.Address, "$")))
'Récupération du chemin de l'image
Image = Workbooks("Données").Worksheets("Feuil1").Range("E" & NumLigne).Value
'Fermeture du classeur des users
Workbooks("Données.xls").Close
'Rendre les fichiers visibles
Application.Visible = True
'Affichage de l'image sélectionnée
'Là j'ai mis l'image en C34, à toi de gérer l'endroit où insérer l'image
Workbooks("Interface.xls").Worksheets("Feuil1").Range("C34").Select
ActiveSheet.Pictures.Insert( _
Image _
).Select
End Sub
Tu n'as plus qu'à tester tout ça et me dire si ça te suffit.
guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006 10 août 2006 à 19:21
bonjour Molenn,
Tu est trés prolofique dis moi, encore merci.
Comme je te l'ai dis, ta soluce pourra s'appliquer à des fichiers "Master", mais pas encore à mes docs de travail: mais ca tombe bien, car c'est aussi le cas: en fait, pour remettre les pièces aéro en service, il faut compléter un document qui ne change jamais de mise en page, seul le contenu change. Quand je suis arrivé dans la boite, c'était un simple fichier excel où les utilisateur changé le contenu des cellules à modifiés (fastidieux).
J'ai tout d'abord fonctionné en rechercheV, car toutes les données à inscrire dans ces docs étaient dans un log excel. Puis j'avais déjà crée ta solution pour l'inscription du nom et du matricule en faisant un "pseudo code" (sans VB), mais l'idée d'insérer la signature me plais bien, je me renseignerais demain au niveau des autorités en ce qui concerne la sécurité (qui est légère).
Aujourd'hui donc, j'ai testé ta première soluce, en l'optimisant:
- Donc tout d'abord, il y a un bouton sur le feuille excel pour saisir le code personnel
- Ensuite, une textbox s'ouvre, demande le code, le technicien le rentre (*** c trop bien), puis valide
- le code entré est insérer dans une cellule "protégé": à savoir police de caractère illisible, police couleur blanche, et cellule protégée par mot de passe
- ensuite, sur cette même feuille, la rechercheV m'affiche le chemin
- ce chemin est récupérer dans une variable de la macro de la userform, puis insérer dans la célèbre commande "activesheet.pictures.insert(variable)" et là miracle, ca marche.
- J'ai ensuite repris un code qui permet de dimensionné à sa guise l'image, et de la placer où bon nous semble
- Le résultat final est que le doc est signé, et protégé, il ne reste plus qu'à l'imprimer.
Au niveau sécurité:
- les docs dont je te parle sont dans un répertoire sécurisé (serveur Windows 2003)
- ils sont dispo uniquement en lecture seule
- toute les feuilles sont protégées pas mot de passe
- Les docs nécessite un code (cf ci dessus) pour être finalisé
- La base de données des chemins est sous mot de passe
Je me rends bien compte que la sécurité n'est pas top, mais en même temps, vu la structure de la boîte, je pense que c'est suffisant, à voir demain avec les autorités. Sinon, il faudrais que je vérouille l'accés aux macros (à VB donc) quand un de ces fichier est utilisé, ça je sais pas faire, mais je chercherais demain (si tu as une idée...).
Enfin, pour ta deuxième soluce, je verrais ca demain parce que là, j'en peux plus, et vu que je n'ai aucune formation VB, il me faudra du temps pour la décortiqué. et je cherche encore pour lier le code avec une fonction excel, pour utiliser le glisser-déposer de excel (qui sera bien pratique)
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 11 août 2006 à 14:12
Pour verrouiller l'accès aux macros de tes fichiers Excel, il te suffit de les protéger.
Pour cela, rien de plus simple, tu vas dans l'éditeur VBA, dans la partie gauche de l'éditeur, tu as d'écrit VBA Project avec le nom de ton fichier entre parenthèses.
Un clic droit dessus, propriétés de VBA Project : Onglet Protection et hop, un mot de passe de plus.
Plus personne ne pourra accéder aux macros pour les modifier (Bouton Modifier grisé Qquand on consulte la liste des macros), ni accéder au contenu via l'éditeur VBA.
guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006 11 août 2006 à 15:55
Ouais, je viens juste de trouver à l'instant. En ce qui concerne les autorités, une signature électronique est possible aux conditions suivantes:
- Satisfaisante pour le représentant de l'autorité (ce qui ne veut rien dire, mais bon, j'en fais mon affaire)
- Qu'on ne puisse pas imprimer de document "en blanc" avec la signature intégré
Pour ce qui est de l'impression, j'ai verrouiller cette dernière en fonction du statut d'une cellule , qui sera lié au code entré.
Pour la sécurité, j'ai bien verrouillé partout, mais bien sur, avec un logiciel de décryptage, il sera toujours possible d'accéder aux macros, cellules protégés... Mais bon, je ne suis pas entourés de developpeurs.
Je vais encore essayer d'améliorer le fichier pour éviter d'utiliser des cellules Excel (cf ta deuxième soluce), puis j'essayerais d'en faire une fonction (mais plus ca va, et moins j'y crois, on verra).
Encore merci (vb c'est génial, j'en découvre tout les jours)
guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006 16 août 2006 à 15:58
Bonjour Molenn,
Petite question surement bête, mais comment fais-tu pour transférer le contenu d'une textbox d'une userform, à une variable contenu dans un module ?
Ce que je veux faire, c'est récupérer le mot de passe avec la userform, puis récupérer ce mot de passe dans un module afin de pouvoir faire une recherche verticale dans la macro. Je suis obligé de faire ce transfert si je veux en faire une fonction (function ne fonctionnant que dans les modules).
Aurais-tu une idée ? (sans passer par les cellules d'excel de préférence)
Merci encore
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 17 août 2006 à 14:49
Bonjour,
Alors, si je te comprends bien, tu veux récupérer le mot de passe saisi dans ton userform dans une variable contenue dans un module.
Alors, première chose :
Ta variable doit être déclarée de façon à ce qu'elle soit reconnue par tout le fichier.
Donc, dans ton module, elle doit être déclarée de la façon suivante :
Public Toto as String
(enfin, le type de variable est fonction de tes besoins ^^).
Ensuite, Tu peux créer un bouton dans ton userform, appelé par ex : "Se connecter" (ce qui parlera à tes utilisateurs : on leur demande de saisir un mot de passe pour accéder à quelque chose).
Et comme bout de code, il suffit de :
Private Sub CommandButton1_Click()
Toto = txt_PW.Text
End Sub
Ton mot de passe est donc à présent stocké dans la variable de ton module, connu de tout ton programme.
Tu n'as plus qu'à insérer cette variable dans ta macro.
guillaume_0507
Messages postés7Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention17 août 2006 17 août 2006 à 17:43
Non, en fait, c'est moi qui est mal posé la question, j'ai déjà fait tout ce que tu a dis, mais il me manque la commande pour revenir au module lorsque le mot de passe est saisi, j'ai:
- la variable du code est déclarée en public dans le module
- Dans le module, je lance la userform par 'CallByName userform1."show".VbMethod
- Dans la userform, je dis que la variable code = textbox1 (quand j'appuie sur le bouton)
- Si j'affiche msgbox code, j'ai bien le code qui apparait à l'écran, ce qui veux dire que la variable est correcte
- Mais je n'arrive pas a revenir dans le module aprés, si j'affiche msgbox code dans le module, à la suite de l'appel de la userform, la msgbox apparait, mais elle est vide, j'ai perdu le contenu de ma variable.
Il doit y avoir une commande qui permet de revenir au module, ou de transférer le contenu de la variable (pourtant déclarée en public au début du module), mais je ne la connait pas.
sarrpas
Messages postés1Date d'inscriptionmercredi 1 février 2006StatutMembreDernière intervention25 septembre 2006 25 sept. 2006 à 14:26
Bonjour à tous j'ai une erreur vb6 ( The signer Object has not been properly initialized ) quand je veux signer un texte .L'erreur provient de :
sig.Certificate = cert
Le code est le suivant :
Private Sub Command1_Click()
' On Error GoTo Err
Dim sd As New CAPICOM.SignedData
Dim store As New CAPICOM.store
store.Open CAPICOM_LOCAL_MACHINE_STORE, "My", CAPICOM_STORE_OPEN_READ_WRITE
Dim cert As New CAPICOM.Certificate
Set cert = store.Certificates.Item(1)
Set store = Nothing
Dim sig As New CAPICOM.signer
sig.Certificate = cert
sd.Content = Text1.Text
Text2.Text = sd.Sign(sig, True, CAPICOM_ENCODE_BASE64)
'Err:
' Text2.Text = Err.Description
End Sub