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 ! Mets-toi à l'étude des modules de classe (si besoin) et négocie pied à pied !!!

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 Function

Ma 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...

83sport.xlsm (29.85 Ko)

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 Sub

Si 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 Sub

Quelle 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 Sub

Là 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é ?

Rechercher des sujets similaires à "fichier binaire vba"