Surveiller 2 cellules avec Application.intersect
mod77
Messages postés
1284
Date d'inscription
Statut
Membre
Dernière intervention
-
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je me casse la tête depuis ce matin sur comment surveiller 2 cellules "U3" et "V3" avec la fonction "Application.Intersect" ?
Je réussi à surveiller la première cellule mais pas la 2e.
Comment est-ce possible svp?
Le principe est:
J'ai un tableau dans lequel il y a, en colonne B3 à B106, un nombre (de 1 à 103)
en cellule "U3" j'écris un des nombres dont je cherche les coordonnées en "B" ex:12
en cellule "V3" j'obtiens les coordonnées cherchées. ex:B34
en cellule "W3" j'écris un nombre, peu importe, que je dois mettre en colonne "D" sur la même ligne où a été trouvé le nombre que je cherchais dans la colonne "B" ex:5 dois être placé en "D34".
Voici mon code:
Je me casse la tête depuis ce matin sur comment surveiller 2 cellules "U3" et "V3" avec la fonction "Application.Intersect" ?
Je réussi à surveiller la première cellule mais pas la 2e.
Comment est-ce possible svp?
Le principe est:
J'ai un tableau dans lequel il y a, en colonne B3 à B106, un nombre (de 1 à 103)
en cellule "U3" j'écris un des nombres dont je cherche les coordonnées en "B" ex:12
en cellule "V3" j'obtiens les coordonnées cherchées. ex:B34
en cellule "W3" j'écris un nombre, peu importe, que je dois mettre en colonne "D" sur la même ligne où a été trouvé le nombre que je cherchais dans la colonne "B" ex:5 dois être placé en "D34".
Voici mon code:
Private Sub Worksheet_Change(ByVal Target As Range) 'Lecture par scan
Dim Coord As String
Dim Numlg As Byte
' IDENTIFICATION CELLULE DE LECTURE
If Not Application.Intersect(Target, Range("U3")) Is Nothing Then
'U3:Cellule de Lecture N°Lot, W3: Cellule de Lecture N°Carte
If Target.Address = "$U$3" And IsNumeric(Target.Value) Then
'MARQUAGE DES PRESENCES VIA "U3"
'Coord = adresse contenue en cellule U3
Coord = Range("V3").Value
'Met "VRAI" dans les coordonnées lues
Range(Coord).Value = True
'Se déplace jusqu'à la ligne trouvée
ActiveWindow.ScrollRow = Range(Coord).Row
Range("W3").Select
Else
MsgBox "Saisissez un numéro lot!"
Range("W3").Select 'Retourne en U3
End If
'LECTURE N°CARTE VIA "W3"
If Not Application.Intersect(Target, Range("W3")) Is Nothing Then
If Target.Address = "$W$3" And IsNumeric(Target.Value) Then
'Coord = adresse contenue en cellule U3
'Coord = Range("V3").Value
'Récupération N°Ligne
Numlg = Range("V3").Row
'Affectation "N°Carte" à "N°Lot"
Range("D" & Numlg) = Range("W3").Value
Else
MsgBox "Saisissez un numéro carte!"
Range("W3").Select
End If
End If
End If
End Sub
3 réponses
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
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
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.
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
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...
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
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?!
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.
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 ?
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.
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?
Mais toi tu as écrit :
le problème est que ma variable "Numlg" est vide après la première détection.
comment la gardée?
c'est toujours égal à 3, autant écrire ;
C'est en fait