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

Access Discussion :

Impression de plages d etiquettes avec vba


Sujet :

Access

  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut Impression de plages d etiquettes avec vba
    Bonjour

    j'ai une table tblChronos contenant une clef primaire + un champ numerique contenant des numeros de 1 a 99999.
    Une requete parametres est basee sur cette table, et affiche deux inputbox pour filtrer la requete :
    [Premier numero a imprimer]
    [Dernier numero a imprimer]
    Cette requete est la source d'un etat etiquettes (contenant une seule zone de texte) et les etiquettes s'affichent parfaitement (un numero par etiquette).
    Jusque la aucun probleme.


    Je dois generer un autre etat d etiquettes, base sur la meme requete, mais pour afficher 2 numeros par etiquette, avec un intervalle defini et regulier :

    par exemple si je dois imprimer les etiquettes avec les numeros de 10000 a 10040 et avec un intervalle de 5 numeros par etiquette, il faut que mon etat affiche :

    10000-10004 (1ere etiquette) puis 10005 - 10009 (2eme etiquette) puis 10010 - 10014 (3eme etiquette) etc....

    je dois imprimer plusieurs etats de ce type avec divers intervalles (ecart de 5 entre 2 numeros comme dans mon exemple, ou ecart de 14 numeros comme 10000 - 10013 puis 10014 - 10027 ...)

    J'ai cree un second etat avec 2 zones de texte pour chaque etiquette mais je n'obtiens pas le resultat voulu :

    10034 10038
    10035 10039
    10036 10040
    10037 10041
    10038 10042
    10039 10043
    10040 10044

    alors qu'il faut que l etat affiche :

    10034 10038
    10039 10043
    etc...

    quelqu'un peut il m'aider ?
    d'avance merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 600
    Par défaut
    Hello,

    Comment l'utilisateur doit-il spécifier cet intervalle lors de l'exécution de l'état ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Merci pour le message
    L’intervalle peut être spécifié directement dans le code vu que je dois créer au moins 2 états différents ( un avec un intervalle de 5 et un avec un intervalle de 14) ou via une inputbox même peut importe

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 600
    Par défaut
    Je proposerai ceci pour l'intervalle 5,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PARAMETERS
        [Premier numero a imprimer] Long,
        [Dernier numero a imprimer] Long;
    SELECT
        T.VotreChampNumero
    FROM
        tblChronos AS T
    WHERE
        (T.VotreChampNumero >= [Premier numero a imprimer])
        AND (T.VotreChampNumero <= [Dernier numero a imprimer])
        AND (((T.VotreChampNumero - [Premier numero a imprimer]) Mod 5) = 0);
    puis une autre requête à adapter pour l'intervalle 14.

    Pour l'état pour chaque intervalle,
    • Mettre la Source (RecordSource) de l'état sur qryEtiquettes_Intervalle[intervalle].
    • Zone 1 (Début) : =[VotreChampNumero]
    • Zone 2 (Fin) : =[VotreChampNumero] + (intervalle-1) (Le "intervalle" est codé en dur).
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut Merci Fred1599
    Un grand merci pour ta solution, c'est absolument parfait !
    je m'etais pris la tete et au final ta solution est tres simple et tout simplement parfaite !
    j'ai modifie la requete, ajoute les quelques lignes de code dans l'etat et le resultat est exactement ce que je voulais !
    j'ai donc cree un second etat et une autre requete pour l'intervalle 14...Nickel

    Grace a ton code, fini de remplir a la main des tas de planches d etiquettes avec le risque d erreur , c'est super !
    Cela va me faire gagner enormement de temps au boulot et de plus ta solution est tres flexible pour imprimer les etiquettes avec les intervalles que je souhaite donc encore un grand merci !

    par curiosite, j'aimerais savoir comment adapter tout ceci dans un code vba (boucle ?) sans vouloir abuser ?

    en tous cas merci pour ta rapidite et reactivite

    Bien cordialement

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 600
    Par défaut
    Votre intuition d'une "boucle" est intéressante, mais en Access, le VBA n'est (généralement) pas utilisé pour "boucler" sur les données (ça, c'est le rôle du moteur SQL de la requête). Le VBA sert plutôt à piloter l'interface et à préparer les objets.

    L'objectif est de passer de :

    • qry_Intervalle_5 + rpt_Intervalle_5
    • qry_Intervalle_14 + rpt_Intervalle_14

    ...à un système unique :

    • 1 seul formulaire pour saisir les 3 paramètres (début, fin, intervalle)
    • 1 seule requête qui lit ce formulaire
    • 1 seul état qui lit ce formulaire


    Ce que je propose,

    Créez un nouveau formulaire vide (ex: frm_Lanceur_Etiquettes).

    1. Ajoutez 3 zones de texte non liées (c'est-à-dire non connectées à une table) :

      • Nom : txtNumDebut (pour "Premier numéro")
      • Nom : txtNumFin (pour "Dernier numéro")
      • Nom : txtIntervalle (pour l'intervalle, ex: 5 ou 14)

    2. Ajoutez un bouton de commande.

      • Nom : cmd_Apercu
      • Légende : "Aperçu des étiquettes"


    Créez une seule requête (ex: qry_Etiquettes_Dynamique). Elle ne demandera plus de paramètres, car elle ira les lire directement dans le formulaire qui doit être ouvert.

    En mode SQL, elle ressemblera à ceci :

    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
     
    /* PAS de section PARAMETERS ici */
    SELECT
        T.VotreChampNumero
    FROM
        tblChronos AS T
    WHERE
        /* La requête lit les champs du formulaire */
        (T.VotreChampNumero >= [Formulaires]![frm_Lanceur_Etiquettes]![txtNumDebut])
        AND
        (T.VotreChampNumero <= [Formulaires]![frm_Lanceur_Etiquettes]![txtNumFin])
    AND
        /* Le 'Mod' utilise aussi le formulaire ! */
        (
            ((T.VotreChampNumero - [Formulaires]![frm_Lanceur_Etiquettes]![txtNumDebut])
            Mod
            [Formulaires]![frm_Lanceur_Etiquettes]![txtIntervalle]) = 0
        );
    Créez un seul état (ex: rpt_Etiquettes_Dynamique).

    Définissez sa propriété Source (RecordSource) sur votre nouvelle requête qry_Etiquettes_Dynamique.

    1. Dans la zone de texte pour le numéro de début (Zone 1) :

      • SourceContrôle : =[VotreChampNumero]


    2. Dans la zone de texte pour le numéro de fin (Zone 2) :

      • SourceContrôle : =[VotreChampNumero] + [Formulaires]![frm_Lanceur_Etiquettes]![txtIntervalle] - 1


    Ici aussi, l'état calcule la fin en lisant l'intervalle directement depuis le formulaire.

    Voici enfin le code VBA ! Il est très simple. Faites un clic droit sur votre bouton cmd_Apercu (sur le formulaire), puis "Générer événement" > "Générateur de code".

    Collez ce code :

    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
    Private Sub cmd_Apercu_Click()
     
        ' --- 1. Validation des saisies (très important !) ---
        If IsNull(Me.txtNumDebut) Or IsNull(Me.txtNumFin) Or IsNull(Me.txtIntervalle) Then
            MsgBox "Veuillez remplir les 3 champs.", vbCritical
            Exit Sub
        End If
     
        If Me.txtIntervalle <= 0 Then
            MsgBox "L'intervalle doit être supérieur à zéro.", vbCritical
            Exit Sub
        End If
     
        If Me.txtNumFin < Me.txtNumDebut Then
            MsgBox "Le numéro de fin ne peut pas être inférieur au numéro de début.", vbCritical
            Exit Sub
        End If
     
        ' --- 2. Lancement de l'état ---
        ' C'est la seule ligne de code "active"
        ' Elle dit à Access d'ouvrir l'état.
        ' L'état et sa requête vont automatiquement lire les
        ' valeurs de ce formulaire.
     
        DoCmd.OpenReport "rpt_Etiquettes_Dynamique", acViewPreview
     
    End Sub
    Vous n'avez plus qu'un seul état et une seule requête à gérer !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Bonsoir

    un grand merci pour votre deuxieme solution a mon probleme
    C'est encore mieux et plus adapte a ce dont j'ai besoin : un seul formulaire, un seul etat, plus de simplicite et d ergonomie, c'est tout simplement parfait !
    et quelle rapidite a mettre en place !

    super vraiment
    mille fois merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] selectionner une plage avec VBA
    Par iliesss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/11/2011, 16h09
  2. [XSL-FO] impression d'étiquettes avec FOP
    Par socaw dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2010, 11h29
  3. Impression publipostage en A5 avec VBA
    Par csempere dans le forum VBA Word
    Réponses: 4
    Dernier message: 10/06/2010, 07h11
  4. impression lente avec VBA
    Par hocine dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/06/2008, 17h31
  5. [VBA-E] Copier une plage de cellules avec critère
    Par jfamiens dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 13/06/2006, 17h34

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