Public Type maison propriétaire As String numero As Long End Type Public Type pièces nom As String superficie As Long num_maison As Long End Type Public bd_maisons(50) As maison Public bd_pièces(50) As pièces Public Sub Enregistrer_bd(ByRef bd) Open "D:\test.txt" For Binary As #1 For i = 0 To UBound(bd) Put #1, , bd(i) Next i Close #1 End Sub
Private Sub CommandButton1_Click() bd_maisons(0).numero = 1234 bd_maisons(0).propriétaire = "toto" Call Enregistrer_bd(bd_maisons) End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionj'ai un grand nombre de tableaux avec des types personnalisés différents.
en outre : bd(i) ===>> Gné (alors ? structure ou pas structure ?) !!!
Comment espères-tu que l'instruction Put fonctionne en lui fournissant une structure ?
Donc, impossible de vouloir stocker une chaine dont la longueur est variable dans un accès séquentiel d'un fichier. Dans ton cas, Open de type Binary, il faudra éventuellement terminer ta chaine avec un Chr$(0)
Même sans tableau (une structure isolée), cela ne marcherait pas car sa procédure (à laquelle il passe l'argument bd) ignorerait totalement le type de cette variable (un simple msgbox typename(bd) lui aurait permis de découvrir cet aspect).
TypeName(varname)
L'argument varname est une valeur de type Variant pouvant contenir toute variable à l'exception d'une variable de type défini par l'utilisateur.
Je n'ai du coup même plus jugé utile de parler de ton point 3 et de lui dire qu'il convenait de toutes manières de donner une longueur à ses champs string
En jouant avec les composants de VBAProject pour ajouter dynamiquement du code dans une procédure, puis l'exécuter.
Longueur d'enregistrement incorrecte (erreur 59)
Voir aussi Particularités
La longueur d'une variable d'enregistrement dans une instruction Get ou Put doit être celle spécifiée dans son instruction Open correspondante. Causes et solutions de cette erreur :
La longueur de la variable d'enregistrement diffère de la longueur spécifiée dans l'instruction Open correspondante.
Vérifiez que la somme des tailles des variables de longueur fixe dans le type défini par l'utilisateur définissant le type de la variable de l'enregistrement a la valeur indiquée dans la clause Len de l'instruction Open. Dans l'exemple suivant, supposons que RecVar est une variable du type approprié. Vous pouvez utiliser la fonction Len pour spécifier la longueur, de la façon suivante :
Open MyFile As #1 Len = Len(RecVar)
La variable dans une instruction Put est (ou inclut) une chaîne de longueur variable.
Le descripteur à 2 octets étant toujours ajouté à une chaîne de longueur variable placée dans un fichier à accès aléatoire avec Put, la chaîne de longueur variable doit être plus courte d'au moins 2 caractères que la longueur d'enregistrement spécifiée dans la clause Len de l'instruction Open.
La variable dans une instruction Put est (ou inclut) une variable de type Variant.
Comme les chaînes de longueur variable, les types de données Variant requièrent un descripteur à 2 octets. Les variables de type Variant contenant des chaînes de longueur variable requièrent un descripteur à 4 octets. Par conséquent, pour les chaînes de longueur variable dans une variable de type Variant, la chaîne doit être plus courte d'au moins 4 octets que la longueur d'enregistrement spécifiée dans la clause Len.
Pour plus d'informations, sélectionnez l'élément en question et appuyez sur F1 (sous Windows) ou AIDE (sur Macintosh).
Private Type toto el1 As Integer el2 As String el3 As Variant End Type Private Type voila el1 As Integer el2 As String End Type Private Sub Commandbutton1_Click() Dim usons_toto As toto, usons_voila As voila usons_toto.el1 = 3 usons_toto.el2 = "coucou" usons_toto.el3 = 5 usons_voila.el1 = 3 usons_voila.el2 = "bonjour" 'et maintenant assignons une variable autre à usons_toto et voyons Dim autre As toto autre = usons_toto MsgBox autre.el2 ' on voit bien que pas de problème ' mais dès lors : impossible de donner à la variable autre une autre affectation 'la ligne qui suit provoquera une erreur, si on la décommente : ' Dim autre As voila 'Or, c'est bien ce qu'il faudrait pouvoir faire, si l'on veut passer, par exemple, à une procédure ' Je ne suis pas allé plus loin (pas voulu, compte tenu de certaines "circonstances") ' que ceux qui le veulent cherchent donc à supprimer de la mémoire la variable autre avant de la redéclarer ' c'est peut-être le bon chemin. End Sub
public bd_maisons() as maison public bd_pièces() as pièce public function enregistrer_db(nom_db as string, fichier as string, nb_éléments as long) open fichier for binary as #1 for i = 0 to nb_éléments if nom_bd="bd_maisons" then put #1,,bd_maisons(i) if nom_bd="bd_pièces" then put #1,,bd_pièces(i) next i close #1 end function