OVH Cloud OVH Cloud

Problème de lecture - écriture en vbA

20 réponses
Avatar
Patrice Henrio
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 !!!!

10 réponses

1 2
Avatar
Fred
Dans son message %23E7n1$
Patrice Henrio nous dit :

[...]
Help me !!!!



Bonsoir,
Avec le PUT et le GET en mode binaire, l'adressage n'est-il pas en
octets ?
(Et d'ailleurs inutile si les écritures et lectures sont séquentielles)


--
Fred
Avatar
parci
On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
wrote:

2 corrections et ça devrait aller :

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



Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len LenB(Pays)

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)



Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = LenB(Pays)
Avatar
Patrice Henrio
non le put et le get correspondent au type de données écrites et lues.
J'ai bien entendu testé avec du "random" et "len" mais ça ne marche pas
mieux.
C'est d'ailleurs à la suite d'une erreur "mauvaise longueur
d'enregistrement" que j'ai testé en binary.
De plus les erreurs sont aléatoires, une fois ça passe, une fois ça ne passe
pas. Comme si l'écriture ne se faisait pas comme la lecture.
Quelqu'un a-t'il déjà eu ce genre de problème.



"Fred" a écrit dans le message de news:

Dans son message %23E7n1$
Patrice Henrio nous dit :

[...]
Help me !!!!



Bonsoir,
Avec le PUT et le GET en mode binaire, l'adressage n'est-il pas en octets
?
(Et d'ailleurs inutile si les écritures et lectures sont séquentielles)


--
Fred




Avatar
Patrice Henrio
intéressant
quelle est la différence entre lenB et len ?

En tout cas je vais tester cela très vite.


"parci" a écrit dans le message de news:

On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
wrote:

2 corrections et ça devrait aller :

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



Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len > LenB(Pays)

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)



Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = LenB(Pays)



Avatar
Patrice Henrio
répondu trop vite

len et lenB pour une variable ne change rien. LenB ne s'utilise que pour
connaître le nombre d'octets utilisés par une chaîne puisque len renvoie la
longueur de la chaîne c'est à dire son nombre de caractères.
Il faut voir maintenant si access write et access read ont réellement un
impact sur ce qui est écrit ou lu.
J'avais l'impression qu'ils étaient surtout utilisés pour ne pas mélanger
écriture et lecture.
J'ai déjà testé avec l'ouverture en random et len sans succès.
J'ai le message "erreur de longueur de l'enregistrement" d'une manière
aléatoire et je ne sais pas pourquoi.


"parci" a écrit dans le message de news:

On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
wrote:

2 corrections et ça devrait aller :

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



Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len > LenB(Pays)

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)



Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = LenB(Pays)



Avatar
Patrice Henrio
Je ne comprends pas pourquoi mais ton idée marche.

Je suis allé un peu vite pour len et lenB

D'après la MSDN, lenB pour une variable renvoie la taille mémoire d'une
variable alors que len renvoie la taille qui sera utilisée dans un fichier.
je vois bien la différence sur certains cas mais je ne comprends pas
pourquoi dans mon cas ça plante car je n'ai pas un type avec des champs
conditionnels. peut-être le fait que dans certains cas certaines valeurs de
champs étaient indéfinies ?
Mystère ....
"parci" a écrit dans le message de news:

On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
wrote:

2 corrections et ça devrait aller :

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



Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len > LenB(Pays)

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)



Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = LenB(Pays)



Avatar
Fred
Dans son message %
Patrice Henrio nous dit :

"Fred" a écrit dans le message de news:

Dans son message %23E7n1$
Patrice Henrio nous dit :

[...]
Help me !!!!



Bonsoir,
Avec le PUT et le GET en mode binaire, l'adressage n'est-il pas en
octets ?
(Et d'ailleurs inutile si les écritures et lectures sont
séquentielles)


non le put et le get correspondent au type de données écrites et lues.
J'ai bien entendu testé avec du "random" et "len" mais ça ne marche
pas mieux.
C'est d'ailleurs à la suite d'une erreur "mauvaise longueur
d'enregistrement" que j'ai testé en binary.
De plus les erreurs sont aléatoires, une fois ça passe, une fois ça
ne passe pas. Comme si l'écriture ne se faisait pas comme la lecture.
Quelqu'un a-t'il déjà eu ce genre de problème.




Tu es sûr de ton coup ? Je n'ai pas de vb sous la main pour vérifier
mais dans l'aide vba, il est bien précisé que l'adressage est en octets
lorsque le fichier est ouvert FOR BINARY.


--
Fred
Avatar
parci
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
Avatar
Patrice Henrio
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



Avatar
Fred
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
1 2