Zone d'impression et message d'erreur

S

Spike1630

Guest
Bonjour à tous,

Je suis débutant en VBA et je nage un peu... voici ce que j'aimerais faire :

Dans ma feuille de calcul, l'utilisateur n'est autorisé qu'à entrer un chiffre pair compris entre 8 et 50 dans la cellule T1 et ensuite à imprimer la feuille. J'ai besoin de votre aide pour deux choses :

- Tout d'abord, j'aimerais qu'une fenêtre d'erreur s'affiche si l'utilisateur entre un chiffre impair ou qui n'est pas compris entre 8 et 50. Par exemple : 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'.

- Ensuite, j'aimerais que la zone d'impression soit définie d'après le chiffre que l'utilisateur aura entré dans la cellule T1. La zone d'impression correspondant au chiffre entré et toujours la même (par exemple, pour 8 : zone d'impression 'A12:AC49', pour 10 : zone d'impression 'A12:AC58', pour 12 : zone d'impression 'A12:AC68, etc.). Je pensais donc utiliser des 'If, Then, Else', malgré le fait que ça en fera beaucoup pour aller jusqu'à 50. Dernière précision : j'aimerais que la zone d'impression se définisse lorsque l'utilisateur entre le chiffre dans la cellule T1, et pas en créant un bouton sur lequel il devrait cliquer.

Voilà, voilà, j'espère trouver une bonne âme pour me donner les codes correspondants !

Merci d'avance et salutations à tous.
 

Claudy

XLDnaute Accro
Bonsoir,
à mettre dans le code de ta feuille.....

'Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = 'T1' Then
zaza = Target.Value Mod 2 'si T1 est impair.....
If zaza = 1 Then
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Exit Sub
End If
Select Case Target.Value
Case Is < 8 'Si T1 est inférieur à 8
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Case Is > 50 'Si T1 est supérieur à 50
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'

'Icitu commences à définir les zones d'impression
Case Is = 8
ActiveSheet.PageSetup.PrintArea = '$A$5:$D$10'
Case Is = 10
ActiveSheet.PageSetup.PrintArea = '$r$5:$w$20'
Case Is = 12
ActiveSheet.PageSetup.PrintArea = '$I$5:$P$10'
End Select

End If
End Sub
Bonne chance,
Claudy
 
S

Spike1630

Guest
Salut Claudy,

Merci infiniment, c'est exactement ce qu'il me fallait ! Tu m'enlève une sacrée épine du pied !!!

J'en profite pour te demander encore une petite chose :

Lors de l'affichage du message d'erreur, si le chiffre n'est pas pair ou compris entre 8 et 50, y a t-il possibilité pour que lorsque l'on clique sur 'OK', le focus revienne sur la case T1 et que le chiffre revienne automatiquement à 8 ?

Merci encore pour tes lumières !
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir Claudy et Spike1630, bonsoir le forum,

pour faire ce que tu demandes, il suffit de remplacer le code de spike suivant :

If Target.Address(0, 0) = 'T1' Then
zaza = Target.Value Mod 2 'si T1 est impair.....
If zaza = 1 Then
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Exit Sub
End If
Select Case Target.Value
Case Is < 8 'Si T1 est inférieur à 8
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Case Is > 50 'Si T1 est supérieur à 50
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'


par :

If Target.address = 'T1' then
If Target.Value Mod 2 <> 0 Or Target.Value < 8 Or Target.Value > 50 Then
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Target.value = 8
Exit Sub
End If


Amicalement
Charly
 

Claudy

XLDnaute Accro
Bonjour les noctambules :)

désolé,Charly et Spike, mais cela dépasse mes compétences,car le problème, c'est ce 'Private Sub Worksheet_Change(ByVal Target As Range)'
J'ai essayé,mais à chaque fois que le target.value se met à 8 , il se déclenche :whistle:
J'attend l'avis d'un spécialiste:
Comment arreter cette boucle?
A+
claudy
 
S

Spike1630

Guest
Hello,

Pour moi c'est tout bon, ça marche !

En fait j'ai gardé le code de Charly en y ajoutant simplement 'Target.Value = 8', ce qui me donne :

