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
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:


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

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
24 mai 2017 à 17:55
Bonjour,

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
0
mod77 Messages postés 1273 Date d'inscription vendredi 10 juillet 2009 Statut Membre Dernière intervention 14 janvier 2024 53
24 mai 2017 à 18:02
Bonsoir Patrice33740,
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?
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
24 mai 2017 à 18:08
Si ça fonctionne très bien !

Mais toi tu as écrit :
  If Not Application.Intersect(Target, Range("U3")) Is Nothing Then
    '....
    If Not Application.Intersect(Target, Range("W3")) Is Nothing Then
      '....
    End If
  End If
0
mod77 Messages postés 1273 Date d'inscription vendredi 10 juillet 2009 Statut Membre Dernière intervention 14 janvier 2024 53
24 mai 2017 à 18:47
ça ne marche pas!
le problème est que ma variable "Numlg" est vide après la première détection.
comment la gardée?
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
24 mai 2017 à 19:01
Hein ???
Numlg = Range("V3").Row
c'est toujours égal à 3, autant écrire ;
Numlg = 3
0
mod77 Messages postés 1273 Date d'inscription vendredi 10 juillet 2009 Statut Membre Dernière intervention 14 janvier 2024 53
24 mai 2017 à 19:12
oui, je sais, j'ai oublié de le remettre bien. C'était pour les essais.
C'est en fait
   Numlg = Range(Coord).Row 
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
1 juin 2017 à 00:38
Re,

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
0
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
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.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > 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
Re,

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
0
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
j'avais plutôt pensé à un code comme ça:

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...
0
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
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?
0
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
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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
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 :
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

0
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
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?!
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
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.
0
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
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?
0
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
Bonjour,

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 ?
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
8 juin 2017 à 15:08
Bonjour,

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.
0