Problème InStr et décrémentation
Bonjour à tous,
Je suis en train d'écrire une macro en VBA qui liste le contenu d'un dossier (et sous dossiers). Je sotcke le résultat et je voudrais pouvoir extraire un code se trouvant dans le nom des fichiers.
Les noms des fichiers sont formaté ainsi : 5412271147387_1.tif. Le code se trouve toujours avant le "_"
Tout marche jusque le listing des fichiers, j'utilise name = oFile.name puis i = InStr(name, "_") pour trouver la position du séparateur ici "_". Puis je fais code = Left(name, i) pour extraire le code du nom du fichier.
C'est ici que ça coince, si j'utilise ce qu'il y a au dessus j'ai 5412271147387_ alors qu'il me faudrait 5412271147387. La solution? Décrémenter de 1 le i. Mais ça me génère une erreure...
Une solution?
Merci d'avance
P.S.: voici mon code
Option Explicit
Private Sub test()
ListFilesInFolder "C:\Users\Toto\Documents\", True
End Sub
Sub ListFilesInFolder(strFolderName As String, bIncludeSubfolders As Boolean)
' necessite d'activer la reference Microsoft Scripting RunTime
Static FSO As FileSystemObject
Dim oSourceFolder As Scripting.Folder
Dim oSubFolder As Scripting.Folder
Dim oFile As Scripting.File
Dim name As String
Dim code As String
Dim i As Byte
Static wksDest As Worksheet
Static iRow As Long
Static bNotFirstTime As Boolean
If Not bNotFirstTime Then
Set wksDest = ActiveSheet
Set FSO = CreateObject("Scripting.FileSystemObject")
'wksDest.Cells(1, 1) = "Parent folder"
wksDest.Cells(1, 1) = "Full path"
wksDest.Cells(1, 2) = "File name"
wksDest.Cells(1, 3) = "Size"
wksDest.Cells(1, 4) = "Type"
wksDest.Cells(1, 5) = "Position _"
wksDest.Cells(1, 6) = "Code"
'wksDest.Cells(1, 6) = "Date created"
'wksDest.Cells(1, 7) = "Date last modified"
'wksDest.Cells(1, 8) = "Date last accessed"
'wksDest.Cells(1, 9) = "Attributes"
'wksDest.Cells(1, 10) = "Short path"
'wksDest.Cells(1, 11) = "Short name"
iRow = 2
bNotFirstTime = True
End If
Set oSourceFolder = FSO.GetFolder(strFolderName)
For Each oFile In oSourceFolder.Files
name = oFile.name
i = InStr(name, "_") - 1
code = Left(name, i)
' wksDest.Cells(iRow, 1) = oFile.ParentFolder.Path
wksDest.Cells(iRow, 1) = oFile.Path
wksDest.Cells(iRow, 2) = oFile.name
wksDest.Cells(iRow, 3) = oFile.Size
wksDest.Cells(iRow, 4) = oFile.Type
wksDest.Cells(iRow, 5) = i
wksDest.Cells(iRow, 6) = code
' wksDest.Cells(iRow, 6) = oFile.DateCreated
' wksDest.Cells(iRow, 7) = oFile.DateLastModified
' wksDest.Cells(iRow, 8) = oFile.DateLastAccessed
' wksDest.Cells(iRow, 9) = oFile.Attributes
' wksDest.Cells(iRow, 10) = oFile.ShortPath
' wksDest.Cells(iRow, 11) = oFile.ShortName
iRow = iRow + 1
Next oFile
For Each oSubFolder In oSourceFolder.SubFolders
' On peut mettre ici un traitement spécifique pour les dossiers
Next oSubFolder
If bIncludeSubfolders Then
For Each oSubFolder In oSourceFolder.SubFolders
ListFilesInFolder oSubFolder.Path, True
Next oSubFolder
End If
End SubBonjour
skip1 a écrit :Mais ça me génère une erreure...
Quelle erreur ?
A part quand le nom du fichier ne comporte pas le signe "_"
Si c'est cette erreur essayes
For Each oFile In oSourceFolder.Files
Name = oFile.Name
i = InStr(Name, "_")
If i > 1 Then
code = Left(Name, i - 1)
' wksDest.Cells(iRow, 1) = oFile.ParentFolder.Path
wksDest.Cells(iRow, 1) = oFile.Path
wksDest.Cells(iRow, 2) = oFile.Name
wksDest.Cells(iRow, 3) = oFile.Size
wksDest.Cells(iRow, 4) = oFile.Type
wksDest.Cells(iRow, 5) = i
wksDest.Cells(iRow, 6) = code
' wksDest.Cells(iRow, 6) = oFile.DateCreated
' wksDest.Cells(iRow, 7) = oFile.DateLastModified
' wksDest.Cells(iRow, 8) = oFile.DateLastAccessed
' wksDest.Cells(iRow, 9) = oFile.Attributes
' wksDest.Cells(iRow, 10) = oFile.ShortPath
' wksDest.Cells(iRow, 11) = oFile.ShortName
iRow = iRow + 1
End If
Next oFileSalut,
ça me donnais une erreur overflow.
J'ai réussis à trouver une solution en faisant ainsi:
For Each oFile In oSourceFolder.Files
j = Len(oFile.name)
i = InStr(StrReverse(oFile.name), "_")
k = j - i
name = Left(oFile.name, k)
' wksDest.Cells(iRow, 1) = oFile.ParentFolder.Path
wksDest.Cells(iRow, 1) = oFile.Path
wksDest.Cells(iRow, 2) = oFile.name
wksDest.Cells(iRow, 3) = oFile.Size
wksDest.Cells(iRow, 4) = oFile.Type
wksDest.Cells(iRow, 5) = j
wksDest.Cells(iRow, 6) = i
wksDest.Cells(iRow, 7) = k
wksDest.Cells(iRow, 8) = name
' wksDest.Cells(iRow, 6) = oFile.DateCreated
' wksDest.Cells(iRow, 7) = oFile.DateLastModified
' wksDest.Cells(iRow, 8) = oFile.DateLastAccessed
' wksDest.Cells(iRow, 9) = oFile.Attributes
' wksDest.Cells(iRow, 10) = oFile.ShortPath
' wksDest.Cells(iRow, 11) = oFile.ShortName
iRow = iRow + 1
Next oFileMais ta solution fonctionne aussi
Il y a juste que dans la colonne ça ne s'affiche pas comme dans le nom du fichier...
Bonjour,
A tout hasard...
ne faudrait il pas écrire
i = InStr(StrReverse(oFile.name), "_")-1
puisque i renvoie la position de "_", donc left récupère jusqu'à cette position, il faut donc prendre un caractère de moins
Cordialement
André
Bonjour,
Cela ne fonctionnera pas, il faut tester justement si le i n'est pas égal à 0 sinon c'est pas possible de soustraire 1
Bonjour
skip1 a écrit :ça me donnais une erreur overflow.
Normal : I est déclaré en Byte (0 à 255)
Si dans le nom du fichier il n'y a pas le caractère "_" ---> I - 1 = (normalement -1) mais dans ce cas overflow (dépassement de capacité)
Avec ta solution si le caractère n'est pas présent tu prends tout le nom du fichier
Je ne savais pas que l'on pouvait le faire
Comme quoi on en apprend tous les jours
Par contre un soucis qui n'a rien à voir avec celui-ci, le dossier est listé deux fois, cela viendrait d'où?
Et puis j'utiliserais le résultat de ce qui est fais ici pour le comparerà ce qu'il y a dans un autre fichier, le format des cellules a de l'importance ou peut importe?
Bonjour
skip1 a écrit :le dossier est listé deux fois, cela viendrait d'où?
Aucune idée
Fais du pas à pas
skip1 a écrit :le format des cellules a de l'importance ou peut importe?
Le format des cellules ou le format du texte ?
Pour le texte si tu compares avec = la casse est importante : il faut comparer en mettant soit en majuscules soit en minuscules
Bonjour,
Pour expliquer plus clairement,
je liste le fichier 5412271147387_1.tif, ce fichier a comme identifiant 5412271147387, dans la colonne Code je devrais avoir 5412271147387 mais j'ai 5,41227E+12 qui s'affiche.
Quand je mets le format de la cellule en numérique et plus en format générale, j'ai bien 5412271147387 qui est indiqué.
Vu que je vais utiliser ce qu'il se trouve dans la colonne code pour comparer avec un autre fichier, cela va t'il fonctionner ou non?
Bonjour
Mon avis
Ton affichage 5,41227E+12 n'est que de l'affichage, le nombre stocké est bien 5412271147387
Et si tu le compares avec un nombre il n'y aura pas de problème
Je viens de faire l'essai
Effectivement, je ne l'avais pas remarqué au début.
Cette partie du script fonctionne bien, il faut passer à la suite maintenant.
Merci pour ton aide