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 !!!!
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
Dans son message %23E7n1$pcFHA.2760@tk2msftngp13.phx.gbl
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)
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
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)
On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> 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)
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)
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
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" <foleide@libre.france> a écrit dans le message de news:
ed0N4xqcFHA.3940@TK2MSFTNGP10.phx.gbl...
Dans son message %23E7n1$pcFHA.2760@tk2msftngp13.phx.gbl
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.
"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
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)
intéressant
quelle est la différence entre lenB et len ?
En tout cas je vais tester cela très vite.
"parci" <parci@invalid.fr> a écrit dans le message de news:
o0m3b1pr80pn3iabl67s7kl10pqk1imd4p@4ax.com...
On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> 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)
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)
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)
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" <parci@invalid.fr> a écrit dans le message de news:
o0m3b1pr80pn3iabl67s7kl10pqk1imd4p@4ax.com...
On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> 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)
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)
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)
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" <parci@invalid.fr> a écrit dans le message de news:
o0m3b1pr80pn3iabl67s7kl10pqk1imd4p@4ax.com...
On Thu, 16 Jun 2005 20:21:20 +0200, "Patrice Henrio"
<patrice.henrio@laposte.net> 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)
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)
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
Dans son message %23azt11qcFHA.1456@TK2MSFTNGP15.phx.gbl
Patrice Henrio nous dit :
"Fred" <foleide@libre.france> a écrit dans le message de news:
ed0N4xqcFHA.3940@TK2MSFTNGP10.phx.gbl...
Dans son message %23E7n1$pcFHA.2760@tk2msftngp13.phx.gbl
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.
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
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
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
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
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
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
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
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
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).
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).