macro sous condition

  • Initiateur de la discussion Arnaud
  • Date de début
A

Arnaud

Guest
Bonsoir le forum

J'ai mis un command button sur une feuille afin que les utilisateurs puissent appliquer une macro. Est-il posssible de rendre ce command button opérant que si tout les cellules requises sont remplit et indiquer par un message box quelles sont les cellules non remplit

Merci
 
@

@Christophe@

Guest
Bonjour Arnaud

Biensur que c'est possible, regarde l'exemple suivant:

Private Sub CommandButton1_Click()
If Range("A2").Value <> "" And Range("A3").Value <> "" Then
Range("A1").Value = "Test"
Else
MsgBox ("Certaine cellule requise n'ont pas été rempli")
End If
End Sub

si les cellule A2 ou A3 est vide alors le msgbox... apparait, si A2 et A3 sont non vide alors il affiche Test en A1

Voila

@Christophe@
 
M

Mytå

Guest
Salut Arnaud et @Christophe@

Un autre idée en verifiant une plage de cellule ic de B8 a D11 et un message indiquant les cellules a completer si le cas

Private Sub CommandButton1_Click()
L_deb = 8: L_fin = 11
C_deb = 2: C_fin = 4
Range(Cells(8, 2), Cells(11, 4)).Select
combine$ = "Veuillez remplir la(les) cellule(s) suivante(s) : " + Chr$(13) + Chr$(13)
For i = L_deb To L_fin
For j = C_deb To C_fin
If Cells(i, j) = " " Or Cells(i, j) = "" Then
combine$ = combine$ + Cells(i, j).Address + Chr$(13)
End If
Next j
Next i
If Len(combine$) > 52 Then
MsgBox combine$
Else
'Ici la macro du CommandButton
End If
End Sub

Mytå
 
A

Arnaud

Guest
Bonsoir @Christophe@

Est-ce que "test" veut dire que la macro marchera (ou dois-je remplacer cette ligne avec quelques chose qui ressemble à "activer la macro") .
Celle qui repond au command button dans ma feuille permet d'afficher les données saisies dans une base de données et en même temps d'incrémenter un numéro dans la feuille.
Si je comprend tout, la macro marchera si toute les cellules requises sont remplies mais restera inactive si ce n'est pas le cas.

Bonne soirée,

@+
Arnaud
 
@

@Christophe@

Guest
RE

Arnaud, en faite "Test" dans ma macro, c'est ce que je lui demande de faire si mes condition sont respecté, donc si A2 et A3 ne sont pas vide il marque Test en A1

Dans ton cas il faudra pour bien faire voir le code de ton commandbutton:

Mais on supposons que ton code est CODEA, tu devrais avoir quelque chose comme cela pour le commandbutton

Private Sub CommandButton1_Click()
If Range("A2").Value <> "" And Range("A3").Value <> "" Then

CODEA

Else
MsgBox ("Certaine cellule requise n'ont pas été rempli")
End If
End Sub

Voila, pas évident a expliquer

Bonne soiré

@Christophe@
 
A

Arnaud

Guest
Bonjour le forum et bonne semaine

@Christophe@, tes explications sont une fois de plus impéccables, cela marche trés bien.
Par contre pour corser un peu j'ai essayer d'appliquer le code indiquer par Mytä. Et dés que j'appuie sur le commandbutton, j'ai une erreur de compilation m'indiquant une variable non défini pour " L_deb = " .
Comme je bidouille en même temps que j'écris ce post, j'ai essayé l'aide et cela me dit que cela vient de 'option explicit' qui débute mon code. Je l'ai enlevé et le code de Myrä à l'air de fonctionner. Alors ma question maintenant est de savoir si le fait d'avoir oté "Option Explicit" aura une incidence sur le reste du classeur.

Merci et à bientôt
Arnaud
 
V

Valérie

Guest
Bonjour Arnaud et le forum,

Option Explicit t'impose de déclarer tes variables avant de les utiliser, c'est uns sécurité qui t'évite tout d'abord

de prendre plus de place qu'il n'en faut car à chaque déclaration tu détermines le type (ex: byte, integer, long, single, string, date ou encore range, worksheet...) et donc la taille de ta variable

d'utiliser une variable à la place d'une autre (erreur de saisie entre autre)

Ce qui veut dire que tu aurais pu garder Option Explicit en rajoutant

Dim L_deb, L_fin, C_deb, C_fin as Byte 'Pas plus de 255
Dim combine$ as String

