Générer étiquette
Bonjour,
Je souhaiterais créer une macro qui génère des étiquettes quand on clique sur un bouton.
Pour se faire, j’ai un classeur avec deux feuilles :
- un feuille « ENVOI » qui regroupe l'ensemble des données
- un feuille « ETIQUETTE » qui doit récupérer les données de la feuille ENVOI pour ensuite être imprimée
Feuille ENVOI :
| A NUMERO | B EMETTEUR | C ID | D IMPRIMER | |
|---|---|---|---|---|
| 1 | AAA | EMETTEUR 1 | E1 | VRAI |
| 2 | BBB | EMETTEUR 2 | E2 | FAUX |
| 3 | FAUX | |||
| 4 | CCC | EMETTEUR 3 | E3 | VRAI |
| 5 | DDD | EMMETEUR6 | E6 | VRAI |
Feuille ETIQUETTE :
| A NUMERO | B EMETTEUR | C ID | |
|---|---|---|---|
| 1 |
J’ai essayé de simplifier au maximum, la réalité est un peu plus complexe mais je devrais pouvoir me débrouiller pour adapter.
L’idée est la suivante :
Pour toutes les lignes de 1 à 5 de la feuille ENVOI, si la valeur de la cellule de la colonne D « IMPRIMER » est égale à « VRAI » alors :
- Mettre la valeur de A1 de la feuille ENVOI dans la cellule A1 de la feuille ETIQUETTE
- Mettre la valeur de B1 de la feuille ENVOI dans la cellule B1 de la feuille ETIQUETTE
- Mettre la valeur de C1 de la feuille ENVOI dans la cellule C1 de la feuille ETIQUETTE
Ensuite idem avec la ligne 4 et 5.
Une fois toutes les lignes « scannées » (lignes de 1 à 5), imprimer les étiquettes qui ont "matché"
Dans mon exemple, j'aurais donc trois étiquettes qui seront imprimées :
| NUMERO | EMETTEUR | ID |
|---|---|---|
| AAA | EMETTEUR 1 | E1 |
| NUMERO | EMETTEUR | ID |
|---|---|---|
| CCC | EMETTEUR 3 | E3 |
| NUMERO | EMETTEUR | ID |
|---|---|---|
| DDD | EMMETEUR6 | E6 |
Sachant que :
- Il ne peut y avoir que deux étiquettes maximum par feuille imprimée (le vrai format de l’étiquette fait la moitié d’une page A4)
- Le nombre de lignes de la feuille ENVOI à contrôler sera fixe (5 dans mon exemple) et il n’y aura pas toujours de valeur sur toutes les lignes (à l'exception de la colonne D qui sera toujours complétée par "VRAI" ou "FAUX") mais il faut quand même que la boucle fasse toutes les lignes .
J'ai essayé de m'inspirer de certaines macros proposées sur ce forum mais je n'y arrive pas. Sauriez-vous me filer un petit coup de main svp ?
En vous remerciant,
J’ai essayé de simplifier au maximum, la réalité est un peu plus complexe mais je devrais pouvoir me débrouiller pour adapter.
Hummm ! Les simplifications conduisent dans 99% des cas à une perte de temps importante. Qu'entendez-vous par "la réalité est un peu plus complexe" ?
Le plus simple et le plus rapide est de tout nous dire au départ.
Une proposition brute de terrassement :
Bonjour,
Plus complexe dans le sens : il n'y a pas que 5 lignes mais 26 à contrôler, il y a pas que 3 colonnes et certaines sont fusionnées, le "VRAI" / "FAUX" vient d'une case à cocher qui a été lié à la cellule etc... Le format en PJ est plus proche de la réalité.
Une proposition brute de terrassement :
Je regarde ça, merci.
Le nombre de cellule à contrôler et leur emplacement étant fixe (de AA13 à AA38), la variable nL n'est pas nécessaire, je me trompe ?
For i = 13 To 38
If UCase(wS1.Cells(i, 27)) = "VRAI" ThenEnsuite, je comprends qu'un tableau est créé avec les valeurs des lignes "VRAI" avec table(nE) = i et que les valeurs de ce tableau sont appliqués dans la feuille étiquettes avec wS1.Range("A" & table(i) & ":C" & table(i)).Copy Destination:=wS2.Cells(2, 1). Est-ce bien ça ?
Le hic c'est que l'étiquette ne suis pas le même format que ENVOI (la valeur de A2 de la feuille ENVOI ne pas va pas dans A2 de ETIQUETTE). Les étiquettes sont dans un format particulier que je ne peux pas modifier.
Comme vous l'aviez évoqué, la simplification que j'ai faite dans mon explication initiale n'aide pas. Le fichier ci-dessous est beaucoup plus proche de la réalité.
En vous remerciant,
Je crois que vous avez oublié la référence INT dans vos étiquettes.
Juste une précision : les cases à cocher sont des contrôles ActiveX attachés aux cellules qui les contiennent.
Tout semble fonctionner correctement, merci !!
Bonjour,
j'ai remarqué que la macro renvoie une erreur quand aucune des cellules n'est cochées.
Est-ce possible de rajouter une fonction qui, dans ce cas, n'exécute pas la macro mais affiche un message à la place ?
En parallèle, je souhaiterais ajouter un second bouton qui écrit "X" dans chaque colonne du tableau dès que la première ligne de la plage A13:B38 est vide ?
J'ai trouvé quelques pistes avec
ActiveSheet.Range("A13:A38").End(xlDown)(2).SelectCells(Rows.Count, 1).End(xlUp).Row + 1Range("A1").Rows(1).End(xlDown).Offset(1, 0)mais je ne m'en sors pas.
Merci
Bonjour,
pour ma première question :
Est-ce possible de rajouter une fonction qui, dans ce cas, n'exécute pas la macro mais affiche un message à la place ?
J'ai ajouté :
If nE = 0 Then
MsgBox "Aucune étiquette n'a été sélectionnée !"
ElseAprès
For i = 13 To 38
If Range("AK" & i) = True Then
nE = nE + 1
ReDim Preserve table(nE)
table(nE) = i
End If
Next iÇa semble fonctionner. Est-ce "propre" ?
Cette structure est à éviter, surtout si le code est long et/ou mal indenté.
Plutôt que d'écrire :
If nE = 0 Then
MsgBox "Aucune étiquette n'a été sélectionnée !"
Else
' Programme principal
For i = 13 To 38
If Range("AK" & i) = True Then
nE = nE + 1
ReDim Preserve table(nE)
table(nE) = i
End If
Next i
etc.
end ifil vaut mieux opter pour un Exit Sub en amont :
If nE = 0 Then
MsgBox "Aucune étiquette n'a été sélectionnée !"
exit sub
end if
' Programme principal
For i = 13 To 38
If Range("AK" & i) = True Then
nE = nE + 1
ReDim Preserve table(nE)
table(nE) = i
End If
Next i
etc.Surtout s'il y a une autre condition envisageable. Une case accidentellement cochée sur une ligne vide, par exemple, ce que vous n'avez pas prévu.
Je n'ai pas compris la raison de cette ligne de "X". Si c'est pour avoir une étiquette contenant des "X" plutôt que des vides lorsque le nombre d'étiquettes est impair, on pouvait tout faire avec un seul bouton. Je vous ai mis cela en eti3.xlsm.
Bonsoir,
Merci, j'ai effectué la modification.
C'est bien ce que vous avez proposé dans eti2 qu'il me faut.
Merci encore !