Bug récurent sur les variables

Bonjour à tous,

J'ai écrit un code qui explore tous les fichiers textes (.o) d'un dossier, qui me récupère certaines informations et me les met en forme dans un tableur. C'est ma première macro "compliquée" (autre que des si et des séquences de calculs)

J'ai un problème avec ma variable "tableau" de type variant, qui selon l'espion est définie comme Variant/String jusqu'au moment ou elle décide de passer en Variant/Integer, et ca ne marche plus. Cette variable me sert à chercher une valeur ligne par ligne ; tableau=Split(contenu), je trouve la correspondance avec if tableau(0)="machin", puis après if tableau(7)="sous-machin" pour cibler la bonne valeur ... bref "L'indice n'appartient pas à la sélection"

J'ai tout tenté : Dim tableau/ Dim tableau () / Dim tableau() as string/Dim tableau() as variant/Dim tableau as variant.

Voici un aperçu de mon code. Quelqu'un pourrait-il m'aider svp ?

Sub testaspi()
    Dim Repertoire As FileDialog, monRepertoire As String
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)

    Repertoire.Show
    Sheets("recuperation").Select

    If Repertoire.SelectedItems.Count > 0 Then
        monRepertoire = Repertoire.SelectedItems(1)
        GrosMorceau monRepertoire
    Else
        MsgBox "Aucun Répertoire Sélectionné"
    End If
    MsgBox "Fin !"
End Sub

Sub GrosMorceau(ceRepertoire As String)

    Dim Fso, SourceFolder, SubFolder, fichier As Object
    Dim cherche As Range
    Dim Nb, Col, l As Integer        ' il avait pas déclaré la variable contenu
    Dim TabMean() As String

    Col = 2
    Cells(4, Col).Select
    Range(Selection, Selection.End(xlDown)).Select
    Nb = Selection.Cells.Count
    ReDim TabMean(Nb - 1)
    l = 1
    For i = 0 To Nb - 1
        TabMean(i) = Range("B" & i + 4)
    Next

    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(ceRepertoire)

    For Each fichier In SourceFolder.Files
        If Right(fichier.Name, 2) = ".o" Then

            Cells(1, Col + 1).Value = fichier.Name

            N = FreeFile
            Open fichier For Input As #N     ' je mettrais pas #

            Do While Not EOF(N)                ' j'aurais mis While Not EOF(N)
                Line Input #N, contenu
                tableau = Split(contenu)
'Debug.Print (tableau(0))
                    If tableau(0) = "reponse" Then
                        For j = 0 To Nb - 1
                            If tableau(7) = TabMean(j) And Range("A4") = "type2" Then
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            Line Input #N, contenu
                            tableau = Split(contenu)
                            Cells(j + 4, Col + 1).String = tableau(17)
                            Cells(j + 4, Col + 2).Value = tableau(18)
                            Exit For
                            End If
                        Next
                    End If
            Loop
        Col = Col + 4
'        If Col > 8 Then
'        Range("B3").Select
'        Selection.CurrentRegion.Select
'        Selection.Copy
'        Selection.Offset(0, Col - 5).Select
'        ActiveSheet.Paste
'        End If
        End If
    Next fichier

For Each SubFolder In SourceFolder.subfolders
   GrosMorceau SubFolder.Path
Next SubFolder

End Sub

Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
    On Error Resume Next
    FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
End Function

Bonjour,

peux-tu nous mettre un exemple de fichier .O ainsi que ce tu essaies de faire ?

Oui bien sur. J'ai bricolé 2 fichiers .o pour tester ma macro (les vrais faisant plus de 100 000 lignes). Les fichiers .o ne sont pas accepter sur le forum, je vous le joins en .txt pour exemple. Je souhaite récupérer les 2 valeurs sous les lignes où il y a marqué "type2". J'organise ces valeurs dans des tableaux (un par fichier exploré), je me repère avec le n° de reponse, exemple : reponse 25. les numéro de réponse que je souhaite sont stockés dans ma variable TabMean(), renseignés dans mon excel.

J'ai réussi à tout faire marcher quelques fois, puis je suis passé sur un vrai fichier, ca ne marchait plus. J'ai tenté une variante, la sur le vrai fichier : excel(ne répond pas) donc peut être que ca tournait sur les 100 000 lignes... je sais pas. Puis ca ne marchait plus sur les fichiers bricolés. La meilleure solution semble être dim tableau (sans rien derrière), ca marche sur les fichiers bricolés, ca plante toujours sur une ligne vide au début. Mon espion me renvoi bien tableau(0)="" quand c'est le cas ; puis à la ligne 112 par exemple, tableau(0) ==> "l'indice ne correspond pas à la sélection". j'ai essayé de sauter la ligne qui me posé problème, mais il en trouve une autre. Mais la plus part des lignes vides ne posent pas de problème !

Malheureusement les vrais fichiers ont des données assez sensibles, je ne peux les partager...je vous joins la capture d'une zone qui fait planter. Pas de raison apparente. Si j'arrive a bricoler un fichier qui ne marche pas dans la journée je vous le partagerai.

Du coup c'est un fichier résultat de calculs en fortran, ouvert sur bloc-note (oui je code au bloc-note ^^)

Ca bug au niveau du curseur, hier a un moment c'était la ligne juste au dessus de "comment." qui plantait (pas de tabulation a l'horizon)

capture

Bon je suis conscient de ne pas avoir forcément respecter les "bonnes pratiques"' de VBA, faute d'expérience. je ne comprends pas toutes les lignes de mon code vba ...

Merci pour votre réponse en tout cas.

10sfhfsdgbh.txt (862.00 Octets)

Bon le fichier que je viens de t'envoyer marche.

Celui la ne marche pas.

7sfhfsdgbhbis.txt (1.83 Ko)

Bonjour,

peux-tu aussi mettre ton classeur ? avec au minimum la feuille récuperation. Merci

Voila. Merci encore

4recup.xlsm (24.90 Ko)

bonjour,

les fichiers que tu as mis ne sont pas de très bons exemples, mais voici une proposition de correction, pour éviter le message d'erreur l'indice n'appartient pas ....

            Do While Not EOF(N)                ' j'aurais mis While Not EOF(N)
                Line Input #N, contenu
                l = l + 1
                tableau = Split(contenu & " ")

Bonjour à tous,

L'anomalie se produit lorsqu'une ligne du fichier txt n'a aucun caractère ( Len=0) puisqu'alors tableau n'existe pas.

Pour éviter cela, faire le test de savoir si la ligne récupérée n'est pas vide:

Rajouter :

If Len(contenu) > 0 Then

juste avant

tableau = Split(contenu)

ne pas oublier de rajouter le End If au bon endroit

A+

Parfait ! Merci h2so4 ! dsl j'avais pas mis les bons mots a chercher dans mon "camouflage" de code, ca doit venir de la le "mauvais exemple".

Et merci AlgoPlus ! Ca apaise de comprendre

Vous n'imaginez pas le gain de temps que ca va m'apporter...

A+

Rechercher des sujets similaires à "bug recurent variables"