Sinon moi j'aurai plutôt fais :

Private Sub CommandButton1_Click()
Dim CELLULE As Range, MESSAGE As String

For Each CELLULE In Range("B8:D11")
If CELLULE = "" Then MESSAGE = MESSAGE & WorksheetFunction.Substitute(CELLULE.Address, "$", "") & ", "
Next

If MESSAGE <> "" Then
MsgBox "La ou les cellules suivantes ne sont pas remplies : " & vbCrLf & Left(MESSAGE, Len(MESSAGE) - 2)
Else
TONCODE
End If
End Sub

@ bientôt
Valérie
 
A

Arnaud

Guest
Bonjour Valérie

Je viens d'essayer ton code et cela marche sans probléme. J'ai cependant quelques petites choses à demander en plus
- Dans le code, c'est une plage de cellule qui est définit, peut-on définir que certaines cellules, ainsi au lieu de chercher dans toute la plage, on ne rechercherait que dans certaines cellules.
- Par ailleurs, j'ai défini un nom pour les cellules qui doivent être rempli, peut-on faire apparaître ces noms à la place des références des cellules ?

Merci encore de ton aide

@+
Arnaud
 
@

@Christophe@

Guest
Bonjour a tous

Arnaud, pour cela dans le code de Valerie qui rien a dire, est super, tu ajoute te cellule dans le ligne suivante

For Each CELLULE In Range("B1:B5,C1,D3,D7")

Dans cette ligne, j'ai mis la plage de cellule B1:B5 doit être rempli, mais également la cellule C1 et D3 ainsi que D7,... a toi d'y mettre le tienne.

Tu peux aussi remplacé par tes cellule nommé, style

For Each CELLULE In Range("Nom,C1,Prenom,D7")

Cela marchera aussi, fin j'espère, lol non, je rigole cela marchera

Bonne journée

@Christophe@
 
A

Arnaud

Guest
C'est encore moi

Je vous tiens donc au courant:
ça marche, mais car une fois de plus il y a un mais, je n'arrive pas a avoir le nom défini des cellule dans le msgbox (c'est les références des cellules qui s'affichent).
J'ai essayé de changer la réference Adress par Name mais cela ne me renvoit que le chemin complet des cellules (=nom de la feuille et référence de la cellule)

Je pense qu'il doit y avoir une synthaxe spéciale pour les noms définis mais pour l'instantje séche un peu

@+
Arnaud
 
M

Mytå

Guest
re le forum

mais juste pour preciser

Dim L_deb, L_fin, C_deb, C_fin as Byte 'Pas plus de 255

va juste definir C_fin as Byte

La vrai facon

Dim L_deb as Byte, L_fin as Byte, C_deb as Byte, C_fin as Byte 'Pas plus de 255

Sinon juste la derniere valeur as Byte

Mytå
 
V

Valérie

Guest
Bonjour à tous,

Merci Mytå, les variables me joueront toujours des tours

Rien à ajouter pour les variables quant à afficher un nom je ne sais pas comment faire car le nom n'est pas attribué à une cellule mais affecté au classeur.
La seule chose que je sais faire C placer la liste des noms sur une feuille puis trouver à qui elle correspond mais cela t'impose une feuille ou partie de feuille dédiée à cet exercice

Exemple :
Private Sub CommandButton1_Click()
Dim CELLULE As Range, MESSAGE As String


Worksheets("[g]LaFeuilleDédiée[/g]").Range("A1").ListNames

For Each CELLULE In Range("B8:D11")
If CELLULE = "" Then MESSAGE = MESSAGE &
Worksheets("[g]LaFeuilleDédiée[/g]").Columns("B:B").Find(What:=CELLULE.Name).Offset(0, -1) & ", "
Next

If MESSAGE <> "" Then
MsgBox "La ou les cellules suivantes ne sont pas remplies : " & vbCrLf & Left(MESSAGE, Len(MESSAGE) - 2)
Else
TONCODE
End If
End Sub


Mais il doit y avoir plus simple car c pas super bien que cela fonctionne

@+ et bonne journée
Valérie
 
A

Arnaud

Guest
Bonjour le forum

Merci à tous pour votre aide. En cherchant un peu plus profondement, j'ai trouver la solution pour afficher le nom défini des cellule dans la Msgbox. J'avais essayé de mettre Name à la place de Adress mais en fait il faut mettre Name.Name et ce la marche sans probléme

Bonne journée à tous
@+
Arnaud
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG