Surveiller 2 cellules avec Application.intersect
Fermé
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
-
24 mai 2017 à 17:32
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 8 juin 2017 à 15:08
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 8 juin 2017 à 15:08
3 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
24 mai 2017 à 17:55
24 mai 2017 à 17:55
Bonjour,
Comme ceci :
Comme ceci :
If Not Application.Intersect(Target, Range("U3")) Is Nothing Then '.... End If If Not Application.Intersect(Target, Range("W3")) Is Nothing Then '.... End If
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
1 juin 2017 à 00:38
1 juin 2017 à 00:38
Re,
Essaies :
Essaies :
Private Sub Worksheet_Change(ByVal Target As Range) 'Lecture par scan Dim Coord As String Dim Numlg As Byte 'W3:Cellule de Lecture N°Lot, U3: Cellule de Lecture N°Carte If Not Application.Intersect(Target, Range("U3")) Is Nothing Then If Not IsNumeric(Range("W3").Text) Then 'Effacer U3 et W3 Application.EnableEvents = False Range("U3").ClearContents Range("W3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select MsgBox "Saisissez un numéro lot !" Else If Not IsNumeric(Range("U3").Text) Then 'Effacer U3 Application.EnableEvents = False Range("U3").ClearContents Application.EnableEvents = True 'Sélectionner U3 Range("U3").Select MsgBox "Saisissez un numéro carte !" Else 'Affectation "N°Carte" Coord = Range("V3").Value Range(Coord) = Range("U3").Value 'Affectation "VRAI" Coord = Range("V1").Value Range(Coord).Value = True 'Effacer U3 et W3 Application.EnableEvents = False Range("U3").ClearContents Range("W3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select End If End If End If If Not Application.Intersect(Target, Range("W3")) Is Nothing Then If Not IsNumeric(Range("W3").Text) Then 'Effacer W3 et U3 Application.EnableEvents = False Range("W3").ClearContents Range("U3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select MsgBox "Saisissez un numéro lot !" Else Application.EnableEvents = False Range("U3").ClearContents Application.EnableEvents = True Range("U3").Select End If End If End Sub
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
1 juin 2017 à 09:34
1 juin 2017 à 09:34
Merci Patrice33740,
ça fonctionne bien! je pensais que ça allait planter car au début je vois que tu attribue V3 à coord alors que tu n'as pas encore le n°lot (w3). Mais le else fait que ça te renvoie sur la lecture de w3 justement, pour que l'écriture se fasse dans le bon ordre. Donc ça marche.
C'est ce que je n'arrivais pas à faire et je n'y serais pas arrivé c'est déjà bien complexe comme gymnastique d'esprit.
J'ai cependant continué à y réfléchir en créant un formulaire de saisie que je trouve plus simple mais j'ai séché sur l'exploitation de mes lignes tampon du poste 15.
Car le fait d'écrire dans les cellules U3 et W3 via des zones textes ne fait pas changer les valeurs des cellules V1 et V3. Du coup je suis obligé de traduire mes fonctions de recherche, sur feuille en V1 et V3, en code VBA mais je ne sais pas faire.
Si tu sais n'hésite pas ! mais je garde ton code quand même merci.
ça fonctionne bien! je pensais que ça allait planter car au début je vois que tu attribue V3 à coord alors que tu n'as pas encore le n°lot (w3). Mais le else fait que ça te renvoie sur la lecture de w3 justement, pour que l'écriture se fasse dans le bon ordre. Donc ça marche.
C'est ce que je n'arrivais pas à faire et je n'y serais pas arrivé c'est déjà bien complexe comme gymnastique d'esprit.
J'ai cependant continué à y réfléchir en créant un formulaire de saisie que je trouve plus simple mais j'ai séché sur l'exploitation de mes lignes tampon du poste 15.
Car le fait d'écrire dans les cellules U3 et W3 via des zones textes ne fait pas changer les valeurs des cellules V1 et V3. Du coup je suis obligé de traduire mes fonctions de recherche, sur feuille en V1 et V3, en code VBA mais je ne sais pas faire.
Si tu sais n'hésite pas ! mais je garde ton code quand même merci.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
>
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
1 juin 2017 à 13:23
1 juin 2017 à 13:23
Re,
Le même code sans utiliser V1 et V3 :
Le même code sans utiliser V1 et V3 :
Private Sub Worksheet_Change(ByVal Target As Range) 'Lecture par scan Dim cel As Range 'W3:Cellule de Lecture N°Lot, U3: Cellule de Lecture N°Carte If Not Application.Intersect(Target, Range("U3")) Is Nothing Then If Not IsNumeric(Range("W3").Text) Then 'Effacer U3 et W3 Application.EnableEvents = False Range("U3").ClearContents Range("W3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select MsgBox "Saisissez un numéro lot !" Else If Not IsNumeric(Range("U3").Text) Then 'Effacer U3 Application.EnableEvents = False Range("U3").ClearContents Application.EnableEvents = True 'Sélectionner U3 Range("U3").Select MsgBox "Saisissez un numéro carte !" Else Set cel = Range("C4:C106").Find(Range("W3").Value, , xlValues, xlWhole) If cel Is Nothing Then Set cel = Range("C107") 'Affectation "N°Carte" cel.Offset(0, 1).Value = Range("U3").Value 'Affectation "VRAI" cel.Offset(0, -1).Value = True 'Effacer U3 et W3 Application.EnableEvents = False Range("U3").ClearContents Range("W3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select End If End If End If If Not Application.Intersect(Target, Range("W3")) Is Nothing Then If Not IsNumeric(Range("W3").Text) Then 'Effacer W3 et U3 Application.EnableEvents = False Range("W3").ClearContents Range("U3").ClearContents Application.EnableEvents = True 'Sélectionner W3 Range("W3").Select MsgBox "Saisissez un numéro lot !" Else Application.EnableEvents = False Range("U3").ClearContents Application.EnableEvents = True Range("U3").Select End If End If End Sub
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
1 juin 2017 à 22:50
1 juin 2017 à 22:50
j'avais plutôt pensé à un code comme ça:
et ça pour une zone texte de mon formulaire:
Et ça bugg sur la ligne en gras a cause du guillemet devant B107.
Mais ton code est plus simple encore.
j'essaie et reviens...
Range("V1").FormulaR1C1 = "=SI(ESTNA(RECHERCHEV(W3;C4:C106;1;0));"B107";CONCATENER("B";EQUIV(W3;C4:C106;0)+3))"
et ça pour une zone texte de mon formulaire:
Private Sub TextBox2_Change() 'Entrée du N° Lot
Dim Coord As String
Range("W3").Value = TextBox2 'N°Lot
Range("U3").Value = TextBox1 'N°Carte
Range("V1").FormulaR1C1 = "=SI(ESTNA(RECHERCHEV(W3;C4:C106;1;0));"B107";CONCATENER("B";EQUIV(W3;C4:C106;0)+3))"
'MARQUAGE DES PRESENCES
'Coord = adresse N°Lot en cellule V1
Coord = Range("V1").Value
'Coche "Présent" le Lot selon coordonnée lue
Range(Coord).Value = True
'ATTRIBUTION N°CARTE
'Coord = adresse N°Carte en cellule V3
Coord = Range("V3").Value
Range(Coord).Value = Range("U3").Value
'Se déplace jusqu'à la ligne du présent
' ActiveWindow.ScrollRow = Range(Coord).Row
End Sub
Et ça bugg sur la ligne en gras a cause du guillemet devant B107.
Mais ton code est plus simple encore.
j'essaie et reviens...
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
1 juin 2017 à 22:57
1 juin 2017 à 22:57
Bon, ça ne va pas.
J'ai créé un bouton à bascule pour ouvrir mon formulaire. Sur ce dernier il y a 2 textbox
chargées de capturer le N°lot et N°carte.
Mais avec ton nouveau code le formulaire s'ouvre lit 1 valeur et se ferme sans rien faire d'apparent. Why?
J'ai créé un bouton à bascule pour ouvrir mon formulaire. Sur ce dernier il y a 2 textbox
chargées de capturer le N°lot et N°carte.
Mais avec ton nouveau code le formulaire s'ouvre lit 1 valeur et se ferme sans rien faire d'apparent. Why?
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
1 juin 2017 à 23:05
1 juin 2017 à 23:05
Je pense que le pb venait du fait d'avoir séparé les saisies de U3 et W3 car maintenant je les saisis ensemble dans textbox2 et ça marche
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
2 juin 2017 à 16:25
2 juin 2017 à 16:25
Bonjour,
C'est qui NHenry ?
0) Hide masque le formulaire mais il ne le décharge pas.
1) Je ne connait pas OOoBasic mais dans le 2 cas if faut réadapter le programme aux Objets d'OOo à la place de ceux d'Excel
2) Comme ça :
C'est qui NHenry ?
0) Hide masque le formulaire mais il ne le décharge pas.
1) Je ne connait pas OOoBasic mais dans le 2 cas if faut réadapter le programme aux Objets d'OOo à la place de ceux d'Excel
2) Comme ça :
Private Sub tbxCarte_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim rng As Range Dim cel As Range Set rng = Range("C4", Cells(Rows.Count, "C").End(xlUp)) If Val(tbxLot.Value) <> 0 And Val(tbxCarte.Value) <> 0 Then Set cel = rng.Find(tbxLot.Value, , xlValues, xlWhole) If cel Is Nothing Then Set cel = Cells(rng.Row + rng.Rows.Count, "C") cel.Offset(0, 1).Value = tbxCarte.Value cel.Offset(0, -1).Value = True End If NoEvents = True tbxLot.Text = "" tbxCarte.Text = "" NoEvents = False tbxLot.SetFocus End Sub
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
2 juin 2017 à 17:36
2 juin 2017 à 17:36
Décidément je suis à la masse :-( Excuse moi Patrice33740.
NHenry m'a répondu à un autre poste ;-)
Et merci pour tes explications.
J'ai compris que tbxCarte_Exit fait la recherche ;-) mais la méthode pour saisir le N°Carte et N°Lot , je ne la connaissais pas. Merci
Pour la 2: Même si je ne sais pas comment faire, est-ce que l'utilisation d'une variable globale (derCol) ne serait pas meilleure ?
Car sinon je vais devoir chercher dans toutes les lignes de code la 1ere cellule vide de la colonne C. Alors qu'une fois qu'elle est connue il ne reste plus qu'à l'affecter (elle ne changera plus), non?!
NHenry m'a répondu à un autre poste ;-)
Et merci pour tes explications.
J'ai compris que tbxCarte_Exit fait la recherche ;-) mais la méthode pour saisir le N°Carte et N°Lot , je ne la connaissais pas. Merci
Pour la 2: Même si je ne sais pas comment faire, est-ce que l'utilisation d'une variable globale (derCol) ne serait pas meilleure ?
Car sinon je vais devoir chercher dans toutes les lignes de code la 1ere cellule vide de la colonne C. Alors qu'une fois qu'elle est connue il ne reste plus qu'à l'affecter (elle ne changera plus), non?!
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
2 juin 2017 à 21:13
2 juin 2017 à 21:13
Pour la 2 :
Pas besoin de derCol (ou plutôt de DerLig) car avec :
Set rng = Range("C4", Cells(Rows.Count, "C").End(xlUp))
rng représente la plage de cellules utilisées
On obtient la cellule suivante (vide) avec:
Set cel = Cells(rng.Row + rng.Rows.Count, "C")
Ce code fonctionne quelque soit le nombre de cellules utilisées et même si tu ajoutes des valeurs à la liste.
Pas besoin de derCol (ou plutôt de DerLig) car avec :
Set rng = Range("C4", Cells(Rows.Count, "C").End(xlUp))
rng représente la plage de cellules utilisées
On obtient la cellule suivante (vide) avec:
Set cel = Cells(rng.Row + rng.Rows.Count, "C")
Ce code fonctionne quelque soit le nombre de cellules utilisées et même si tu ajoutes des valeurs à la liste.
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
Modifié le 2 juin 2017 à 21:37
Modifié le 2 juin 2017 à 21:37
D'accord!
Je dois donc toujours passer par la recherche de la dernière cellule pleine.
Car rng est locale!
Je ne peux pas sauvegarder pour l'ensemble du classeur la taille de ma colonne ? ou plutôt est-ce que je peux?
Je dois donc toujours passer par la recherche de la dernière cellule pleine.
Car rng est locale!
Je ne peux pas sauvegarder pour l'ensemble du classeur la taille de ma colonne ? ou plutôt est-ce que je peux?
mod77
Messages postés
1273
Date d'inscription
vendredi 10 juillet 2009
Statut
Membre
Dernière intervention
14 janvier 2024
53
8 juin 2017 à 13:17
8 juin 2017 à 13:17
Bonjour,
je reviens avec une adaptation de code que je n'arrive pas à comprendre et faire. Voici:
1) A quoi sert "NoEvents" ?
2) Pourquoi on passe de "tbLot.text" à "tbLot.value" ? quelle est la différence?
3) En gras: Si le nombre "tbLot1" que je rentre est le même que celui de ma ligne en colonne "C" alors je dois afficher un message et effacer "tbLot1".
Mais le programme ne passe pas par là il sort. pourquoi ?
je reviens avec une adaptation de code que je n'arrive pas à comprendre et faire. Voici:
Private Sub tbLot1_Change() 'Entrée du n° Lot
If NoEvents Then Exit Sub
If Not IsNumeric(tbLot1.Value) Then
NoEvents = True
If Len(tbLot1.Text) > 1 Then
tbLot1.Text = Left(tbLot1.Text, Len(tbLot1.Text) - 1)
If tbLot1.Value = Range("C" & ActiveCell.Row).Value Then
MsgBox " impossible !"
tbLot1.Text = ""
End If
Else
tbLot1.Text = ""
End If
NoEvents = False
End If
End Sub
1) A quoi sert "NoEvents" ?
2) Pourquoi on passe de "tbLot.text" à "tbLot.value" ? quelle est la différence?
3) En gras: Si le nombre "tbLot1" que je rentre est le même que celui de ma ligne en colonne "C" alors je dois afficher un message et effacer "tbLot1".
Mais le programme ne passe pas par là il sort. pourquoi ?
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
8 juin 2017 à 15:08
8 juin 2017 à 15:08
Bonjour,
1) Lorsque NoEvents est défini à True, la procédure n'est pas exécutée :
2) Dans un TextBox, il y a peu de différence : Value est de type Variant et Text de type String
3) Comme son nom l'indique, l'évènement change se produit chaque fois que le contenu du textbox change, c'est à dire après chaque appui sur une touche.
Ton test n'est pas dans le bon évènement, pour tester le contenu final du textbox tu dois le mettre dans l'évènement Exit.
1) Lorsque NoEvents est défini à True, la procédure n'est pas exécutée :
If NoEvents Then Exit Sub. Dans la procédure, NoEvents est défini à True avant de modifier tbLot1, i.e avant
tbLot1.Text = ""car cette instruction va provoquer l'évènement tbLot1_Change() et donc provoquer un nouvel appel de la procédure alors que celle-ci n'est pas terminée.
2) Dans un TextBox, il y a peu de différence : Value est de type Variant et Text de type String
3) Comme son nom l'indique, l'évènement change se produit chaque fois que le contenu du textbox change, c'est à dire après chaque appui sur une touche.
Ton test n'est pas dans le bon évènement, pour tester le contenu final du textbox tu dois le mettre dans l'évènement Exit.
24 mai 2017 à 18:02
merci de votre aide mais cela ne fonctionne pas :-(
j'ai essayé aussi avec select case mais pas mieux!
est-ce que mon code tient la route svp?
24 mai 2017 à 18:08
Mais toi tu as écrit :
24 mai 2017 à 18:47
le problème est que ma variable "Numlg" est vide après la première détection.
comment la gardée?
24 mai 2017 à 19:01
c'est toujours égal à 3, autant écrire ;
24 mai 2017 à 19:12
C'est en fait