hamster man
Messages postés103Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention21 juin 2007
-
12 oct. 2006 à 17:36
hamster man
Messages postés103Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention21 juin 2007
-
16 oct. 2006 à 18:48
bonsoir tout le monde,
jai un petit souci de récupération de données sur fichier csv...
jai fais une forme ou jentre mon nom, prenom ainsi que d'autres infos et de ce programme je créer un fichier csv.
ce que je voudrais , c'est mettre ces infos ds certaine case du fichier csv met le probleme c'est que lorsque jouvre mon fichier en cour pour ajouter une donnée, les données ne s'inscrivent pas sur le fichier csv...voila mon code :
Dim A
A = MsgBox("Vos horaires sont enregistrés", vbOKCancel)
If A = 1 Then Unload Me
End Sub
Private Sub Form_Load()
Dim L_IntLibre As Integer ' Handle de fichier
Dim L_IntNumJourSemaine As Integer ' Numéro du jour (Lundi 1 Dimanche 7)
Dim L_IntNumCol ' Colonne du fichier lue (sert pour la découpe)
Dim L_StrDateFr As String ' Conversion de la date au format FR pour pouvoir etre exploitée
Dim L_StrDateLundi As String
Dim L_StrDateDimanche As String
Dim L_StrLigneFic As String ' Contient une ligne lue dans le fichier XL
Dim L_ObjFs
Dim L_BoolRet ' Valeur pour retour de fonction
Dim L_IntCont, L_IntCont2 As Integer
Dim L_StrDate As String
Dim jour As String
Dim mois As String
Dim an As String
jour = Day(Date)
mois = Month(Date)
an = Year(Date)
' Calcul la date du "jour" (retourne la date de la veille si il est moins de 6h
L_StrDate = Mid$(Date$, 4, 2) + "/" + Mid$(Date$, 1, 2) + "/" + Mid$(Date$, 7)
Txt_Date = L_StrDate
' Initialise à vide le tableau qui va servir à mémoriser la feuille XLS
For L_IntCont = 1 To 20
For L_IntCont2 = 1 To 49
G_StrMemExcel(L_IntCont, L_IntCont2) = ""
Next
Next
If M_StrCurJour "" Then M_StrCurJour Format$(Date$, "dd/mm/yyyy")
' Récupère le nom du fichier XL en cours
L_IntLibre = FreeFile
Open App.Path + "\curweek.txt" For Input As #L_IntLibre
Input #L_IntLibre, M_StrCurJour
Close #L_IntLibre
' Déduit le nom du fichier XL avec lequel on va devoir travailler
G_StrNomXl = "Ordre Mission - " + jour + "-" + mois + "-" + an + ".csv"
G_StrNomCompletXl = App.Path + "\Data" + G_StrNomXl
' Si ce nom est différent de celui mémorisé, il ya un changement de semaine
If G_StrNomXl <> M_StrCurJour Then
L_IntLibre = FreeFile ' On mémorise le nouveau nom de semaine
Open App.Path + "\curweek.txt" For Output As #L_IntLibre
Print #L_IntLibre, G_StrNomXl
Close #L_IntLibre
M_StrCurJour = G_StrNomXl
End If
' Vérifie si le fichier XL existe déjà
Set L_ObjFs = CreateObject("Scripting.FileSystemObject")
L_BoolRet = L_ObjFs.FileExists(G_StrNomCompletXl)
' Si il n'existe pas de fichier XL on en crée un nouveau vierge
If Not L_BoolRet Then
CreeOrdreMission
End If
' Ouvre le fichier XL et le flush dans le tableau G_StrMemExcel
G_IntLigneXl = 1
L_IntLibre = FreeFile
Open G_StrNomCompletXl For Input As #L_IntLibre
While Not EOF(L_IntLibre)
Line Input #L_IntLibre, L_StrLigneFic
L_IntNumCol = 0
ExtractCol:
L_IntNumCol = L_IntNumCol + 1
If InStr(L_StrLigneFic, ";") <> 0 Then
G_StrMemExcel(L_IntNumCol, G_IntLigneXl) = Mid$(L_StrLigneFic, 1, InStr(L_StrLigneFic, ";") - 1)
L_StrLigneFic = Mid$(L_StrLigneFic, InStr(L_StrLigneFic, ";") + 1)
GoTo ExtractCol
Else
G_StrMemExcel(L_IntNumCol, G_IntLigneXl) = L_StrLigneFic
End If
If G_IntLigneXl = 50 Then Close #L_IntLibre
G_IntLigneXl = G_IntLigneXl + 1
Wend
Close #L_IntLibre
End Sub
merci bien a ceux qui auraient le courage d'arriver jusque la...
en attente d'une reponse merci encore pour cette aide!
hamster man
Messages postés103Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention21 juin 2007 16 oct. 2006 à 18:48
salut a tous,
tout d'abord, je voudrais te remercier Jack de m'avoir apporter de l'aide, c'etait tres gentil de ta part.
en essayant ton code j'ai vu kil y avai encore d bug alor jai concu mon code mais autremen et maintenan c nikel ca reporte bien les données mais il savere kil y avai une autre erreur kan je metait mon fichier en memoire pour le modifier avec d données, ca venait du tableau colonne ligne javai inverser mes variables dc c sur ca pouvai pa marcher...
en tt k merci bien
ps: si jamai ca tinteresse jack je te filerai le code pour ke tu regarde, demande moi
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 12 oct. 2006 à 19:17
Salut
Est-ce que tes noms de fichiers sont corrects ?
As-tu utiliser le mode Debug pour tester le contenu des variables au fur et à mesure de l'avancement du programme ?
Debug VB6 :
- Mets ton curseur sur une ligne, tape F9 : couleur indique l'endoit où s'arrêtera le code
- Quand il s'arrête, survole tes variables avec la souris pour connaitre leur contenu
- F8 pour n'avancer que d'une ligne
- F5 pour continuer normalement
Si tu as des "On Error Resume Next" qqpart, vire les.
+ Dans l'IDE VB6, menu Outils, Options, onglet Général : Coche "Arrêt sur toutes les erreurs"
Je n'ai pas eu le courage d'essayer ton code, mais accepte ces remarques :
- La ligne "If G_IntLigneXl = 50 Then Close #L_IntLibre" va poser problème/défaut car tu boucles ensuite sur un fichier qui sera fermé.
Utilise plutôt une boucle "Do While-Loop" à la place du "While Wend" obsolète + un "Exit Do" quand tu voudras sortir
- Je ne vois pas de pré-dimensionnement de ton tableau G_StrMemExcel
Cela peut aussi créer des erreurs en cas de dépassement
- Rapidité dans ta boucle de lecture (si tu as beaucoup de données à traiter) :
Tu utilises à plusieurs reprises "Instr(L_StrLigneFic, ";")"
Mets le résultat dans une variable temporaire et utilise cette variable ensuite
- Efficacité dans ta boucle de lecture :
Ceci t'imposerait de modifier ta structure de données (G_StrMemExcel), mais l'instruction Split permet de ranger des données texte avec séparateur connu dans un tableau en une seule ligne de code + rapidité
- Dans une instruction Dim, une suite de paramètre suivi d'un type ne dimensionne pas chaque paramètre comme le type.
Seul le dernier paramètre sera correctement dimensionné. Les précédents, sans type, seront des Variant
Pas très important dans ton cas, mais à savoir.
Pour info, voilà ce qu'aurait donné ton code avec mes idées :
-1- Le formatage du tableau récepteur :
Private Type typeMonType
Lignes() As String
End Type
Private G_StrMemExcel() As typeMonType
-2- La partie lecture et dépouillement du fichier :
G_IntLigneXl = 1
L_IntLibre = FreeFile
Open G_StrNomCompletXl For Input As #L_IntLibre
Do While Not EOF(L_IntLibre)
Line Input #L_IntLibre, L_StrLigneFic
G_StrMemExcel(G_IntLigneXl).Lignes = Split(L_StrLigneFic, ";")
If G_IntLigneXl = 50 Then Exit Do ' Voir l'utilité de sortir ?
G_IntLigneXl = G_IntLigneXl + 1
Loop
Close #L_IntLibre
-3- Pour faire une vérif en sortie :
Dim r As Integer, t As Integer
For r = 1 To G_IntLigneXl - 1
For t = 0 To UBound(G_StrMemExcel(r).Lignes)
Debug.Print r, G_StrMemExcel(r).Lignes(t)
Next t
Next r
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 12 oct. 2006 à 19:21
PS : J'ai oublié le dimensionnement initial de G_StrMemExcel :
Vidage du tableau avant de commencer la lecture :
Redim G_StrMemExcel(0)
Après le "Line Input" :
Redim Preserve G_StrMemExcel(G_IntLigneXl)