[Résolu] VBA macro avec formule si( pour imprimer

  • Auteur de la discussion 46valentino
  • Date de début

46valentino

Nouveau membre
Bonsoir à tous,

Je suis novice en VBA, j'arrive à lire et à comprendre certaines macros.
Je voudrais faire une macro "impression" qui en clair dirait:

[si(C3=1;"tu imprime l'onglet nommé dans la cellule A3"; sinon tu fait rien) puis
si(C4=1;"tu impression l'onglet nommé dans la cellule A4"; sinon tu fait rien) puis
si(C5=1;"tu impression l'onglet nommé dans la cellule A5"; sinon tu fait rien) puis
et ainsi de suite jusqu'à C257].

J'ai cherché sur votre forum mais je n'ai pas trouvé de formules en VBA.

D'avance merci à tous ceux qui pourrons m'aider à traduire ce language clair en VBA ou me rediriger vers un forum plus approprié.

@+
Merci
 

zeb

Modérateur
Salut,

Ben oui, une par onglet ! Quoi de plus logique ?

Valentino, pour apprendre par toi-même comment imprimer, utilise l'enregistreur de macro. Quand tu sauras faire pour 1, je te montrerais comment faire pour 257 ! :)
________________________

[:zeb:6]
En passant, va lire le règlement. Celui-ci stipule que le moindre bout de code doit être présenté correctement avec la balise
Code:
. Modifie ton message en conséquence.
 

46valentino

Nouveau membre
Bonsoir Zeb,

Voici la macro impression de l'enregistreur

[Sub Imprime()
'
' testImprime Macro
' Macro enregistrée le 23/08/2010
'
'
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub]

Mon souci n'est pas tellement l'impression en elle-même mais l'intégration d'une formule conditionnelle suivie d'une recherche d'onglet à imprimer correspondant à un contenu de cellule.

Je suis dispo pour toutes explications ou formations.

encore merci,
@+
 

zeb

Modérateur
T'as pas de chance ! Le seul qui veuille bien t'aider avec tes soucis de macro VBA, c'est le modérateur. Et comme le zèbre est à cheval sur le règlement et buté comme un âne, il ne te lâchera pas une ligne de code si tu ne fous pas ces deux fichues balises
Code:
 et [[i]/[/i]code] au début et à la fin de ton code.
 

beru

Habitué
Je vais p-ê me faire incendier par le modérateur car je te réponds alors que tu n'as pas "posté" selon les règles. Mais je prends tout de même le risque.

Pour revenir à ton problème, j'aurais placé un bouton sur ta page avec les 257 lignes où tu veux lancer l'impression, et comme code derrière le bouton, je mettrai tout simplement ceci :

Code:
Private Sub CommandButton1_Click()
Dim i As Integer
    For i = 3 To 257
        If ActiveSheet.Cells(i, "C") = 1 Then
            ActiveSheet.Cells(i, "A").PrintOut copies:=1, collate:=True
        End If
    Next i
End Sub
 

zeb

Modérateur
Ah, j'infirme ce que j'ai dit. T'as de chance, beru accepte de t'aider. Tant mieux pour toi. T'as vu comme son message est clair et le code bien présenté ?

Bon, par contre, son code ne marche pas, mais il y a de bonnes idées là-dedans.
 

beru

Habitué
Etonnant que cela ne marche pas.
Je viens de tester chez moi sous Excel 2003 cela fonctionne sans soucis. :??:

Maintenant, je peux supposer que c'est la ligne d'impression qui dois te gêner? Dans un premier temps j'avais écris ceci

Code:
Private Sub CommandButton1_Click()
 Dim i As Integer
 Dim nom As String
      For i = 3 To 257
        If ActiveSheet.Cells(i, "C") = 1 Then
             nom = ActiveSheet.Cells(i, "A")
             Sheets(nom).PrintOut copies:=1, collate:=True
        End If
     Next i
End Sub

Mais la version "plus courte" que j'ai proposé fonctionne aussi, j'ai donc choisi de proposer celle là.

 

zeb

Modérateur
Ahhh ! Ce second code m'inspire mieux.

Je viens de tester chez moi sous Excel 2003 cela fonctionne sans soucis. :??:
Dis, t'es sûr que tu imprimais la bonne feuille dans ton premier exemple ?
Je crois plutôt que tu imprimais le contenu de la cellule Ai.

Bon comme Valentino a décider de bouder, c'est à toi, Beru que je vais faire la leçon.
[:flambyx:2]

A chaque fois que tu écris ActiveTruc ou Selection dans une macro, c'est que tu es en train de te planter. Comme les macros peuvent se déclencher sur événement, périodiquement, sur action de l'utilisateur, etc. d'une part, et que Windows est capable de mettre au premier plan une fenêtre autre que celle sur laquelle tu travailles, il ne fut surtout ne pas faire confiance à ce qui est actif au moment où l'on démarre une macro.

Par hypothèse, c'est la feuille 1 qui contient les feuilles à imprimer. Ton code devient :
Code:
Dim i As Integer
Dim nom As String

For i = 3 To 257
    If Worksheets(1).Cells(i, "C" ) = 1 Then
        nom = Worksheets(1).Cells(i, "A" )
        Sheets(nom).PrintOut Collate:=True
    End If
Next

J'ai consciencieusement retiré la variable après le Next. C'est l'indentation du code qui permet de nous repérer, pas ce vestige du BASIC de 1963 ! Je n'ai pas non plus précisé le nombre de copie, puisque nous utilisons la valeur par défaut. Cependant, il est parfois intéressant de préciser quand même ces valeurs.

Comme tu aimes les codes condensés, je te propose ceci :
Code:
Dim i As Integer

For i = 3 To 257
    If Worksheets(1).Cells(i, "C" ) = 1 Then Sheets(Worksheets(1).Cells(i, "A" )).PrintOut Collate:=True
Next

________________________

T'as vu, j'ai certes critiqué ton message, objectivement :o mais j'ai gardé mon étoile de shérif dans ma poche : tu ne t'es pas fait incendier.
 

beru

Habitué
Je retire ce que j'ai dit concernant mon premier code. Me suis planté dans le test, mea culpa.
(pour tester, j'ai créé deux onglets. Le premier s'appellait page 1 et pour avoir quelque chose à imprimer dans la 1er cellule j'ai "maladroitement" tapé page 1. Pareil pour le second onglet (page 2), j'ai écrit page 2 ds la 1er cellule.
Du coup mon 1er code pouvait donner l'impression de fonctionner).

Concernant l'utilisation de l'activesheet, je l'ai bien fait exprès ici. Ne sachant pas le nom qu'il allait donner à sa feuille où se trouve ces 257 lignes, j'ai prit l'autre alternative, de lancer le code via un bouton se trouvant sur cette page (comme indiqué lors de mon premier post). De cette manière, je m'assurais quelque part que l'activesheet était bien la bonne.
Mais tu as entièrement raison, bcp de choses peuvent se passer pendant que la macro tourne, et un changement de feuille active n'est pas à exclure!

Pour la petite variable après le next, même si c'est superflu, j'apprécie toujours de le voir (mais bon là chacun ses goûts) :)

Et ne t'inquiète pas, toutes critiques bonnes ou mauvais sont toujours bonne à prendre. De ce côté là je n'ai aucun soucis :D

PS : Ton code condensé ne marche pas chez moi :p
 

zeb

Modérateur
Quoi, quoi, quoi ? Comment ça, il ne marche pas ?
C'est quoi le message d'erreur ?

_________________________
Vous devez être connecté pour voir les images.
Code vérifié avec une imprimante PDF pour ne pas gâcher de papier.
 

beru

Habitué
Erreur d'exécution'13':
Incompatibilité de type

Si je lance le débogage, il me souligne en jaune cette partie de code :

Code:
Sheets(Worksheets(1).Cells(i, "A")).PrintOut Collate:=True
 

zeb

Modérateur
Tout dépend de ce que tu as dans ta case [Ai]. Pour être sûr, il vaut mieux mettre cette valeur dans une variable, en vérifier le contenu puis enfin s'en servir.
Les codes concis, voire condensés sont permis quand il n'y a pas d'équivoque possible, lorsque les vérifications ont déjà été faites, par exemple.

Voici un exemple de code blindé :
Code:
Dim cell As Range
Dim sh As Object
Dim sh0 As Object

Set sh = Nothing
For Each cell In Worksheets(1).Range("C3:C257")
    If cell.Offset(0, -2).Value = 1 Then
        If IsNumeric(cell.Value) And _
           CInt(cell.Value) >= 1 And _
           CInt(cell.Value) <= Sheets.Count _
        Then
            Set sh = Sheets(CInt(cell.Value))
        Else
            For Each sh0 In Sheets
                If UCase(sh0.Name) = UCase(cell.Value) Then
                    Set sh = sh0
                    Exit For
                End If
            Next
        End If
        If Not sh Is Nothing Then
            sh.PrintOut Collate:=True
        End If
    End If
Next

C'est un peu plus "lourd"... :D
 

46valentino

Nouveau membre
Bonsoir Zeb et Beru,

Merci de vous occupez de mon sujet et je vois que vous y mettez du coeur, merci.

Mes recherches m'ont menées vers un expert qui m'a sympatiquement livré ce code (à mettre sur la feuille ou se trouve le bouton d'impression).

Résultat excellent.

Code :

1. Sub impression()
2. For i = 3 To 257
3. If Cells(i, 3) = 1 Then Sheets(CStr(Cells(i, 1).Value)).PrintOut
4. Next
5. End Sub

J'ai l'impression de ne faire que passer mais je voudrais vous dire que:

Je suis en d'admiration devant votre patience, dévouement, implication dans nos projets (petits ou grands).
A vous programmateurs, informaticiens et autres que l'on croisent sur les différents forums spécialisés.

Respect et chapeau bas, Messieurs.

encore merci,
@+
Valentino
 

zeb

Modérateur
Valentino, tes compliments me touchent beaucoup. :merci:

Ton expert t'a livré le même code que celui proposé (au deuxième coup :o ... :D ) par Beru.
Et si tu avais respecté le règlement, je ne lui aurai même pas laisser le poster ! :sol:

En attendant, tu n'es toujours pas respectueux de ce fichu règlement. Tu vas m'utiliser cette fichue balise oui ou m[:zeb:5]e
[:zeb:6]




(Beru, on a gardé tous les deux le paramètre Collate - assemblage des copies - alors qu'on ne fait qu'une copie de l'impression :pfff: )
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 058
Membres
1 586 284
Dernier membre
fjfkfjfkfjfjcj
Partager cette page
Haut