XL 2010 Temporisation !! entre création et lecture du fichier texte

Ron2cuir

XLDnaute Nouveau
Bonjour
La macro a pour but de lancer le shell net view et stocker le résultat dans un fichier texte (crée sur un disque externe)
puis ce fichier est lu par le classique get...
- En pas à pas le fichier lu est renseigné sans problème.
- En exécution la fréquence de résultats positifs est variable voire nulle.
j'ai essayer de temporiser entre les deux étapes sans amélioration.
Voila le mystère!!!


Merci à tous les courageux contributeurs
RON
VB:
Option Explicit
Public LectNetView As String
Public ListDesDk As String
Sub passe_EnvironRevueTest()
    Dim leClas, DossF As String
    Dim I, J, ResuN, ResuD, ManX, CtrVId, CtrOk
    I = 0
Stadium:
    leClas = ThisWorkbook.Path & "\NetView"
    On Error Resume Next
    Kill leClas & "\envirOrdo.txt"
    RmDir leClas
    On Error GoTo 0
    If Dir(leClas, vbDirectory) = "" Then MkDir leClas
    leClas = leClas & "\envirOrdo.txt"
I = 0
    Shell "cmd.exe /C c:\windows\system32\net view > " & "" & leClas & "", vbHide
    
    'Application.Wait (Now + TimeValue("0:00:02"))
Relire:
    LectNetView = LireFichierTexte(leClas)
    I = I + 1
    If LectNetView = "" And I < 4 Then GoTo Relire
    If LectNetView <> "" Then Beep
    If LectNetView = "" Then
    CtrVId = CtrVId + 1
    Else
    CtrOk = CtrOk + 1
    End If
    J = J + 1
    If J > 100 Then Stop: J = 0: CtrVId = 0: CtrOk = 0: Stop
    GoTo Stadium
End Sub
Public Function LireFichierTexte(ByVal monfichier As String) As String
    On Error GoTo LireFichierTexteErreur
    Dim IndexFichier As Integer
    IndexFichier = FreeFile()
    Open monfichier For Binary Access Read As #IndexFichier
    LireFichierTexte = Space$(LOF(IndexFichier))
    Get #IndexFichier, , LireFichierTexte
    Close #IndexFichier
    Exit Function
LireFichierTexteErreur:
    Close #IndexFichier
    LireFichierTexte = ""
End Function
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Ron2cuir,
La lecture d'un fichier est infiniment plus lent que l’exécution du VBA.
Donc le VBA travaille sur un fichier non chargé.
En pas à pas, vous laissez tout le temps au fichier de se charger.
Vous pouvez tenter un Do Events qui va rendre la main au système pour traiter les tâches.
 

patricktoulon

XLDnaute Barbatruc
bonjour tous les deux
c'est pourtant si simple
le get se fait en mémoire et c'est relativement rapide
il faut donc boucler tant que le get ne renvoie rien
pas de doevents,de wait et autre cochonnerie qui sont par définition approximative et elle peuvent varier selon la puissance du pc de la memoire occupée du procc etc...

tandis qu'avec un do loop ca peut durer tartampion il n'y a pas d'erreur ou de blanc a gérer
tout simplement
VB:
Sub testnetview()
    Dim LeClas$, X#, LaChaine$
    LeClas = ThisWorkbook.Path & "\NetView\envirOrdo.txt"
    If Dir(LeClas) <> "" Then Kill LeClas
    Shell "cmd.exe /C c:\windows\system32\net view > " & "" & LeClas & "", vbNormal
    Do While LaChaine = ""
        X = FreeFile
        Open LeClas For Binary Access Read As #X: LaChaine = String(LOF(X), " "): Get #X, , LaChaine: Close #X
    Loop
   ' quand on sort du do/loop on a forcement le text
    MsgBox LaChaine
End Sub

on pourrait ajouter un timer qui sortirait si un delay prédéterminé est dépassé aussi
bonne route
 

patricktoulon

XLDnaute Barbatruc
et la voila avec un delay de 2 secondes histoire de ne pas bouclé indéfiniment si netview bug
VB:
Sub testnetview()
    Dim LeClas$, X#, LaChaine$, T#
    LeClas = ThisWorkbook.Path & "\NetView\envirOrdo.txt"
    If Dir(LeClas) <> "" Then Kill LeClas
    Shell "cmd.exe /C c:\windows\system32\net view > " & "" & LeClas & "", vbNormal
    T = Timer
    Do While LaChaine = "" And Timer - T < 2
        X = FreeFile
        Open LeClas For Binary Access Read As #X: LaChaine = String(LOF(X), " "): Get #X, , LaChaine: Close #X
    Loop
    ' quand on sort du do/loop on a forcement le text sauf delay dépassé
    If LaChaine = "" Then
        MsgBox "le delay d'attente de 2 secondes a été depassé desolé "
    Else
        MsgBox LaChaine
    End If
End Sub
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

Patrick, une question me taraude.
Qu'est-ce qui te dit que le fichier a été complètement écrit ?
Par exemple un de 10000 lignes ou plus, ce n'est pas instantané. Et si l'écriture a lieu sans accès exclusif il peut être ouvert avant la fin non ?
eric
 

patricktoulon

XLDnaute Barbatruc
re
il peut être ouvert avant la fin non ?
bonjour @erriiiic
en acces read si le fichier n'est pas complet le bom est non accessible et donc chaîne retournera vide

il a suffit que je m'assure que le fichier crée par le shell existe bien et ça roule ...
@Ron2cuir

faux !!!!!le fichier existe déjà avant la fin de son écriture
si je puis m'exprimer ainsi c'est un peu comme du streaming

je vous l'accorde on parle là de quelques millièmes de millième
mais vous tombez dans un de ces trou ben WALOUH!!!!!!


tournez ca dans tout les sens il n'y a que le lof qui donnera la chaîne a condition que le fichier soit accessible donc non ouvert par la commande netview

j'ai tester plusieurs fois on a bien le fichier dans le dossier mais vba ne le donne pas simultanément

c'est un peu l'inconvénient quand on utilise des commande externes
d'ailleurs il est peut être possible que cette commande puisse etre lancée sans CMD ca je sais pas je n'ai pas cherché
 

Discussions similaires

Haut Bas