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 Sub

Bonjour

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 oFile

Salut,

ç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 oFile

Mais 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

Rechercher des sujets similaires à "probleme instr decrementation"