Fichier binaire en VBA
Salut à tous amis Exceliens
Bon après des heures et des heures de travaux en VBA je pensais être incollable mais en fait pas encore :p.
Ma petite amie m'a collé un problème que je ne comprends pas vraiment : l'utilisation et le traitement des fichiers binaires.
L'idée est de pouvoir gérer une sorte de base de données sportives (des sportifs, des épreuves, des clubs le tout pour une compétition) sans avoir recours a des tableaux excel ou fichiers CSV.
Les objectifs :
Etre en mesure de rechercher les résultats de la compétition par sportif, par club ou par épreuve.
Etre en mesure de rajouter le résultat d'une épreuve ou modifier le résultat d'une existante.
Par exemple :
En recherchant le sportif Pierre Dupont (via son numéro de licence ou son nom), on nous retourne qu'il a fini 4ème au 100m et 2ème au 200m par exemple.
Ou encore, on peut rechercher pour chaque épreuve le vainqueur etc...
Bref, tout cela semble simple sauf qu'ici interdit d'utiliser les tableaux Excel pour avancer mais uniquement des fichiers binaires qui, selon les cours de ma petite amie, sont des fichiers aux extensions complètement aléatoires choisies par l'utilisateur (.reuihverioh par exemple).
Seulement, ayant l'habitude très cartésienne de bosser sur des choses visibles,j'ai du mal à démarrer le projet (j'ai néanmoins réaliser tous les userform et enchainement pour que cela fonctionne correctement mais impossible d'écrire la moindre ligne...)
Si quelqu'un a une idée sur les procédures pour créer ce genre de fichier le remplir et pouvoir créer un appel dans un userform celà serait super...
Vous remerciant!
Alex
Bonjour,
J'espère que ta copine n'a pas mis d'enjeu trop important à la réalisation demandée !
A première vue, cela tient du gag : je doute que tu puisses me sortir un fichier informatique qui ne soit pas binaire !!!
Ceci dit, les évolutions de langage étant ce qu'elles sont, un glissement de sens est apparu pour différencier 2 grandes catégories de fichiers : "binaires" et "texte", "binaire" étant alors ce qui n'entre pas dans la catégorie "texte".
Relève du "texte" tout fichier dont le contenu est directement lisible avec un éditeur de texte, soit de fichier dont la représentation binaire est le codage de caractères d'écriture dans une langue quelconque (incluant éventuellement quelques caractères associés de style ou mise en forme).
Sont donc binaires, tous les fichiers images, vidéos, musicaux..., sont bien sûr également binaires tous les fichiers d'application, programmes qui ne donnent rien à lire directement, qui font, qui permettent notamment de lire des fichiers dits "binaires" pour restituer leur contenu de la façon qui convient...
Très bien ! Mais cela ne résoud aucun problème : d'une part, les données dont il est question sont des informations qui, dès lors qu'on les restitue visuellement, se traduiront forcément par du texte !
Mais on va dire que le support binaire ne concerne que le stockage des données : bien, mais lorsqu'on stocke les données dans Excel, le résultat est bien un fichier binaire, non directement lisible sans faire appel à l'application qui l'a conçu !
En fait, on te demande de stocker des données ailleurs que dans Excel et de les utiliser sans passer par Excel : un peu difficile avec VBA dont le "A" le manifeste couplé à une application Office ! On peut faire comme si, en utilisant tout de même Excel, mais sans le montrer...
Je me suis endormi dessus, pensant que le problème ne présentait pas vraiment d'intérêt et s'apparentait à un exercice acrobatique gratuit...
Tu peux évidemment envisager de stocker des données sous un format que tu définis toi-même et qui ne seront accessibles que par les procédures programmatiques que tu auras conçues. J'ai quelque doute que VBA suffise pour cela, et en tout état de cause l'utilisation de VBA passe par une application, dont par ailleurs il serait alors dommage de se priver...
Toutefois, sans changer d'avis sur ce point, il m'est apparu qu'une idée intéressante pouvait germer de ce "challenge" un peu farfelu au départ. En effet, les infos que tu veux stocker sont de nature spécifique et il y a peut-être mieux à faire que de monter des tableaux sans fin pour aller ensuite y pêcher les infos à la demande. Elles justifient une analyse un peu plus approfondie qui dégagerait une déclinaison d'"objets" d'information liés et permettrait une définition plus productive et économique des "objets" à stocker, à partir desquels toutes les infos voulues seraient facilement accessibles...
Ce n'est qu'une piste... mais elle vise à rechercher quelque chose de plus efficace et plus léger que l'utilisation courante des bases de données.
Le choix ensuite de les montrer éventuellement sans faire apparaître Excel n'est pas un vrai problème...
Bon courage !
Bonne journée.
Merci à toi pour ta réponse.
Disons que l'idée est effectivement de créer des fichiers, avec une extension inventée, qui ne sont créés uniquement que par le biais d'un programme VBA. L'idée de leur enseignante est justement de réaliser cette base de données sans utiliser les facultés d'Excel de créer des tableaux sans fin (là le problème serait très simple).
L'idée ici est de coder un peu quelque chose de ce type :
Option Explicit
' define structure of a variable-length record
Type Person_VariableLength
numLicence As Integer
nomAthlete As String
prenomAthlete As String
club As String
End Type
' variables for sample data
Private Athlete1 As Person_VariableLength
Private Athlete2 As Person_VariableLength
Private Athlete3 As Person_VariableLength
' record number for use with random (fixed-length) file
Private intRecNum As Integer
Public Sub main()
buildSampleRecords
demonstrateBinary
End Sub
Private Function demonstrateBinary()
' open the file and write the records
Open "C:\Testing\athlete" For Binary As #1
Put #1, , Athlete1
Put #1, , Athlete2
Put #1, , Athlete3
Close #1
' open the file and read the records
Open "C:\Testing\athlete" For Binary As #1
Dim udtPerson As Person_VariableLength
Do While Not EOF(1)
Get #1, , udtPerson
' display selected values
With udtPerson
Debug.Print .club
Debug.Print .nomAthlete
Debug.Print .prenomAthlete
End With
Loop
Close #1
End FunctionMa stratégie était de dire ligne par ligne qu'un athlete avait fait tel epreuve et obtenu tel score afin de pouvoir après rechercher via les userform la solution en réalisant la recherche sur ces fichiers.
La question principale était vraiment d'arriver à concevoir ces fichiers(mais une bonne nuit de travail m'a permis de les réaliser) et ensuite de savoir comment aller puiser l'information.
Exemple :
J'ai un fichier binaire .zozo (oui j'aime bien ce nom :p) dans lequel j’inscris les données suivantes :
Nom : Dupont
Prénom : Paul
Club : AS Saucisse Paté
Épreuve : Javelot
Résultat : 4ème
Performance : 55,52m
... et on va dire une 15aines d'autres enregistrements du même type.
Via un userform, je recherche via son nom (en admettant que y'en a qu'un) ses résultats et je souhaite voir : l'épreuve et le résultat et performance qui s'affiche dans une TextBox de retour.
Voilà l'idée qui n'est pas un gag et dont j'ai mis mon honneur de programmeur VBA en jeu :p
Salut !
intéressant...
Je vais suivre ta progression, mais il me semble que c'est un fichier texte que tu produis...
Bonne soirée.
Bonjour à tous,
Ca me rappelle mes débuts en basic il y a un moment...
Tu as aussi les fichiers à accès aléatoire.
Pas si aléatoire que ça puisque chaque champ ayant une longueur bien définie tu peux atteindre directement l'enregistrement x, champ y. Par exemple : Get FileNum, numEnr, Performance
https://msdn.microsoft.com/en-us/library/aa733671(v=vs.60).aspx
eric
Cher Ferrand et Eric, voici où est ce que j'en suis :
Comme expliqué j'ai toutes les interfaces qui existent. Le soucis maintenant c'est de remplir les recherches par numéro du licencié ou son nom etc...
JE ne vois pas comment remplir ces procédures... Lire un fichier comme çà... Je n'y arrive vraiment pas...
Bonjour,
et bien il faut que tu balaies tout le fichier jusqu'à ce que tu trouves l'enregistrement voulu et que tu le mettes à jour ou le crée ou affiche la donnée voulue.
eric
Tout à fait Eric, là vient mon soucis...
J'ai beau regarder des tutos sur des sites j'ai un peu de mal à comprendre comment pouvoir afficher un enregistrement (par exemple Athlete2).
Pourriez vous m'indiquer un bout de code permettant justement de lire par exemple numéro de Licence 2000 et me retourner l'enregistrement entier dans lequel se situe cette données?
Si je le comprends une fois je pense être en mesure de l'appliquer pour tous les autres onglets.
En tout cas mille merci deja de prendre le temps de me répondre.
Bonjour à tous,
A la lecture de ton besoin initial, il me semble que le format json pourrait répondre en tous points (plutôt que de créer un énième nouveau format de fichier)
Avantages de ce format :
* format standardisé,
* accessible par tout langage,
* largement documenté,
* existence de nombreux codes Vba pour interfacer ce format à excel (cf recherche google avec les mots clefs : json vba excel)
Après, tu peux toujours créer ton json avec une extension quelconque
Pierre
Bizarre que tu bloques là-dessus, tu avais tout dans ton code.
Recherche d'un nom par n° licence (textbox mal nommé dans ton UF) :
Public Sub CommandButton1_Click()
Open "D:\tmp\athlete" For Binary As #1
Dim udtPerson As Athlete, ok As Boolean
Do While Not EOF(1)
Get #1, , udtPerson
'Afficher les valeurs
With udtPerson
If .numLicence = CLng(CodeClub) Then
Debug.Print .nomAthlete
Debug.Print .prenomAthlete
ok = True
' on se limite à la 1ère entrée
Exit Do
End If
End With
Loop
Close #1
If Not ok Then Debug.Print "non trouvé"
End SubSi tu avais utilisé For Random tu pouvais te construire des tables de clés et ne pas être obligé de balayer tout le fichier à chaque fois.
Je vais essayer ce soir Eric. en tout cas merci.
Disons que je n'ai jamais eu l'occasion de traiter avec fichiers autres que ceux qui sont visualisables comme des tableaux excels ou des BDD.
Concernant le type de fichier, selon les consignes, ce type doit être généré sans distinction justement.
En tout cas je vais essayer et voir le résultat.
Mille merci et je reviens vers vous si tout fonctionne.
Re, encore merci pour le code.
Maintenant que j'ai réussi (grâce à vous) la lecture, j'ai besoin de finaliser une écriture :
J'ai tout fait mais j'ai deux petites erreurs :/
1) Enregistrer une modification
J'ai bien compris qu'en mode "Get", impossible d'enregistrer une nouvelle données sans passer par un "Put" mais impossible de correctement l'écrire...
Voici le code :
Private Sub CommandButton1_Click()
If NomEpreuve.Value = "" Or NomAthlete.Value = "" Or NewResult.Value = "" Then
MsgBox ("Merci de remplir entièrement le formulaire")
Else
'Ouverture du fichier
Open "C:\Testing\athlete" For Binary As #1
Dim udtPerson As Athlete, ok As Boolean
'Parcours tout le fichier
While Not EOF(1)
Get #1, , udtPerson
'Afficher les valeurs
With udtPerson
'Si il existe une épreuve dans la liste des résultats et que le sexe de la personne soit en accord avec la demande de l'utilisateur alors ok.
If NomEpreuve.Value = .Epreuve And NomAthlete = .NomAthlete Then
.performance = NewResult.Value
nom = .NomAthlete
Find = True
' --- Trouver la solution pour l'enregistrement ---
End If
End With
Wend
Close #1
If Find = True Then
MsgBox ("Résultat de l'athlete " & nom & " correctement modifié")
Else
MsgBox ("Athlete non présent dans la base de données ou n'ayant pas participé à ce type d'épreuve")
End If
End If
End SubQuelle solution pour modifier et enregistrer la valeur?
2) Ajouter des nouveaux enregistrements
Maintenant, je dois procéder à l'ajout d'un nouvel enregistrement. Je me suis chouette je vais créer çà facilement mais... je n'arrive à en faire qu'un seul et chaque nouveau remplace le dernier créée :
Private Sub CommandButton1_Click()
nom = Athlete '--- Code pour inscrire plusieurs nouvelles personnes et pas qu'une ---
With nom
.numLicence = NouveauNumero.Value
.sexe = "H"
.NomAthlete = NouveauNom.Value
.prenomAthlete = NouveauPrenom.Value
.Club = NouveauClub.Value
.Epreuve = NouvelleEpreuve.Value
.performance = NouveauResultat.Value
.classement = NouveauClassement.Value
End With
Open "C:\Testing\athlete" For Binary As #1
Put #1, , nom
Close #1
End SubLà aussi comment faire pour rajouter un enregistrement via l'userform qui permet à l'utilisateur de saisir?
Merci de vos indices et on pourra clôturer
Bonjour,
tu ne t'intéresse pas trop aux liens fournis sinon tu aurais signalé qu'il avait été mal copié.
Pour la 3ème fois un accès aléatoire te permet d'accéder directement à un enregistrement pour le modifier.
Tu as juste à te construire une table de clés (ou plusieurs)
https://msdn.microsoft.com/en-us/library/aa733671
eric
Bonjour,
Je suis nouveau et tout en recherchant par curiosité, la gestion de fichiers binaires (For Binary), que je n’utilise pas, je suis tombé sur ce fil de discussion à propos de données extériorisées.
Cela fait plusieurs années que j’extériorise les données, voir des scripts, mais sans utiliser de ‘fichiers binaires’, mais un mélange de fichiers textes à accès séquentiels (for Input, for Append) et à accès directs (for Random) suivant le type de données à écrire.
Ce fil est-il toujours d’actualité ?