J'ai créé un type utilisateur dont voici le descriptif
Public Type PointPlan
X As Single
Y As Single
End Type
Public Type tDonnées
Nom As Integer 'son nom
PremièreZone As Long 'la première zone dans la liste des zones
NbZones As Byte 'le nombre de zones (en général 1)
Intérieur As Long 'la couleur du territoire
Frontière As Long 'la couleur de la frontière
Style As Byte 'le style de remplissage et de frontière
Premier_Roi As Long 'le numéro du premier roi dans la liste des rois
Nombre_Roi As Byte 'le nombre de rois suivants dans cette liste
Date_Début As Integer 'la date du début de la période considérée
Date_Fin As Integer 'la date de la fin de cette même période
Centre As PointPlan 'le point de la carte à partir duquel on affiche
les infos
'(nom du territoire et roi régnant).
Région As Byte 'Nom de la super-région correspondant. Une super
région est
'un ensemble de territoires ayant des points
communs culturels.
'C'est la super-région que l'on retrouve dans le
WB.
AfficheInfo As Byte 'la valeur à partir de laquelle les infos
s'affichent
End Type
Public Type tPays
Données As tDonnées
'les trois champs suivants ne servent que pour la lecture du tableau Pays
du programme
IndexRoi As Long
IndexRgn As Long
Valide As Boolean
End Type
Lorsque j'écris le tableau avec la procédure suivante :
Private Sub CmdBtnEntrerLesPays_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, ENR As Long
If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) = vbYes
Then
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Open CHEMIN & "PAYS.DAT" For Binary As #1
With Worksheets(Feuille).Range(REGION)
While .Cells(Ligne, 3) <> ""
Pays.Données.Nom = CInt(.Cells(Ligne, 3))
Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4))
Pays.Données.NbZones = CByte(.Cells(Ligne, 5))
Pays.Données.Intérieur = CLng(.Cells(Ligne, 6))
Pays.Données.Frontière = CLng(.Cells(Ligne, 7))
Pays.Données.Style = CByte(.Cells(Ligne, 8))
Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9))
Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10))
Pays.Données.Date_Début = CInt(.Cells(Ligne, 11))
Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12))
Pays.Données.Centre.X = CSng(.Cells(Ligne, 13))
Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14))
Pays.Données.Région = CByte(.Cells(Ligne, 15))
Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16))
Pays.IndexRgn = CLng(0)
Pays.IndexRoi = CLng(0)
Pays.Valide = True
Put #1, ENR, Pays
ENR = ENR + 1
Ligne = Ligne + 1
Wend
End With
Close
End If
End Sub
Avec comme première ligne de valeurs 0,58,1 ...
Et que je la relis avec cette procédure,
Private Sub CmdBtnModifierLesCentres_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, col As Integer, rep As Integer
Dim I As Integer, L As Long, B As Byte, S As Single, BO As Boolean, ENR
As Long
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Close
Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays)
With Worksheets(Feuille).Range(REGION)
While Not EOF(1)
'Get #1, , I
'Close
'Exit Sub
Get #1, ENR, Pays
If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then
rep = MsgBox("erreur sur le nom, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then
rep = MsgBox("erreur sur la première zone, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then
rep = MsgBox("erreur sur le nombre de zone, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then
rep = MsgBox("erreur sur l'intérieur, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then
rep = MsgBox("erreur sur la frontière, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then
rep = MsgBox("erreur sur le style, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then
rep = MsgBox("erreur sur le premier roi, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then
rep = MsgBox("erreur sur le nombre de rois, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then
rep = MsgBox("erreur sur le début, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then
rep = MsgBox("erreur sur la fin, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then
rep = MsgBox("erreur sur l'abscisse du centre, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then
rep = MsgBox("erreur sur l'ordonnée du centre, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then
rep = MsgBox("erreur sur la région, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16)) Then
rep = MsgBox("erreur sur l'affichage, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
'If Pays.Données.Nom = .Cells(Ligne, 3) Then
' .Cells(Ligne, 13) = Pays.Données.Centre.X
' .Cells(Ligne, 14) = Pays.Données.Centre.Y
' .Cells(Ligne, 16) = Pays.Données.AfficheInfo
'End If
Ligne = Ligne + 1
ENR = ENR + 1
Wend
End With
Close
End Sub
Mon premier enregistrement commence par 18176 au lieu de 0
Je tourne là dessus depuis plusieurs jours et rien n'y fait.
Help me !!!!
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" a écrit dans le message de news:
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio" wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la structure, et que cette taille est ici toujours supérieure à la taille de l'enregistrement écrit par Put en mode Random. Pour une structure (donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets) suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays) + 2
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
A+
Christophe
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" <parci@invalid.fr> a écrit dans le message de news:
7bp3b11hu3jlo72sqgddrv969d4iu3alfk@4ax.com...
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la
structure, et que cette taille est ici toujours supérieure à la taille
de l'enregistrement écrit par Put en mode Random. Pour une structure
(donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets)
suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays)
+ 2
Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" a écrit dans le message de news:
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio" wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la structure, et que cette taille est ici toujours supérieure à la taille de l'enregistrement écrit par Put en mode Random. Pour une structure (donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets) suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays) + 2
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
A+
Christophe
Patrice Henrio
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
"Fred" a écrit dans le message de news: ek$
Dans le message:%23E7n1$, Patrice Henrio écrit:
J'ai créé un type utilisateur dont voici le descriptif
Public Type PointPlan X As Single Y As Single End Type
Public Type tDonnées Nom As Integer 'son nom PremièreZone As Long 'la première zone dans la liste des zones NbZones As Byte 'le nombre de zones (en général 1) Intérieur As Long 'la couleur du territoire Frontière As Long 'la couleur de la frontière Style As Byte 'le style de remplissage et de frontière Premier_Roi As Long 'le numéro du premier roi dans la liste des rois Nombre_Roi As Byte 'le nombre de rois suivants dans cette liste Date_Début As Integer 'la date du début de la période considérée Date_Fin As Integer 'la date de la fin de cette même période Centre As PointPlan 'le point de la carte à partir duquel on affiche les infos '(nom du territoire et roi régnant). Région As Byte 'Nom de la super-région correspondant. Une super région est 'un ensemble de territoires ayant des points communs culturels. 'C'est la super-région que l'on retrouve dans le WB. AfficheInfo As Byte 'la valeur à partir de laquelle les infos s'affichent
End Type
Public Type tPays Données As tDonnées 'les trois champs suivants ne servent que pour la lecture du tableau Pays du programme IndexRoi As Long IndexRgn As Long Valide As Boolean End Type
Lorsque j'écris le tableau avec la procédure suivante :
Private Sub CmdBtnEntrerLesPays_Click() Dim Feuille As String, REGION As String, Ligne As Integer, Pays As tPays, ENR As Long If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) >> vbYes Then Feuille = "Pays" REGION = "$A:$P" Ligne = 3 ENR = 1 Open CHEMIN & "PAYS.DAT" For Binary As #1 With Worksheets(Feuille).Range(REGION) While .Cells(Ligne, 3) <> "" Pays.Données.Nom = CInt(.Cells(Ligne, 3)) Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4)) Pays.Données.NbZones = CByte(.Cells(Ligne, 5)) Pays.Données.Intérieur = CLng(.Cells(Ligne, 6)) Pays.Données.Frontière = CLng(.Cells(Ligne, 7)) Pays.Données.Style = CByte(.Cells(Ligne, 8)) Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9)) Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10)) Pays.Données.Date_Début = CInt(.Cells(Ligne, 11)) Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12)) Pays.Données.Centre.X = CSng(.Cells(Ligne, 13)) Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14)) Pays.Données.Région = CByte(.Cells(Ligne, 15)) Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16)) Pays.IndexRgn = CLng(0) Pays.IndexRoi = CLng(0) Pays.Valide = True Put #1, ENR, Pays ENR = ENR + 1 Ligne = Ligne + 1 Wend End With Close End If End Sub
Avec comme première ligne de valeurs 0,58,1 ...
Et que je la relis avec cette procédure,
Private Sub CmdBtnModifierLesCentres_Click() Dim Feuille As String, REGION As String, Ligne As Integer, Pays As tPays, col As Integer, rep As Integer Dim I As Integer, L As Long, B As Byte, S As Single, BO As Boolean, ENR As Long Feuille = "Pays" REGION = "$A:$P" Ligne = 3 ENR = 1 Close Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays) With Worksheets(Feuille).Range(REGION) While Not EOF(1) 'Get #1, , I 'Close 'Exit Sub Get #1, ENR, Pays If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then rep = MsgBox("erreur sur le nom, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then rep = MsgBox("erreur sur la première zone, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then rep = MsgBox("erreur sur le nombre de zone, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then rep = MsgBox("erreur sur l'intérieur, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then rep = MsgBox("erreur sur la frontière, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then rep = MsgBox("erreur sur le style, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then rep = MsgBox("erreur sur le premier roi, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then rep = MsgBox("erreur sur le nombre de rois, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then rep = MsgBox("erreur sur le début, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then rep = MsgBox("erreur sur la fin, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then rep = MsgBox("erreur sur l'abscisse du centre, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then rep = MsgBox("erreur sur l'ordonnée du centre, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then rep = MsgBox("erreur sur la région, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16)) Then rep = MsgBox("erreur sur l'affichage, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If
'If Pays.Données.Nom = .Cells(Ligne, 3) Then ' .Cells(Ligne, 13) = Pays.Données.Centre.X ' .Cells(Ligne, 14) = Pays.Données.Centre.Y ' .Cells(Ligne, 16) = Pays.Données.AfficheInfo 'End If Ligne = Ligne + 1 ENR = ENR + 1 Wend End With Close
End Sub
Mon premier enregistrement commence par 18176 au lieu de 0 Je tourne là dessus depuis plusieurs jours et rien n'y fait. Help me !!!!
Bonjour, Par curiosité j'ai testé ta macro pour confirmer ce que je pensais à propos du mode d'adressage du get et du put en mode binaire. Elle fonctionne très bien avec les modifs suivantes :
Soit : Put #1,,Pays Get #1,,Pays
Soit, si tu veux faire de l'accès aléatoire Put #1, ENR, Pays Get #1, ENR, Pays avec dans ce cas ENR = ENR + Len(Pays) '45 : la taille du type ou ENR = Len(Pays) * (numPays-1) + 1
Un autre détail : while lof(1)<>loc(1) cela évite de lire un enregistrement de trop.
Pour ce qui est de résoudre le même problème avec des random, je n'ai jamais essayé avec autre chose que du texte (pas de valeurs binaire).
-- Fred
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être
puisque j'écris et je lis en séquentiel.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est
lu et écris.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel
un des champs est lui-même un type utilisateur, ça doit faire des n½uds.
Je tiens le groupe au courant de mes découvertes dans ce domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
"Fred" <foleide@libre.france> a écrit dans le message de news:
ek$DYZzcFHA.3040@TK2MSFTNGP14.phx.gbl...
Dans le message:%23E7n1$pcFHA.2760@tk2msftngp13.phx.gbl,
Patrice Henrio écrit:
J'ai créé un type utilisateur dont voici le descriptif
Public Type PointPlan
X As Single
Y As Single
End Type
Public Type tDonnées
Nom As Integer 'son nom
PremièreZone As Long 'la première zone dans la liste des zones
NbZones As Byte 'le nombre de zones (en général 1)
Intérieur As Long 'la couleur du territoire
Frontière As Long 'la couleur de la frontière
Style As Byte 'le style de remplissage et de frontière
Premier_Roi As Long 'le numéro du premier roi dans la liste
des rois Nombre_Roi As Byte 'le nombre de rois suivants dans
cette liste Date_Début As Integer 'la date du début de la
période considérée Date_Fin As Integer 'la date de la fin de
cette même période Centre As PointPlan 'le point de la carte à
partir duquel on
affiche les infos
'(nom du territoire et roi régnant).
Région As Byte 'Nom de la super-région correspondant. Une
super région est
'un ensemble de territoires ayant des
points communs culturels.
'C'est la super-région que l'on retrouve
dans le WB.
AfficheInfo As Byte 'la valeur à partir de laquelle les infos
s'affichent
End Type
Public Type tPays
Données As tDonnées
'les trois champs suivants ne servent que pour la lecture du tableau
Pays du programme
IndexRoi As Long
IndexRgn As Long
Valide As Boolean
End Type
Lorsque j'écris le tableau avec la procédure suivante :
Private Sub CmdBtnEntrerLesPays_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, ENR As Long
If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) >> vbYes Then
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Open CHEMIN & "PAYS.DAT" For Binary As #1
With Worksheets(Feuille).Range(REGION)
While .Cells(Ligne, 3) <> ""
Pays.Données.Nom = CInt(.Cells(Ligne, 3))
Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4))
Pays.Données.NbZones = CByte(.Cells(Ligne, 5))
Pays.Données.Intérieur = CLng(.Cells(Ligne, 6))
Pays.Données.Frontière = CLng(.Cells(Ligne, 7))
Pays.Données.Style = CByte(.Cells(Ligne, 8))
Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9))
Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10))
Pays.Données.Date_Début = CInt(.Cells(Ligne, 11))
Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12))
Pays.Données.Centre.X = CSng(.Cells(Ligne, 13))
Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14))
Pays.Données.Région = CByte(.Cells(Ligne, 15))
Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16))
Pays.IndexRgn = CLng(0)
Pays.IndexRoi = CLng(0)
Pays.Valide = True
Put #1, ENR, Pays
ENR = ENR + 1
Ligne = Ligne + 1
Wend
End With
Close
End If
End Sub
Avec comme première ligne de valeurs 0,58,1 ...
Et que je la relis avec cette procédure,
Private Sub CmdBtnModifierLesCentres_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, col As Integer, rep As Integer
Dim I As Integer, L As Long, B As Byte, S As Single, BO As
Boolean, ENR As Long
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Close
Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays)
With Worksheets(Feuille).Range(REGION)
While Not EOF(1)
'Get #1, , I
'Close
'Exit Sub
Get #1, ENR, Pays
If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then
rep = MsgBox("erreur sur le nom, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then
rep = MsgBox("erreur sur la première zone, ligne "
& Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then
rep = MsgBox("erreur sur le nombre de zone, ligne
" & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then
rep = MsgBox("erreur sur l'intérieur, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then
rep = MsgBox("erreur sur la frontière, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then
rep = MsgBox("erreur sur le style, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then
rep = MsgBox("erreur sur le premier roi, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then
rep = MsgBox("erreur sur le nombre de rois, ligne
" & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then
rep = MsgBox("erreur sur le début, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then
rep = MsgBox("erreur sur la fin, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then
rep = MsgBox("erreur sur l'abscisse du centre,
ligne " & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then
rep = MsgBox("erreur sur l'ordonnée du centre,
ligne " & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then
rep = MsgBox("erreur sur la région, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16))
Then rep = MsgBox("erreur sur l'affichage, ligne "
& Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
'If Pays.Données.Nom = .Cells(Ligne, 3) Then
' .Cells(Ligne, 13) = Pays.Données.Centre.X
' .Cells(Ligne, 14) = Pays.Données.Centre.Y
' .Cells(Ligne, 16) = Pays.Données.AfficheInfo
'End If
Ligne = Ligne + 1
ENR = ENR + 1
Wend
End With
Close
End Sub
Mon premier enregistrement commence par 18176 au lieu de 0
Je tourne là dessus depuis plusieurs jours et rien n'y fait.
Help me !!!!
Bonjour,
Par curiosité j'ai testé ta macro pour confirmer ce que je pensais à
propos du mode d'adressage du get et du put en mode binaire.
Elle fonctionne très bien avec les modifs suivantes :
Soit :
Put #1,,Pays
Get #1,,Pays
Soit, si tu veux faire de l'accès aléatoire
Put #1, ENR, Pays
Get #1, ENR, Pays
avec dans ce cas
ENR = ENR + Len(Pays) '45 : la taille du type
ou
ENR = Len(Pays) * (numPays-1) + 1
Un autre détail :
while lof(1)<>loc(1)
cela évite de lire un enregistrement de trop.
Pour ce qui est de résoudre le même problème avec des random, je n'ai
jamais essayé avec autre chose que du texte (pas de valeurs binaire).
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
"Fred" a écrit dans le message de news: ek$
Dans le message:%23E7n1$, Patrice Henrio écrit:
J'ai créé un type utilisateur dont voici le descriptif
Public Type PointPlan X As Single Y As Single End Type
Public Type tDonnées Nom As Integer 'son nom PremièreZone As Long 'la première zone dans la liste des zones NbZones As Byte 'le nombre de zones (en général 1) Intérieur As Long 'la couleur du territoire Frontière As Long 'la couleur de la frontière Style As Byte 'le style de remplissage et de frontière Premier_Roi As Long 'le numéro du premier roi dans la liste des rois Nombre_Roi As Byte 'le nombre de rois suivants dans cette liste Date_Début As Integer 'la date du début de la période considérée Date_Fin As Integer 'la date de la fin de cette même période Centre As PointPlan 'le point de la carte à partir duquel on affiche les infos '(nom du territoire et roi régnant). Région As Byte 'Nom de la super-région correspondant. Une super région est 'un ensemble de territoires ayant des points communs culturels. 'C'est la super-région que l'on retrouve dans le WB. AfficheInfo As Byte 'la valeur à partir de laquelle les infos s'affichent
End Type
Public Type tPays Données As tDonnées 'les trois champs suivants ne servent que pour la lecture du tableau Pays du programme IndexRoi As Long IndexRgn As Long Valide As Boolean End Type
Lorsque j'écris le tableau avec la procédure suivante :
Private Sub CmdBtnEntrerLesPays_Click() Dim Feuille As String, REGION As String, Ligne As Integer, Pays As tPays, ENR As Long If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) >> vbYes Then Feuille = "Pays" REGION = "$A:$P" Ligne = 3 ENR = 1 Open CHEMIN & "PAYS.DAT" For Binary As #1 With Worksheets(Feuille).Range(REGION) While .Cells(Ligne, 3) <> "" Pays.Données.Nom = CInt(.Cells(Ligne, 3)) Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4)) Pays.Données.NbZones = CByte(.Cells(Ligne, 5)) Pays.Données.Intérieur = CLng(.Cells(Ligne, 6)) Pays.Données.Frontière = CLng(.Cells(Ligne, 7)) Pays.Données.Style = CByte(.Cells(Ligne, 8)) Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9)) Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10)) Pays.Données.Date_Début = CInt(.Cells(Ligne, 11)) Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12)) Pays.Données.Centre.X = CSng(.Cells(Ligne, 13)) Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14)) Pays.Données.Région = CByte(.Cells(Ligne, 15)) Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16)) Pays.IndexRgn = CLng(0) Pays.IndexRoi = CLng(0) Pays.Valide = True Put #1, ENR, Pays ENR = ENR + 1 Ligne = Ligne + 1 Wend End With Close End If End Sub
Avec comme première ligne de valeurs 0,58,1 ...
Et que je la relis avec cette procédure,
Private Sub CmdBtnModifierLesCentres_Click() Dim Feuille As String, REGION As String, Ligne As Integer, Pays As tPays, col As Integer, rep As Integer Dim I As Integer, L As Long, B As Byte, S As Single, BO As Boolean, ENR As Long Feuille = "Pays" REGION = "$A:$P" Ligne = 3 ENR = 1 Close Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays) With Worksheets(Feuille).Range(REGION) While Not EOF(1) 'Get #1, , I 'Close 'Exit Sub Get #1, ENR, Pays If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then rep = MsgBox("erreur sur le nom, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then rep = MsgBox("erreur sur la première zone, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then rep = MsgBox("erreur sur le nombre de zone, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then rep = MsgBox("erreur sur l'intérieur, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then rep = MsgBox("erreur sur la frontière, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then rep = MsgBox("erreur sur le style, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then rep = MsgBox("erreur sur le premier roi, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then rep = MsgBox("erreur sur le nombre de rois, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then rep = MsgBox("erreur sur le début, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then rep = MsgBox("erreur sur la fin, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then rep = MsgBox("erreur sur l'abscisse du centre, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then rep = MsgBox("erreur sur l'ordonnée du centre, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then rep = MsgBox("erreur sur la région, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16)) Then rep = MsgBox("erreur sur l'affichage, ligne " & Ligne, vbOKCancel) If rep = vbCancel Then Close Exit Sub End If End If
'If Pays.Données.Nom = .Cells(Ligne, 3) Then ' .Cells(Ligne, 13) = Pays.Données.Centre.X ' .Cells(Ligne, 14) = Pays.Données.Centre.Y ' .Cells(Ligne, 16) = Pays.Données.AfficheInfo 'End If Ligne = Ligne + 1 ENR = ENR + 1 Wend End With Close
End Sub
Mon premier enregistrement commence par 18176 au lieu de 0 Je tourne là dessus depuis plusieurs jours et rien n'y fait. Help me !!!!
Bonjour, Par curiosité j'ai testé ta macro pour confirmer ce que je pensais à propos du mode d'adressage du get et du put en mode binaire. Elle fonctionne très bien avec les modifs suivantes :
Soit : Put #1,,Pays Get #1,,Pays
Soit, si tu veux faire de l'accès aléatoire Put #1, ENR, Pays Get #1, ENR, Pays avec dans ce cas ENR = ENR + Len(Pays) '45 : la taille du type ou ENR = Len(Pays) * (numPays-1) + 1
Un autre détail : while lof(1)<>loc(1) cela évite de lire un enregistrement de trop.
Pour ce qui est de résoudre le même problème avec des random, je n'ai jamais essayé avec autre chose que du texte (pas de valeurs binaire).
-- Fred
Patrice Henrio
Peux-tu détailler le problème avec adressof(montableau(0))
En effet en VB j'utilisais justement des types utilisateurs et des tableaux pour les lire en une fois dans un fichier
Ainsi j'utilise sans problème les deux fonctions suivantes
Public Function TableauDePoints(ByVal Nom As String) As tPointPlan() 'lit un tableau du type utilisateur tPointPlan Dim P As tPointPlan, T() As tPointPlan Open Chemin & Nom & ".PTS" For Binary As #1 ReDim T(1 To LOF(1) / Len(P)) Get 1, , T Close #1 TableauDePoints = T Erase T End Function
Public Function TableauDeLong(ByVal Nom As String) As Long() 'lit un tableau de Long Dim P As Long, T() As Long Open Chemin + Nom + ".NBP" For Binary As #1 ReDim T(1 To LOF(1) / Len(P)) Get 1, , T Close #1 TableauDeLong = T Erase T End Function
"pas-de-spam>Wanadoo.fr Wanadoo.fr >" <"pas-de-spam> a écrit dans le message de news: 42b2e913$0$11716$
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" a écrit dans le message de news:
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio" wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la structure, et que cette taille est ici toujours supérieure à la taille de l'enregistrement écrit par Put en mode Random. Pour une structure (donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets) suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays) + 2
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
A+
Christophe
Peux-tu détailler le problème avec adressof(montableau(0))
En effet en VB j'utilisais justement des types utilisateurs et des tableaux
pour les lire en une fois dans un fichier
Ainsi j'utilise sans problème les deux fonctions suivantes
Public Function TableauDePoints(ByVal Nom As String) As tPointPlan()
'lit un tableau du type utilisateur tPointPlan
Dim P As tPointPlan, T() As tPointPlan
Open Chemin & Nom & ".PTS" For Binary As #1
ReDim T(1 To LOF(1) / Len(P))
Get 1, , T
Close #1
TableauDePoints = T
Erase T
End Function
Public Function TableauDeLong(ByVal Nom As String) As Long()
'lit un tableau de Long
Dim P As Long, T() As Long
Open Chemin + Nom + ".NBP" For Binary As #1
ReDim T(1 To LOF(1) / Len(P))
Get 1, , T
Close #1
TableauDeLong = T
Erase T
End Function
"pas-de-spam>Wanadoo.fr Wanadoo.fr >" <"pas-de-spam> a écrit dans le message
de news: 42b2e913$0$11716$8fcfb975@news.wanadoo.fr...
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" <parci@invalid.fr> a écrit dans le message de news:
7bp3b11hu3jlo72sqgddrv969d4iu3alfk@4ax.com...
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la
structure, et que cette taille est ici toujours supérieure à la taille
de l'enregistrement écrit par Put en mode Random. Pour une structure
(donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets)
suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays)
+ 2
Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).
Peux-tu détailler le problème avec adressof(montableau(0))
En effet en VB j'utilisais justement des types utilisateurs et des tableaux pour les lire en une fois dans un fichier
Ainsi j'utilise sans problème les deux fonctions suivantes
Public Function TableauDePoints(ByVal Nom As String) As tPointPlan() 'lit un tableau du type utilisateur tPointPlan Dim P As tPointPlan, T() As tPointPlan Open Chemin & Nom & ".PTS" For Binary As #1 ReDim T(1 To LOF(1) / Len(P)) Get 1, , T Close #1 TableauDePoints = T Erase T End Function
Public Function TableauDeLong(ByVal Nom As String) As Long() 'lit un tableau de Long Dim P As Long, T() As Long Open Chemin + Nom + ".NBP" For Binary As #1 ReDim T(1 To LOF(1) / Len(P)) Get 1, , T Close #1 TableauDeLong = T Erase T End Function
"pas-de-spam>Wanadoo.fr Wanadoo.fr >" <"pas-de-spam> a écrit dans le message de news: 42b2e913$0$11716$
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.
Il faut que je potasse tout ça.
"parci" a écrit dans le message de news:
On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio" wrote:
Je ne comprends pas pourquoi mais ton idée marche.
En fait, ça marche parce que LenB retourne la taille en mémoire de la structure, et que cette taille est ici toujours supérieure à la taille de l'enregistrement écrit par Put en mode Random. Pour une structure (donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets) suivis des données (suivant leurs tailles réelles).
Donc, tu peux plutôt écrire :
Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>>Len(Pays) + 2
Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays) + 2
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
A+
Christophe
Fred
Dans son message Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Dans son message OfPSRa1cFHA.1456@TK2MSFTNGP15.phx.gbl
Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du
premier octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids
fort du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de
45 ? C'est un premier indice pour se rendre compte du problème. A
priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu
de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par
pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Patrice Henrio
Tout juste Sherlock En effet mon deuxième enregistrement commence 71 Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" a écrit dans le message de news:
Dans son message Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Tout juste Sherlock
En effet mon deuxième enregistrement commence 71
Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" <foleide@libre.france> a écrit dans le message de news:
OWYMPr1cFHA.3712@TK2MSFTNGP09.phx.gbl...
Dans son message OfPSRa1cFHA.1456@TK2MSFTNGP15.phx.gbl
Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier
octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort
du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de 45
? C'est un premier indice pour se rendre compte du problème. A priori, il
doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le
nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas
de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
Tout juste Sherlock En effet mon deuxième enregistrement commence 71 Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" a écrit dans le message de news:
Dans son message Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Patrice Henrio
Grâce à vos remarques judicieuses aux uns et aux autres, j'ai pu régler mon problème et tout roule maintenant. De plus j'ai appris des choses sur Binary et Random, len et lenB.
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Open Chemin & "P.DAT" For Binary As #1 Put #1, , Pays Close
Open Chemin & "P.DAT" For Binary As #1 NbPays = LOF(1) / Len(P) ReDim Pays(1 To NbPays) Get #1, , Pays Close
A quels problèmes inconnus à ce jour vais-je être confrontés.
"Patrice Henrio" a écrit dans le message de news: %
Tout juste Sherlock En effet mon deuxième enregistrement commence 71 Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" a écrit dans le message de news:
Dans son message Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Grâce à vos remarques judicieuses aux uns et aux autres, j'ai pu régler mon
problème et tout roule maintenant.
De plus j'ai appris des choses sur Binary et Random, len et lenB.
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en
une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau
d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Open Chemin & "P.DAT" For Binary As #1
Put #1, , Pays
Close
Open Chemin & "P.DAT" For Binary As #1
NbPays = LOF(1) / Len(P)
ReDim Pays(1 To NbPays)
Get #1, , Pays
Close
A quels problèmes inconnus à ce jour vais-je être confrontés.
"Patrice Henrio" <patrice.henrio@laposte.net> a écrit dans le message de
news: %23B8zgb2cFHA.2588@TK2MSFTNGP15.phx.gbl...
Tout juste Sherlock
En effet mon deuxième enregistrement commence 71
Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" <foleide@libre.france> a écrit dans le message de news:
OWYMPr1cFHA.3712@TK2MSFTNGP09.phx.gbl...
Dans son message OfPSRa1cFHA.1456@TK2MSFTNGP15.phx.gbl
Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du
premier octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort
du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de 45
? C'est un premier indice pour se rendre compte du problème. A priori, il
doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le
nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas
de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.
Grâce à vos remarques judicieuses aux uns et aux autres, j'ai pu régler mon problème et tout roule maintenant. De plus j'ai appris des choses sur Binary et Random, len et lenB.
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Open Chemin & "P.DAT" For Binary As #1 Put #1, , Pays Close
Open Chemin & "P.DAT" For Binary As #1 NbPays = LOF(1) / Len(P) ReDim Pays(1 To NbPays) Get #1, , Pays Close
A quels problèmes inconnus à ce jour vais-je être confrontés.
"Patrice Henrio" a écrit dans le message de news: %
Tout juste Sherlock En effet mon deuxième enregistrement commence 71 Bravo pour la déduction qui démontre la maîtrise du sujet.
En tout cas merci.
Je continue mes investigations.
"Fred" a écrit dans le message de news:
Dans son message Patrice Henrio nous dit :
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être puisque j'écris et je lis en séquentiel.
Oui, ta seconde écriture écrase toute la première à l'exception du premier octet. Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort du premier. Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton premier jeu de test) Et je suppose que ton fichier résultant n'a pas une taille multiple de 45 ? C'est un premier indice pour se rendre compte du problème. A priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le nombre de lignes écrites.
Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas de 45.
J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est lu et écris.
Un petit éditeur hexadécimal est très bien pour cela.
En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le passage à VB pur a échoué.
Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel un des champs est lui-même un type utilisateur, ça doit faire des n½uds. Je tiens le groupe au courant de mes découvertes dans ce domaine. En tout cas merci à tous ceux qui se sont penchés sur la question.
-- Fred
Fred
Dans son message Patrice Henrio nous dit :
[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou par blocs. La différence est très significative sur de gros fichiers.
-- Fred
Dans son message eo3C7l2cFHA.220@TK2MSFTNGP12.phx.gbl
Patrice Henrio nous dit :
[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un
tableau en une fois au lieu d'une boucle, j'ai l'impression que la
lecture du tableau d'un coup est plus rapide, c'est ce que je fais
dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou
par blocs.
La différence est très significative sur de gros fichiers.
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou par blocs. La différence est très significative sur de gros fichiers.
-- Fred
Patrice Henrio
Bien reçu merci
"Fred" a écrit dans le message de news:
Dans son message Patrice Henrio nous dit :
[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou par blocs. La différence est très significative sur de gros fichiers.
-- Fred
Bien reçu
merci
"Fred" <foleide@libre.france> a écrit dans le message de news:
e0DJig3cFHA.3032@TK2MSFTNGP10.phx.gbl...
Dans son message eo3C7l2cFHA.220@TK2MSFTNGP12.phx.gbl
Patrice Henrio nous dit :
[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un
tableau en une fois au lieu d'une boucle, j'ai l'impression que la
lecture du tableau d'un coup est plus rapide, c'est ce que je fais
dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou
par blocs.
La différence est très significative sur de gros fichiers.
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante
Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou par blocs. La différence est très significative sur de gros fichiers.
-- Fred
parci
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr" <"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
VarPtr(montableau(0)).
Mais est-ce utile ici, je ne pense pas.
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr"
<"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr" <"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
VarPtr(montableau(0)).
Mais est-ce utile ici, je ne pense pas.
pas-de-spam>Wanadoo.fr
parci a écrit :
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr" <"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
VarPtr(montableau(0)).
Mais est-ce utile ici, je ne pense pas.
Oui VarPtr,
Non ici c'est pas utile mais c'était juste pour souligner que ce problème de représentation en mèmoire d'une variable et de son contenu est plus fréquent qu'il n'y parait.
Christophe
parci a écrit :
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr"
<"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).
VarPtr(montableau(0)).
Mais est-ce utile ici, je ne pense pas.
Oui VarPtr,
Non ici c'est pas utile mais c'était juste pour souligner que ce
problème de représentation en mèmoire d'une variable et de son contenu
est plus fréquent qu'il n'y parait.
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr" <"pas-de-spam>Wanadoo.fr"> wrote:
Bonjour, Si je puis me permettre: C'est la même chose pour les tableaux, si on veut l'adresse du premier element il faut utiliser Adressof(montableau(0)).
VarPtr(montableau(0)).
Mais est-ce utile ici, je ne pense pas.
Oui VarPtr,
Non ici c'est pas utile mais c'était juste pour souligner que ce problème de représentation en mèmoire d'une variable et de son contenu est plus fréquent qu'il n'y parait.