<B>If Target.Address(0, 0) = 'T1' Then
zaza = Target.Value Mod 2 'Si T1 est impair...
If zaza = 1 Then
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'
Target.Value = 8
Exit Sub
End If
Select Case Target.Value
Case Is < 8 'Si T1 est inférieur à 8
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'
Case Is > 50 'Si T1 est supérieur à 50
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'</B>

Ca marche nickel, merci à vous deux !

A+
 

Charly2

Nous a quittés en 2006
Repose en paix
Re à tous,

Pour empêcher qu'une nouvelle procédure événementielle se déclenche, tu rajoutes les instructions en gras

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = '$T$1' Then
If Target.Value Mod 2 <> 0 Or Target.Value < 8 Or Target.Value > 50 Then
MsgBox 'Attention, vous devez entrer un chiffre pair compris entre 8 et 50 !'
Application.EnableEvents = FALSE
Target.value = 8
Application.EnableEvents =TRUE
Exit Sub
End If

'Icitu commences à définir les zones d'impression
Select Case Target.value
Case Is = 8
...
Case Is = 10
Etc...
End Select

End If
End Sub

Voili voilà ;)

Amicalement
Charly
 
S

Spike1630

Guest
Ah non, pardon, un petit oubli... en fait pour que ça fonctionne, il faut ajouter trois fois 'Target.Value = 8', soit :

If Target.Address(0, 0) = 'T1' Then
zaza = Target.Value Mod 2 'Si T1 est impair...
If zaza = 1 Then
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'
Target.Value = 8
Exit Sub
End If
Select Case Target.Value
Case Is < 8 'Si T1 est inférieur à 8
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'
Target.Value = 8
Case Is > 50 'Si T1 est supérieur à 50
MsgBox 'Attention ! vous devez entrer un chiffre pair compris entre 8 et 50 !'
Target.Value = 8

Voilà, voilà...
 
S

Spike1630

Guest
Zut, encore une boulette... ça c'était le code de Claudy, pas de Charly ! Mais a-t-on idée d'avoir des noms si proches ! :p

En tout cas, Charly, je viens de tester ton code et ça marche aussi !

Merci infiniment à tous les deux pour votre aide précieuse !

Allez... j'abuse et je redemande un truc : :whistle:

Y a t-il possibilité de trier un tableau en VBA, sans passer par la commande 'SELECT' ?

Je m'explique : j'aimerais trier un tableau 'B3:I52' d'après la colonne 'H', par ordre décroissant, en cliquant sur un bouton créé à cet effet. Je l'ai fait avec l'enregistreur de macro et ça fonctionne très bien.

Mon problème est le suivant : lors de l'enregistrement, j'ai d'abord sélectionné mon tableau, puis je l'ai trié (le code créé automatiquement comporte donc un 'SELECT'). Hors, j'ai ensuite protégé ma feuille contre les modifications de l'utilisateur et j'ai interdit la sélection des cellules verrouillées. Les deux dernières colonnes de mon tableau (soit 'H' et 'I') étant verrouillées, lorsque je lance ma macro, il me fait une erreur, puisque je lui demande de sélectionner des cellules qui ne peuvent pas l'être.

Voilà... c'est pas bien sorcier comme problème, mais c'est pas simple à expliquer... j'espère avoir été assez clair...

Merci d'avance !
 

Charly2

Nous a quittés en 2006
Repose en paix
Re

Le .Select de ton code ne bloque pas ta macro. C'est le tri qui pose problème quand la feuille est protégée car il modifie des cellules verrouillées.

Si tu n'as pas mis de mot de passe, tu peux essayer le code suivant :

ActiveSheet.Unprotect
' Les instructions de ta macro du genre :
TonTableau.Select
' puis tri
Selection.Sort ...
'
ActiveSheet.Protect DrawingObjects:=True

En espérant que cela réponde à ta demande ;)

Amicalement
Charly
 
S

Spike1630

Guest
Merci Charly !

C'est exactement ce qu'il me fallait ! :woohoo:

Mais pour info, c'était bien le select et pas le tri qui bloquait ma macro, car lorsque l'on protège la feuille, on peut spécifier que le tri soit autorisé et je l'avais fait.

Merci beaucoup en tous cas !

A+
 

Discussions similaires

Réponses
8
Affichages
609

Statistiques des forums

Discussions
311 720
Messages
2 081 896
Membres
101 833
dernier inscrit
sandra25