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 FunctionBonjour,
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)
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.
Bonjour,
peux-tu aussi mettre ton classeur ? avec au minimum la feuille récuperation. Merci
Voila. Merci encore
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 Thenjuste 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+