Intersect Union
lorsque j'insère quelque chose en H11 ou L11 par exemple je devrai avoir la cellule qui se colore alors qu'il ne se produit rien.
ci joint mon fichier http://www.cijoint.fr/cij452076843748.xls
merci pour votre aide
27 réponses
Le fil traite un problème de coloration conditionnelle en VBA lorsque des valeurs sont saisies dans H11 ou L11, mais aucune coloration ne se produit. Plusieurs réponses proposent d'utiliser des techniques de test de plage, notamment Intersect avec des unions de plages comme H11:H28 et L11:L28, et d'éviter les ajustements via des sélections. D'autres évoquent des vérifications de la valeur textuelle « 1 » versus numérique 1, et l'importance de ne pas faire sortir la logique via des sélections répétées. Des échanges soulignent qu'un Exit Sub prématuré peut bloquer la coloration lorsque la logique est répétée, et que la détection correcte passe par Target.Cells(1,1).Value et l'évitement d'erreurs liées à plusieurs cellules.
-
bonjour
je remercie tout particulièrement "le père" pour son aide et sa patience vis à vis du néophite que je suis.
L'on progresse beaucoup plus rapidement de cette manière et des fois, meme avec l'aide VB , on a du mal à trouver les bonnes infos
cdlt -
nos post se sont croisés je pense car j'ai précisé dans le post 26 que j'avais trouvé pour la croix
merci de la lire
cdlt -
Non, mais j'ai mis 30 s à le trouver dans l'aide de VBA
Il FAUT lire les aides de VB
Private Sub UserForm_QueryClose(cancel As Integer, closemode As Integer)
La syntaxe de l'événement QueryClose comprend les éléments suivants :
...
closemode Valeur ou constante indiquant la cause de l'événement QueryClose.
...
vbFormControlMenu 0 L'utilisateur a choisi la commande Fermeture dans le menu Système placé sur l'objet UserForm.
vbFormCode 1 L'instruction Unload est appelée à partir du code.
VbAppWindows 2 La session courante dans l'environnement d'exploitation Windows est en train de s'achever. (Visual Basic 5.0 uniquement.)
VbAppTaskManager 3 Le Gestionnaire de tâches de Windows est en train de fermer l'application. (Visual Basic 5.0 uniquement.)
En pratique, tu es entre les cas 0 ou 1 -
j'ai trouvé la soluce pour la croix donc mes problèmes sont résolus.
http://www.cijoint.fr/cij2099633131150.xls
néanmoins dans un post tu as dis :
"Au passage, au lieu d'utiliser une cellule O1 (visible à l'écran) il vaut mieux utiliser une variable modifiée dans UserForm3 et testée dans Worksheet_Change."
peux tu me faire un topo sur ca pour que j'essaye d'améliorer mon fichier ?
merci d'avance -
bon eh bien je suis arrivé à faire fonctionner l'ensemble comme souhaité .
un seul détail mais je ne connais pas la commande c'est lorsque j'appelle mon userform et dans le cas ou je veux le fermer par la croix je ne reinitialise pas ma cellule à "".
Sais tu à quelle commande l'on fait appel quand on clique sur la croix ?
cordialement
pascal -
ma cellule O1 n'est pas réinitialisée à "vide" à chaque fois
Ben ... réinitialise la !
Au passage, évite d'utiliser des "select" à tour de bras :
Sheets("OP1").Select
Range("O1").Select
ActiveCell.FormulaR1C1 = "1"
C'est bien long alors que Sheets("OP1").Range("O1") = "1" suffit. -
voici mon fichier http://www.cijoint.fr/cij10954421421105.xls
MDP = ADMIN et ADMIN
donc si bon mot de passe ce que j'ai inseré dans la cellule H11(par exemple) reste sinon si mauvais mot de passe on efface ce qu'il y a dans la cellule concernée
mef ma cellule O1 n'est pas réinitialisée à "vide" à chaque fois -
Si, ça peut marcher avec un Userform, je viens de faire l'essai. Le problème n'est pas là, peut être que dans ta cellule O1 tu mets la valeur numérique 1 et non pas le texte "1". Il n'y a a priori aucune raison qu'il ne retrouve pas ton target, et s'il y en a une on doit pouvoir la comprendre. Peux-tu montrer le code intéressant de UserForm3 ?
Au passage, au lieu d'utiliser une cellule O1 (visible à l'écran) il vaut mieux utiliser une variable modifiée dans UserForm3 et testée dans Worksheet_Change. -
merci pour l'info mais je desire garder mon userform (possibilité via un admin de modifier les accès).
mais peut etre que ce que je demande n'est pas possible avec un userform ? -
Si Userform3 sert juste à saisir le mot de passe , tu n'en as pas besoin. Utilise la fonction inputbox
If Target.Cells(1, 1).Value <> "" Then
if inputbox("Entrez le mot de passe : ","MOT DE PASSE")<>"****" then
Target.Cells(1, 1) = ""
( ici peut-être exit sub, ça dépende de ce que tu veux faire...)
end if
End If -
par rapport à mon post 18 , j'ai essayé ceci
If Target.Cells(1, 1).Value <> "" Then
UserForm3.Show
If Range("O1") = "1" Then Target.Cells(1, 1) = ""
End If
visiblement il ne retrouve pas mon target donc mauvaise soluce -
Oui mais à la différence près que dans ce cas quelque soit l'issue du mot de passe bon ou mauvais il me fera un remise à "" de la cellule.
j'ai pensé :
dans le userform: si mauvais MDP alors call sub qui m'insere un 1 dans une cellule dans OP1
puis dans le code OP1 après appel du userform , si cellule = 1 alors cell . value =""
mais peut etre y a t il plus simple ?
pascal -
ne connaissant pas cette subtilité
Moi non plus je ne la connaissais pas. Mais quand VBA m'a dit qu'il ne voulait pas me donner la valeur (.value) d'un range, j'ai demandé dans la fenêtre debug les éléments du range, c'est à a dire target.column, target.row, target.colums.count et target.rows.count, pour vérifier sur quel range il était en train de travailler. Quand j'ai vu qu'il y avait plusieurs cellules, le reste devenait évident.
Question subsidiaire : tu parles de la ligne
If Target.Offset(0, 0).Value <> "" Then If Target.Offset(0, 0).Value <> "" Then UserForm3.Show
d'abord, tu testes 2 fois , je suppose que ça vient d'une recopie malheureuse
partons de
If Target.cells(1, 1).Value <> "" Then UserForm3.Show
pour effacer le contenu erroné, tu as juste à faire
If Target.cells(1, 1).Value <> "" Then
Target.cells(1, 1) = ""
UserForm3.Show
endif -
Merci car enfin ca fonctionne . Je n'aurai jamais trouvé "Remplace systématiquement tous tes Target.Offset(0, 0).Value par Target.Cells(1, 1).Value " ne connaissant pas cette subtilité.
merci pour ton aide précieuse
j'ai une question subsidiaire :
tu as vu que j'utilisai un UserForm pour mon MDP seulement si le test MDP est mauvais, j'aimerai que le target.cells(1,1) retrouve sa valeur initiale c'est à dire "" et je ne sais pas faire
cordialement -
ça a l'ai bien sauf que ...
Target.Offset(0, 0) te renvoie dans un certain nombre de cas un objet range qui fait plus d'une cellule. Dans ce cas, Target.Offset(0, 0).Value ne veut rien dire et provoqie une erreur.
Remplace systématiquement tous tes Target.Offset(0, 0).Value par Target.Cells(1, 1).Value (seulement ceux avec .value )
Remarque : Target.Offset(0, 0) veut dire la même chose que Target, ou alors explique moi la différence -
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MytargetPart1 As Range
Dim MytargetPart2 As Range
Dim MyBigtarget As Range
Dim Mytargetmdp1 As Range
Dim Mytargetmdp2 As Range
Dim MyBigtargetmdp As Range
'If Not condition1 Then
' traitement1
'Else
' préparation traitement 2
' If condition2 Then
' traitement 2
' End If
'End If
Set MytargetPart1 = Union([I11], [I14], [I17], [I20], [I23], [I26], [I41], [I44], [I47], [I50], [I53], [I56], [I71], [I74], [I77], [I80], [I83], [I86], [I101], [I104], [I107], [I110], [I113], [I116])
Set MytargetPart2 = Union([I131], [I134], [I137], [I140], [I143], [I146], [I161], [I164], [I167], [I170], [I173], [I76], [I191], [I194], [I197], [I200], [I203], [I206])
'If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then Exit Sub
If Intersect(Target, Union(MytargetPart1, MytargetPart2)) Is Nothing Then 'Exit Sub
Set Mytargetmdp1 = Union([H11:H28], [H41:H58])
Set Mytargetmdp2 = Union([L11:L28], [L41:L58])
If Intersect(Target, Union(Mytargetmdp1, Mytargetmdp2)) Is Nothing Then Exit Sub
If Target.Offset(0, 0).Value <> "" Then If Target.Offset(0, 0).Value <> "" Then UserForm3.Show
Else
If Target.Offset(0, 0).Value = "X" Or Target.Offset(0, 0).Value = "x" Then Target.Offset(0, 0).Value = "X"
If Target.Offset(0, 0).Value = "X" Then
Target.Offset(0, -4).Resize(3, 4).ClearContents
Target.Offset(0, 1).Resize(3, 4).ClearContents
End If
End If
'End If
End Sub
Plus je me penche dessus moins je vois et si j''enlève le is nothing then c'est mon intersect qui ne fonctionne plus ! -
Il ne s'agit pas de maîtriser les intersect ou tout ce qu'il y a dans les traitements. Ton problème n'est absolument pas à ce niveau.
Il s'agit seulement de comprendre comment le if then else endif détermine quelle partie du programme est ou n'est pas exécutée
Je viens d'essayer ma solution et elle marche.
Qu'est-ce qui selon toi cloche encore ? comment as-tu essayé de l'appliquer ? As-tu bien déterminé ce qui constituait le traitement 1, a préparation au traitement 2 et le traitement 2 ? -
ca parait tellement simple pour toi !!!
bref je n'y arrive pas car je ne maitrise pas mes deux intersect
j'ai bien essaye ta soluce mais ca tourne au vinaigre, il y a toujours quelque chose qui cloche et je tourne en rond.
ca fait une semaine que je suis dessus et c'est rageant
bonne journée quand meme -
Il ne s'agit pas d'essayer plusieurs possibilités, la simple logique permet d'écrire directement la bonne. Il suffit d'un if-then-else
acuellement tu as :
if condition1 then exit sub traitement1 préparation traitement 2 if condition2 then traitement 2 end if
dès que la condition 1 est remplie, le traitement 2 est sûr de ne jamais être exécuté
il suffit de faire
if NOT condition1 then traitement1 else préparation traitement 2 if condition2 then traitement 2 end if endif -
bien sur que si et j'ai essayé plusieurs possibilités mais sans succès et visiblement ce n'est pas si facile que cela car personne ne m'a apporté encore la bonne solution
cordialement
- 1
- 2