Importer des documents via un scanner [Résolu]

cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 19 déc. 2013 à 14:31 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 15 janv. 2014 à 18:18
Bonjour à tous,


Donc voilà, j'attaque la dernière partie de mon projet, qui ce divisera en plusieurs étapes... Je vais donc commencer par la première :

Sur un USF, j'ai un TreeView et un bouton "importer des rapports".

Le TreeView servirait à afficher le contenu d'un dossier "Rapport signés" situer dans /mes documents/POINTAGES que ce soit Win XP ou supérieur.

Le bouton "importer des rapports" (qui est le but de ce post) : servirait à numériser des rapports en choisissant le périphérique et en les stockant automatiquement de le dossier "Rapport signés".

Qui apporte cette question : Comment fait on ?


Le problème est que j'ai fais des recherches sur le net et je n'ai trouvé que ce liens http://codes-sources.commentcamarche.net/source/462-peripheriques-twain-scaner-webcam , mais ne comprend pas trop son fonctionnement.

Si quelqu'un aurais des solutions à m'apporter, sachant que je ne suis pas encore très fort dans le VBA.

--
Afficher la suite 

37 réponses

Répondre au sujet
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 19 déc. 2013 à 16:04
0
Utile
2
Bonjour,

Je connais une manière de scanner des documents, en utilisant la Library WIA. Pour cela il faut mettre cette dll dans: C:\Windows\System32 et ensuite l'enregistrer.
Voici un programme qui fait cela avec toutes les explications nécessaires:
http://codes-sources.commentcamarche.net/source/48234-boite-couleurs


Après avoir suivi toutes les instructions voici le code. Il faut que le scanner soit allumé:

'outils-Reference Cochez Microsoft Windows Image Acquisition Library
'http://silkyroad.developpez.com/VBA/WindowsImageAcquisition/#LIV-C
'telecharger ce programme pour avoir la dll WIA http://codes-sources.commentcamarche.net/source/48234-boite-couleurs
'tout la marche à suivre est expliqué
Option Explicit
Dim Img As ImageFile
'numérisation
Private Sub CommandButton1_Click()
Dim wiaImg As New WIA.ImageFile
Dim wiaDialog As New WIA.CommonDialog
Dim wiaScanner As WIA.Device
Set Img = wiaDialog.ShowAcquireImage
If Not Img Is Nothing Then
Set Image1.Picture = Img.FileData.Picture
End If
End Sub
'enrgistrement
Private Sub CommandButton2_Click()
Img.SaveFile "C:\Users\Daniel\Documents\Scanner.JPG"
End Sub
Private Sub UserForm_Initialize()
Image1.PictureSizeMode = fmPictureSizeModeZoom
End Sub

Bon courage

cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 19 déc. 2013 à 16:05
J'oublié:
2 button dans l'userForm et un contrôle image
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 19 déc. 2013 à 16:21
Ce qui veut dire que tous les PC qui auront ce fichier devront avoir la dll en question ?

ça va les compliquer un peu cette histoire, ou j'ai mal compris...
Commenter la réponse de cs_Le Pivert
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 19 déc. 2013 à 16:48
0
Utile
Et oui c'est cela, c'est pour ça que j'ai voulu t'avertir. Et en plus il faut enregistrer la dll. Bon si il n'y a qu'une dizaine de machines c'est assez rapide . Tu mets ta dll dans C:\Windows\System32, ça prend 10 s. Ensuite pour l'enregistrer avec mon programme 10 s encore (dll et programme sur une clé USB). Pour la référence elle est coché avec ton classeur. Cela tu ne le fais qu'une fois. Mais j'ai changé de pc et pris Windows8, je ne me rappelle pas avoir eu à installer cette dll. Mais programmes fonctionnent. Vérifie sur ta machine si tu ne l'as pas. Bon je ne connais que cette façon. Tu a les site à consulter pour te faire une idée.
Commenter la réponse de cs_Le Pivert
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 19 déc. 2013 à 16:58
0
Utile
2
J'ai raccourci le code qui fonctionne très bien:

'outils-Reference Cochez Microsoft Windows Image Acquisition Library
'http://silkyroad.developpez.com/VBA/WindowsImageAcquisition/#LIV-C
'telecharger ce programme pour avoir la dll WIA http://codes-sources.commentcamarche.net/source/48234-boite-couleurs
'tout la marche à suivre est expliqué
Option Explicit
Dim wiaImg As New WIA.ImageFile
Dim wiaDialog As New WIA.CommonDialog
'numérisation
Private Sub CommandButton1_Click()
Set wiaImg = wiaDialog.ShowAcquireImage
If Not wiaImg Is Nothing Then
Set Image1.Picture = wiaImg.FileData.Picture
End If
End Sub
'enregistrement
Private Sub CommandButton2_Click()
wiaImg.SaveFile "C:\Users\Daniel\Documents\essai.JPG"
End Sub
Private Sub UserForm_Initialize()
Image1.PictureSizeMode = fmPictureSizeModeZoom
End Sub

cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 19 déc. 2013 à 17:55
J'ai trouvé une nouvelle numérisation avec aperçu, choix de scanner et d'enregistrement et de nombreuses autres options. Voici le code:

'numerisation avec aperçu et choix de scanner et d'enregistrement dans options
Private Sub CommandButton3_Click()
Dim MonDevice As Device
Set MonDevice = wiaDialog.ShowSelectDevice
If Not (MonDevice Is Nothing) Then
wiaDialog.ShowAcquisitionWizard MonDevice
End If
End Sub

là tu n'as même pas besoin du contrôle image tout ce fait par la boite de numérisation. Super!!!!!!
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 20 déc. 2013 à 08:35
Bonjour Daniel

Que du bonheur !!! et en plus plus besoin de dll si je comprend bien... j'ai pas encore essayé car j'ai un soucis de sauvegarde, alors c'est en bonne voie, cependant lorsque je ferme le classeur il me supprime bien toutes les feuilles sauf la "matrice", mais à la réouverture il me créer une "MATRICE2"... donc voilà... Mais je vais continuer à chercher...

De toute manière ça se passe en "Workbook before close" et le bouton fermer...

Bonne journée à toi et merci

Christian
Commenter la réponse de cs_Le Pivert
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 20 déc. 2013 à 15:41
0
Utile
Non j'ai parlé du contrôle image, pas de la dll. D'ailleurs j'ai trouvé ce code sur le site que je t'ai indiqué:

http://silkyroad.developpez.com/VBA/WindowsImageAcquisition/#LIV-C

Pour ce qui est de la feuille créée à l'ouverture il faut regarder dans ThisWorkBook ce que tu as mis dans l'évenement: Private Sub Workbook_Open()


Commenter la réponse de cs_Le Pivert
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 21 déc. 2013 à 13:50
0
Utile
1
J'ai trouvé un moyen simple. Lancer le scanner. Une boite de numérisation s'ouvre avec aperçu d'où tu choisis le nom et la destination de ta numérisation. Si le scanner n'est pas ouvert un message t'averti. Tout cela avec 1 seul ligne de code, pas de dll ni de contrôle image. Pourquoi faire compliqué quand on peut faire simple.

Shell "wiaacmgr.exe", vbNormalFocus


Adaptable sur toutes les machines, enfin je l'espère?

Bon WE
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 21 déc. 2013 à 13:55
Il faut activer le scanner à partir de la barre de tâche en bas. La fenêtre ne s'ouvre pas dans l'interface.
Commenter la réponse de cs_Le Pivert
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 7 janv. 2014 à 11:09
0
Utile
Bonjour Daniel ;)

Tout d'abord, une bonne année ainsi que bonheur personnel et réussite professionnel.

J'ai été absent et je n'ai donc pas pu continuer mon projet, mais fini les vacances, je me remet au boulot ;).

Donc, la ligne de code que tu m'as fournie fonctionne à merveille, je ne l'ai pas encore testé sur d'autre versions de windows, mais ça ne devrait pas pauser de problème étant donné qu'en premier il lance une recherche de driver. donc c'est tout simplement parfait, je passe donc à l'étape 2, qui fera l'objet d'un nouveau poste...

On tient le bon bout... ;)

Christian

--
Commenter la réponse de cco86260
mcoppa 2 Messages postés vendredi 28 octobre 2005Date d'inscription 31 janvier 2014 Dernière intervention - 8 janv. 2014 à 11:00
0
Utile
1
Bonjour,
Je tombe sur ces questions d'insérer un scan en VBA. Il y a une solution très simple :

Sub Scan()
On Error Resume Next
WordBasic.InsertImagerScan
End Sub

Ensuite, il suffit d'appeler la macro ou de l'insérer dans les menus du ruban (personnaliser le ruban).
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 8 janv. 2014 à 11:04
Bonjour mcoppa,

En faite le but de ce sujet est de pouvoir importer des documents dans un dossier, donc la méthode fourni pas cs_le pivert fonctionne parfaitement, mais merci quand même de t'être intéresser.

Une bonne année ;)

Christian
Commenter la réponse de mcoppa
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 13 janv. 2014 à 14:48
0
Utile
Bonjour Daniel,


Après réflexion, le code fonctionne sauf que je me suis aperçu d'une chose... on ne peut pas importer en pdf... le hic est que les jpeg sont lourd à envoyer, surtout s'il y en à 15...

Donc Plan A : garder ce code, et créer un USF proposant de convertir les jpeg en PDF... c'est possible à priori d'après certain forum

Et Plan B : ba il feront au moins ça à la mano... mais ça sort de ce que j'avais prévu... :(

Merci

Christian

--
Commenter la réponse de cco86260
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 13 janv. 2014 à 16:59
0
Utile
Je viens de faire l'essai. Par code pour ouvrir la boite de dialogue du scanner tu n'as que l'option d'image. Par contre si tu ouvres ton scanner avec l'exe, tu as l'option PDF.

Pour convertir des jpeg en PDF rien de plus simple, tu te sers de ton programme après avoir au préalable inséré ton jpeg dans une feuille de ton classeur. Pour insérer, sers-toi de l'enregistreur de macro. Tu te mets sur ta feuille dans la cellule A1, tu ouvres l'enregistreur et tu fais insérer image. Tu as ta macro. Ensuite il te suffit de la convertir en jpeg.
Commenter la réponse de cs_Le Pivert
0
Utile
Je suis confronté à ce probléme de scanérisation depuis près de trois semaines.
ta dernière ligne de code est excellente mais il faudrait trouvé le moyen de passer le nom et le chemin des scan par variable à l'appel du programme comme j'avais trouvé avec CmdTwain.

Voici mon code :

Private Sub CommandButton1_Click() 'Apui sur Capture Scan
Dim ProgScan 'Création de la variable ProgScan (qui contiendra le répertoire le nom du programe de Scannage et les options)
Dim newHour, newMinute, newSecond, waitTime As Date 'Création des variables de tempo
NomRep = Chemin & "\Scan\" 'Chargement dela variable NomRep
'Chargement dela variable ProgScan avec toutes les obtions qui vont bien
ProgScan = "C:\Program Files\GssEziSoft\CmdTwain\CmdTwain.exe /PAPER=A4 /DPI=200 /JPG25"
'Chargement dela variable NomScan avec Nom Prénom Code et .jpg
NomScan = ComboBox1 & " " & ComboBox2 & " " & TextBox1 & ".jpg"
'Lance le programe de Scannérisation (Commande pour appeler un autre programe depuis exel:Call Shell
Call Shell(ProgScan & " " & Chr(34) & NomRep & NomScan & Chr(34))
'Temporisation pour le temps de création de l'image 'Initialisation de newHour
newMinute = Minute(Now()) 'Initialisation de newMinute
newSecond = Second(Now()) + 20 'Initialisation de newSecond avec une tempo de x secondes
waitTime = TimeSerial(newHour, newMinute, newSecond) 'Initialisation de waitTime
Application.Wait waitTime 'Pose d'atente de création du Scan
Image1.Picture = LoadPicture(NomRep & NomScan) 'Charge l'image
End Sub 'Fin de Procédure



pour exécuter ce programme il faut télécharger et installer CmdTwain.exe


J'ai passé mon dimanche à essayer toutes sorte de manière de passer des variable à un programme mais en vain.

il faudrait une aide pour votre programme wiaacmgr.exe ou peut-on trouver de la doc sur ce programme
Commenter la réponse de GrosBill
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 14 janv. 2014 à 08:20
0
Utile
1
GrosBill, pour ce que tu cherches à faire, il faut faire une recherche de fichier qui te retourne le chemin complet. J'ai la réponse mais le code est conséquent. Si cela t'intéresse je te le communiquerais.
Salut le cs_LePivert.

Je cherche a faire le contraire de ce que tu dit, qui peut être fait à partir de FileDialogSelectedItems.

Je cherche à utiliser ton code (Shell "wiaacmgr.exe") en lui passant en paramètre le chemin et le nom du fichier pour rafraichir l'Usf qui propose un choix de groupe et un chemin pour stocké le scan effectué.

(PS : avec quel éditeur tu envoie tes morceaux de programmes mon code est totalement dégueulasse par rapport au tien ! )

a+ GrosBill
Commenter la réponse de cs_Le Pivert
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 14 janv. 2014 à 08:43
0
Utile
Salut Daniel,
Bonjour GrosBill,

Waow.... tout ça... :)

Je commençais à désespérer sur la faisabilité. Mais une idée nouvelle m'est venu...

C'était, dans le même principe de fonctionnement du projet, faire carrément un application VB.NET qui agirait sur le classeur excel...

Comme ça plus de problème de scan ou autre...

9a va peut être être plus compliqué... je ne sais pas... mais leS code VBA que tu m'as fourni Daniel ne sont pas perdu, il faudra juste que j'adapte...

Comment est cette idée farfelu :)

En faite je suis tellement débordé de travail que je n'ai que ça à faire... mdr

Bonne journée

Christian

--
Commenter la réponse de cco86260
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 14/01/2014 à 10:10
0
Utile
Bonjour,
" (PS : avec quel éditeur tu envoie tes morceaux de programmes mon code est totalement dégueulasse par rapport au tien ! ) "
En sélectionnant ton code et en cliquant ensuite sur l'icône "code" (4ème dans le bandeau au-dessus de la zone d'édition, mà où tu réponds).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 14 janv. 2014 à 11:13
0
Utile
1
GrosBill, en la matière je ne sais pas. Poste une nouvelle demande:

"passer en paramètre le chemin et le nom du fichier à l'exe wiaacmgr.exe"

Christian pour faire ce que tu dis il faut connaître le langage VB.NET. Ensuite je ne vois pas pourquoi cela te supprimerait le scan. C'est toi qui l'a demandé sur ce post!
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 14 janv. 2014 à 11:27
Bonjour Daniel,

Comment vas-tu ?

Mais je veux rien supprimer du tout moi...

Mais ça m'a l'air assez compliqué ce que je souhaite vouloir faire pour importer les rapports signés comme expliqué plus haut, donc je me suis dis que peut-être avec VB.net ça serait jouable, mais je suis en train d'étudier la chose et effectivement c'est pire...

Je cherche donc le meilleur méthode...
Commenter la réponse de cs_Le Pivert
0
Utile
2
Merci ucfoutu


Private Sub CommandButton1_Click() 'Apui sur Capture Scan

Dim ProgScan 'Création de la variable ProgScan (qui contiendra le répertoire le nom du programe de Scannage et les options)
Dim newHour, newMinute, newSecond, waitTime As Date 'Création des variables de tempo
NomRep = Chemin & "\Scan\" 'Chargement dela variable NomRep
'Chargement dela variable ProgScan avec toutes les obtions qui vont bien
ProgScan = "C:\Program Files\GssEziSoft\CmdTwain\CmdTwain.exe /PAPER=A4 /DPI=200 /JPG25"
'Chargement dela variable NomScan avec Nom Prénom Code et .jpg
NomScan = ComboBox1 & " " & ComboBox2 & " " & TextBox1 & ".jpg"
'Lance le programe de Scannérisation (Commande pour appeler un autre programe depuis exel:Call Shell
Call Shell(ProgScan & " " & Chr(34) & NomRep & NomScan & Chr(34))
'Temporisation pour le temps de création de l'image
newMinute = Minute(Now()) 'Initialisation de newMinute
newSecond = Second(Now()) + 20 'Initialisation de newSecond avec une tempo de x secondes
waitTime = TimeSerial(newHour, newMinute, newSecond) 'Initialisation de waitTime
Application.Wait waitTime 'Pose d'atente de création du Scan
Image1.Picture = LoadPicture(NomRep & NomScan) 'Charge l'image
End Sub 'Fin de Procédure



J'ai fait un petit programme exemple
Un userform
3 ComboBOX (Nom, Prénom, Ville)
4 textBox (code, Tel 1,Tel 2, Tel3)
5 CommandButton (Capture scan,Modifie Fichier,Init Scan,Valider,Quitter)
1 Image

Si quelqu'un le veut dite moi comment vous le faire parvenir.
Visiblement je me suis encore chier dessus pour édité le code !!!!!
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 14 janv. 2014 à 15:23
GrosBill,

Si il y a au moin un truc que je maitrise c'est ça... la publication des codes... mdr

que voici :

Private Sub CommandButton1_Click() 'Apui sur Capture Scan
Dim ProgScan 'Création de la variable ProgScan (qui contiendra le répertoire le nom du programe de Scannage et les options)
Dim newHour, newMinute, newSecond, waitTime As Date 'Création des variables de tempo
NomRep = Chemin & "\Scan\" 'Chargement dela variable NomRep
'Chargement dela variable ProgScan avec toutes les obtions qui vont bien
ProgScan = "C:\Program Files\GssEziSoft\CmdTwain\CmdTwain.exe /PAPER=A4 /DPI=200 /JPG25"
'Chargement dela variable NomScan avec Nom Prénom Code et .jpg
NomScan = ComboBox1 & " " & ComboBox2 & " " & TextBox1 & ".jpg"
'Lance le programe de Scannérisation (Commande pour appeler un autre programe depuis exel:Call Shell
Call Shell(ProgScan & " " & Chr(34) & NomRep & NomScan & Chr(34))
'Temporisation pour le temps de création de l'image
newMinute = Minute(Now()) 'Initialisation de newMinute
newSecond = Second(Now()) + 20 'Initialisation de newSecond avec une tempo de x secondes
waitTime = TimeSerial(newHour, newMinute, newSecond) 'Initialisation de waitTime
Application.Wait waitTime 'Pose d'atente de création du Scan
Image1.Picture = LoadPicture(NomRep & NomScan) 'Charge l'image
End Sub 'Fin de Procédure
Commenter la réponse de GrosBill
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 14 janv. 2014 à 12:18
0
Utile
3
Ce que tu nous montres là n'est valable que pour toi. Le chemin de l'exe du scanner est en dur! Ce qu'il faut faire c'est trouver le chemin chez l'utilisateur et ouvrir l'exe pour avoir la boite de dialogue de numérisation du scanner. C'est pour cela qu'il faut faire une recherche du fichier, à la 1ère utilisation seulement car on va garder le chemin sur une feuille Excel. Bon courage!
Salut cs_Le Pivert;

S'il s'agit d'une remarque sur mon code, il fonctionne avec CmdTwain et j'ai laissé le programme installé seul dans le répertoire par défaut.
Donc si les personnes qui veule faire fonctionné ce petit bout de programme installe CmdTwain sans changer le répertoire par défaut la ligne de commande est la même sur tous les ordi.

GrosBill
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 14 janv. 2014 à 17:59
Tu as donné ta solution pour CmdTwain. Moi je la donne pour tous les scanners. Mais en général on évite de mettre des chemins en dur dans un programme. Si une personne a une autre lettre que C pour son disque dur cela ne fonctionnera pas.

Bonne programmation
Salut cs_Le Pivert

CmdTwain n'est pas un scanner mais un logiciel qui émule tout les scanners
Il est à Téléchargé sur GssEzisoft.

Par contre j'ai oublier une ligne de commande dans mon code car je chargeai cette variable dans Private Sub UserForm_Initialize()

Chemin = ActiveWorkbook.Path                                  'Charge le répertoire dans le quel est le programe dans Chemin

A placer au début du code

A + GrosBill
Commenter la réponse de cs_Le Pivert
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 14 janv. 2014 à 15:19
0
Utile
Daniel,

Bon je reste sur mon projet excel VBA finalement... c'est tendu sous VB.NET... mdr, mais c'est bonne école, je vais m'y intéresser pour autre chose.

J'ai lu les réponses mise sur ce poste... mais ça y est... je suis perdu...

Euh.... encore....perdu... ;)

une petite explication ? vite fait :)
--
Commenter la réponse de cco86260
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 14 janv. 2014 à 16:38
0
Utile
Si tu veux avoir la boite de dialogue de numérisation avec les options PDF, il faut que tu ouvres l'exe de ton scanner!

Pour cela il faut que tu connaisses le nom de cette exe pour la chercher!

La recherche de l'exe ne se fait qu'à la 1ère utilisation

Ensuite voici le code à mettre dans un module:

Option Explicit
'recherche de fichiers avec les fonctions API (rapide, récursif)
'code à étudier :-)

'code : Randy Birch/RB Smissaert (mpep)
'http://www.mvps.org/vbnet/index.html?code/fileapi/recursivefolders_minimal.htm

Private Const vbDot = 46
Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const vbBackslash = "\"
Private Const ALL_FILES = "*.*"

Private fp As FILE_PARAMS 'holds search parameters
Private List1(1000, 0) As String
Private i As Long

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Private Type FILE_PARAMS
bRecurse As Boolean
bFindOrExclude As Long '1=find matching, 0=exclude matching
nCount As Long
nSearched As Long
sFileNameExt As String
sFileRoot As String
End Type

Private Declare Function FindFirstFile Lib "kernel32" _
Alias "FindFirstFileA" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long

Private Declare Function FindNextFile Lib "kernel32" _
Alias "FindNextFileA" _
(ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long

Private Declare Function FindClose Lib "kernel32" _
(ByVal hFindFile As Long) As Long

Private Declare Function lstrlen Lib "kernel32" _
Alias "lstrlenW" (ByVal lpString As Long) As Long

Private Declare Function PathMatchSpec Lib "shlwapi" _
Alias "PathMatchSpecW" _
(ByVal pszFileParam As Long, _
ByVal pszSpec As Long) As Long
Sub Start() 'recherche fichier
Dim hFile As Long
Dim WFD As WIN32_FIND_DATA
Dim FolderName As String
Dim filename As String
Dim n As Long
Dim temps, count
Dim scan As String
On Error Resume Next
Sheets("Feuil1").Select 'choix feuille
If [A1] = "" Then
scan = InputBox("Entrez le nom de l'exe du scan" & Chr(10) & " Veuillez patienter ensuite pendant la recherche", "Scanner", "HP Photosmart 5510 series.exe")
temps = Timer ' Timer pour calculer la durée de la recherche
FolderName = "C:\" 'Répertoire
If FolderName = "" Then
Exit Sub
End If
filename = scan 'nom Fichier exe scan
If filename = "" Then
Exit Sub
End If
i = 0
Erase List1

With fp
.sFileRoot = QualifyPath(FolderName) 'start path
.sFileNameExt = filename 'file type(s) of interest
.bRecurse = True 'True = recursive search
.nCount = 0 'results
.nSearched = 0 'results
.bFindOrExclude = 1 '1 = find, 0 = exclude
End With

Call SearchForFiles(fp.sFileRoot)

If i = 0 Then
MsgBox filename & " non trouvé, vérifiez l'orthographe.", , " Conclusion du dossier"
Else
For n = 0 To i - 1
count = i 'On compte les fichiers

With ActiveSheet("Feuil1")
[A1] = List1(n, 0) 'on inscrit le chemin du fichier sur la feuille Excel
Application.StatusBar = "Trouvé " & count & " fichier(s) " & filename & " en " & Timer - temps & " secondes."

End With
Next

MsgBox "Trouvé " & count & " fichier(s) " & filename & " en " & Timer - temps & " secondes.", , " Conclusion du dossier"
End If
End If
End Sub
Private Sub SearchForFiles(sRoot As String)

Dim WFD As WIN32_FIND_DATA
Dim hFile As Long

hFile = FindFirstFile(sRoot & ALL_FILES, WFD)

If hFile <> INVALID_HANDLE_VALUE Then
Do
'if a folder, and recurse specified, call
'method again
If (WFD.dwFileAttributes And vbDirectory) Then
If Asc(WFD.cFileName) <> vbDot Then
If fp.bRecurse Then
SearchForFiles sRoot & TrimNull(WFD.cFileName) & _
vbBackslash
End If
End If
Else
'must be a file and not the open temp file (~$....)
If MatchSpec(WFD.cFileName, fp.sFileNameExt) And Not _
Left$(WFD.cFileName, 2) = "~$" Then
fp.nCount = fp.nCount + 1
List1(i, 0) = sRoot & TrimNull(WFD.cFileName)
i = i + 1
End If
End If
Loop While FindNextFile(hFile, WFD)
End If

Call FindClose(hFile)

End Sub
Private Function QualifyPath(sPath As String) As String
If Right$(sPath, 1) <> vbBackslash Then
QualifyPath = sPath & vbBackslash
Else
QualifyPath = sPath
End If
End Function
Private Function TrimNull(startstr As String) As String
TrimNull = Left$(startstr, lstrlen(StrPtr(startstr)))
End Function
Private Function MatchSpec(sFile As String, sSpec As String) As Boolean
MatchSpec = PathMatchSpec(StrPtr(sFile), StrPtr(sSpec)) = _
fp.bFindOrExclude
End Function

j'ai mis des commentaires pour que tu puisses l'adapter

Ensuite 2 boutons: Recherche et Ouvrir boite de numérisation avec ces codes:

'rechercher exe scanner
Private Sub CommandButton1_Click()
Start
End Sub
'boite de dialogue numérisation scanner
Private Sub CommandButton2_Click()
If [A1] = "" Then Exit Sub
Shell [A1], vbNormalFocus
End Sub

Tu essaie et tu verras que c'est très simple d'utilisation. Il n'y a pas de fausse manoeuvre si ce n'est de mettre un fichier exe non valide!

Bon courage
Commenter la réponse de cs_Le Pivert
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 15 janv. 2014 à 10:52
0
Utile
Bonjour Daniel,

Donc je viens de tester le code que tu m'as fourni, et nickel, ça fonctionne... ;)

Sauf qu'il ne me garde pas l'exe en mémoire dans la cellule, à chaque ouverture du classeur la cellule est vide... aie aie aie...

J'ai regardé du coté de ma macro pour la sauvegarde voir si le problème venait pas de là... et non...

Moi pas comprendre ;)

Mais c'est cool, déjà ça fonctionne...

Merci

Christian

--
Commenter la réponse de cco86260
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 15 janv. 2014 à 13:53
0
Utile
1
Tu dois avoir une macro qui nettoie la feuille. Ajoute une nouvelle feuille pour faire l'essai. N'oublie pas de changer dans le module le choix de la feuille:
Sheets("Feuil?").Select 'choix feuille
et de rajouter aussi dans le bouton 'boite de dialogue numérisation scanner
Sheets("Feuil?").Select 'choix feuille
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 15 janv. 2014 à 13:56
Si je me rappelle bien tu ne gardais que certaines feuilles. Tu supprimais toutes les autres feuilles à la fermeture. Regarde de ce côté là!!!!!
Commenter la réponse de cs_Le Pivert

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Importer des documents via un scanner - page 2