IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Enregistrer sous d'après un code barre


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Enregistrer sous d'après un code barre
    Bonjour,

    Après avoir passé quelques heures à m'arracher les cheveux, je fais appel à votre aide.
    Je dois modifier une macro access car elle ne correspond plus à mes besoins. Ce n'est évidemment pas moi qui l'ai écrite et c'est du chinois pour moi. Je sais que vous êtes des spécialistes Excel mais je ne sais plus quoi faire...

    Elle permet d'ouvrir une fenêtre (image 1) est de scanner un code barre de 10 caractères de façon à créer un fichier.sds qui porte le nom du code barre (image 2) et de compléter un champs dans le fichier .sds avec ce même numéro de code barre (image 3).
    N'arrivant pas insérer les images dans mon message, vous les trouverez dans le fichier word attaché

    Mon problème est que aujourd'hui le nombre de caractères dans mon code barre est variable et est supérieur à 10 donc la macro ne fonctionne plus.

    J'ai réussi à modifier la macro pour que ça fonctionne avec 17 caractères (le max que je puisse avoir) mais ce n'est toujours pas variable... Si mon code barre a moins de caractère, ça bug!

    Ce que je voudrais réussir à faire c'est donc :
    - de virer les lignes qui concerne la session windows. Peut importe qui est connecté, je veux que ça foncttionne
    - de ne plus être dépendante du nombre de caractère. Que ce soit variable ou bien que ça fasse juste un copier/coller...

    Pour info : la macro fait appel a un fichier.sds template (Template.sds) dans lequel est complété le champs Barcode avec 17 caractères (image 4).

    Si mes explications ne sont pas suffisantes ou bien pas très claires (ce qui ne m'étonnerait pas), hésitez pas à me demander.

    Merci d'avance pour votre aide.
    Sabine
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour poybi_64,
    serait-il possible que tu nous joigne un fichier template.sds pour exemple ?
    Je ne comprends pas bien le contenu de ce fichier. Il semblerait que celui-ci contienne un nombre d'enregistrements variables, dont le nombre d'enregistrement soit au maximum égal à 47, et dont les 17 derniers enregistrements soient lus.
    A moins que cela soit un fichier d'une seule ligne contenant 47 caractères au maximum et dont seuls les 17 derniers soient exploitables.
    En tous les cas, il me semble qu'il existe une manière bien plus facile de traiter ce fichier.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Merci pour ta réponse.
    Je veux bien te fournir le fichier template mais vas-tu pouvoir l'ouvrir ?

    Sabine
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour poybi_64,

    Pas de problème pour lire le template.

    Pux tu nous communiquer plusieurs exemples de fichier platname (ou, si ceux-ci sont confidentiels, le nom de plusieurs de ceux-ci) ?


    Autre chose :
    les positions de 30 à 46 sont valorisé avec le n° d'unité de colonne de 1 à 17.
    Dans ton algorithme, on remplace le n° de colonne avec le n-ième caractère du nom de ton fichier platname.
    QUe se passe-t-il si ton platname n'a que 10 positions ?
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    platname  = A_12345_AB
    colonnes 30 à 46 du template avant passage dans le programme = 12345678901234567
    colonnes 30 à 46 du template apres passage dans le programme = A_12345_AB1234567
    Est-ce bien cela que tu veux ? Comment pourras-tu distinguer si ton code barre est égal à A_12345_AB et non à A_12345_AB1234567 ?
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Super!!
    Comme tu t'en doutes, je ne peux pas te communiquer les fichier ni de vrai platename mais voici quelques exemples :
    A_123456_01
    A_123456_02
    A_123456_08
    A_123456_ABC
    A_123456_ABCD
    A_123456_ABCDE
    A_123456_ABCDEFG
    A_123456_ABCDEFGH (le plus long que j'ai actuellement)

    Avant que je vienne mettre mon grain de sel dans cette macro, le fichier template contenait uniquement 10 caractères au niveau du platename (1234567890) et la macro s'arrêtait à la colonne 39 inclue.

    Tu as raison avec ton exemple, ce n'est pas ce que je veux...
    Ce que je voudrais, (même si je ne suis absolument pas en position de demander quelque chose!), c'est que le platename ne soit pas "limité", que ce soit un copier/coller même s'il a 1 million de caractères. C'est possible ça ?

    Enfin, c'est déja bien beau que tu essayes de m'aider.

    Merci.
    Sabine

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Ok, j'ai une idée plus précise de ce qui peut être fait.

    Par contre, il faut que tu précise bien la règle de gestion, comment doit être valorisés la zone non transformée du template, pour le cas où tes platname font entre 10 et 16 caractères, comme je te l'ai décrit dans le post précédent
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  7. #7
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Sabine,

    Voilà ce que j'ai comme proposition :

    J'ai modifié l'algorithme du traitement pour le rendre plus lisible :

    1. lecture complete du template et stockage dans un tableau
    2. traitement des éléments du tableau entre la position 30 et la position 46
    3. Ecriture du fichier de sortie

    J'ai testé mon algo avec un platename de longueur 15 et ça marche.
    Par contre, je n'ai pas essayé avec des vrais fichiers.Il peut donc y avoir un petit bug résiduel d'intégration, mais normalement, ça devrait marcher.

    Il faut faire attention, dans la partie déclarative , de rajouter, au niveau du module, l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Option Base 1 'sert pour déclarer que les tableau démarrent à  1 et non à zéro (option par défaut dans VB)
    cela te permet de travailler sur des tableaux commençant à 1.
    Si tu ne veux pas utiliser cette option, pour des raisons de compatibilité avec ton code par ex si d'autres programmes utilisent des tableaux, il faudra modifier les boucles et les bornes en conséquence et traiter le tableau à partir de 0 et enlever 1 à la borne de fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Public Sub CreateTemplate1()
    Dim nfic1 As Variant
    Dim nfic2 As Variant
    Dim strChar() As Byte 'tableau d'octets de longueur dynamique
    Dim nbToRead As Long
    Dim nbRead As Long
    Dim sDir As String
    Const sSubDir As String = "fichiersSDS"
    Dim strPlateName As String
    Dim i As Byte
    Dim dlgBox As MSComDlg.CommonDialog
     
        If Environ("UserName") = "sspouy" Then
            sDir = "C:\Applied Biosystems\Template\"
            sfichier = "Template.sds"
        Else
            Set dlgBox = New MSComDlg.CommonDialog
            With dlgBox
                .DialogTitle = "Please Select a sds file"
                .Filter = "SDS File (*.sds)|*.sds"
                .InitDir = sDir
                .CancelError = False
                .ShowOpen
                sDir = Replace(.FileName, .FileTitle, vbNullString)
                sfichier = .FileTitle
                If sfichier = vbNullString Then Exit Sub
            End With
        End If
     
        Do While True
            strPlateName = InputBox("Veuillez saisir ou scanner le nom de la plaque à créer. " & _
                                    "Cette plaque sera copiée dans " & sDir & sSubDir & ".", "Copie du Template", "")
            If strPlateName = "" Then Exit Do
            nfic1 = 1
            nfic2 = 2
            Close nfic1
            Close nfic2
            If Not Dir(sDir & sSubDir & "\" & strPlateName & ".sds", vbNormal) = "" Then
                If MsgBox("Le fichier destination existe déjà. Voulez-vous l'écraser ?", vbQuestion + vbYesNo + vbDefaultButton2) = vbNo Then Exit Do
            End If
            If Dir(sDir & sSubDir, vbDirectory) = "" Then MkDir (sDir & sSubDir)
     
            Open sDir & sfichier For Binary As nfic1
            Open sDir & sSubDir & "\" & strPlateName & ".sds" For Binary As nfic2
            nbToRead = LOF(nfic1)
     
            'Lors de l'ouverture du fichier d'entrée, La taille du fichier servira à dimensionner la taille définitive du tableau
            ReDim strChar(nbToRead)
     
            'lecture du ficheir d'entrée et mise dans un tableau
            For nbRead = 1 To nbToRead
                  Get nfic1, nbRead, strChar(nbRead)
            Next nbRead
            Close nfic1
     
            '---- traitement de mise à jour des caractères compris entre 30 et 46.
            '     on se base uniquement surla longueur du nom du platename
            '     ex : A_123456_ABCDE -> longueur = 15
            For i = 30 To (30 + Len(strPlateName)-1)
                strChar(i) = Asc(Mid(strPlateName, (i - 29), 1))
            Next i
              'pavé à rajouter éventuellement si tu dois faire un traitement spécifique sur les caractères compris entre longueur(platname) et 47
            If Len(strPlateName) < 17 Then
                For i = (30 + Len(strPlateName)) To 46
                    strChar(i) = 0
                Next i
            End If
            '---- fin du pavé de traitement
     
            'Ecriture dans le  fichier de sortie nfic2 à partir du  tableau mis à jour
            For nbRead = 1 To nbToRead
                     Put nfic2, nbRead, strChar(nbRead)
            Next nbRead
            Close nfic2
     
        Loop
    End Sub
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour dumas.blr,

    Merci pour tes modifications et tes explications même si je n'ai pas bien tout compris.

    J'ai modifié la macro avec le code que tu m'as envoyé et j'ai remplacé option compare database par option Base 1 mais évidemment ça ne marche pas.

    J'ai un message d'erreur quand je veux ouvrir la macro :
    "The expression that you entered has a function name that template copieur can't find"
    Et apr-s j'ai une fenêtre qui s'ouvre avec l'origine du problème :
    -Macro name = Autoexec
    Condition=True
    Action name = Run code
    Argument = Create template
    error number = 2950

    Je te joins la macro modifiée
    J'ai essayé d'enlever le 1 qu'il y a après create template mais ça change rien...
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Sabine,

    L'origine du problème vient probablement du fait que j'ai remplacé le mot function par le mot sub. J'ai l'habitude de nommer ce type de programme en tant que procédure, par réflexe. C'est une habitude que j'ai, en fonction du type de programme que j'écris. Je te donne l'explication plus loin.

    Je te renvoie le code corrigé. Je t'ai remplacé sub par function

    Rappel : une fonction est un programme qui renvoie une valeur à partir d'une valeur communiquée à l'entrée du programme, sans faire d'autres opérations parallèle alors qu'un procédure (sub) est un programme qui peut faire toutes les opérations.Les programmeurs ont tendance à utiliser ce formalisme pour faciliter la maintenance de leurs applications.

    Je déconseille de supprimer l'option compare database, car elle utilise des comparaisons de chaînes basées sur l'ordre de tri déterminé par l'identificateur de paramètres régionaux de la base de données dans laquelle la comparaison de chaînes est effectuée. C'est pour cela que je l'ai remis.

    Toutes mes excuses et bon courage !
    Fichiers attachés Fichiers attachés
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    La macro a l'air de fonctionner!!!!

    Si le platename< à 17 caractères, j'ai des petits carrés qui remplacent les caractères manquants.
    Je ne sais pas si ca va poser problème, je te dirai.

    Et pour info, si un jour le nombre de caractères augmente... qu'est-ce que je dois modifier dans la macro pour augmenter le nombre de caractère ?

    Merci encore.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    je t'avais posé la question dans mes post précédents

    il faut que tu précise bien la règle de gestion, comment doit être valorisés la zone non transformée du template, pour le cas où tes platname font entre 10 et 16 caractères
    et
    les positions de 30 à 46 sont valorisé avec le n° d'unité de colonne de 1 à 17.
    Dans ton algorithme, on remplace le n° de colonne avec le n-ième caractère du nom de ton fichier platname.
    QUe se passe-t-il si ton platname n'a que 10 positions ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ex :     platname  = A_12345_AB 
    colonnes 30 à 46 du template avant passage dans le programme = 12345678901234567 
    colonnes 30 à 46 du template apres passage dans le programme = A_12345_AB1234567
    Est-ce bien cela que tu veux ? Comment pourras-tu distinguer si ton code barre est égal à A_12345_AB et non à A_12345_AB1234567 ?
    Dans le programme que je t'ai communiqué, j'ai remplacé les caractères non remplacé par du zéro binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        'pavé à rajouter éventuellement si tu dois faire un traitement spécifique sur les caractères compris entre longueur(platname) et 47
             If Len(strPlateName) < 17 Then
                 For i = (30 + Len(strPlateName)) To 46
                     strChar(i) = 0
                 Next i
    Si tu veux remplacer les caractères par du blanc, il te faudra remplacer l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strChar(i) = 0 'code ASCII du zéro bianire
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strChar(i) = 20 'code ASCII de l'espace
    Pour cela, il faut que tu vérifie comment sont gérés les caractères de remplacement dans tes fichier SDS

    Dans le cas où la taille de tes codes barres augmenteraient (et à condition que ton code barre commence toujours en position 30), il te suffira juste de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           If Len(strPlateName) < 17 Then
    For i = (30 + Len(strPlateName)) To 46
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           If Len(strPlateName) < longueur maxi de ton code barre Then
    For i = (30 + Len(strPlateName)) To (30 + longueur maxi  de ton code barre - 1)
    Bon courage !
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

Discussions similaires

  1. ajout d'un ouverture de classeur apres un code d'enregistrer-sous ?
    Par lebeniste dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 05/04/2008, 16h10
  2. Création de code barre sous Access
    Par soso78 dans le forum Access
    Réponses: 1
    Dernier message: 24/07/2006, 17h59
  3. [CSV] Enregistrer sous? Apres un fichier enregistré
    Par Anakior dans le forum Langage
    Réponses: 12
    Dernier message: 19/12/2005, 13h30
  4. utilisation d'un lecteur de code barre sous delphi
    Par bm10 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 19/11/2005, 20h05
  5. [plugin][code barre] Codes Barres sous Eclipse
    Par eudes dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 08/11/2005, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo