À l'aide de Cibles de Reconnaître un Emplacement de Cellule
Je rencontre ce problème une bonne quantité et je suis curieux de savoir si quelqu'un peut me dire pourquoi ou comment je peux écrire un peu plus propre.
Ci-dessous mon code et il fonctionne.
If Target.Row = rTime.Offset(0, 1).Row Then
If Target.Column = rTime.Offset(0, 1).Column Then
cboStatus.Activate
End If
End If
Comment se fait que je ne peux pas l'écrire comme ça?
If Target = rTime.Offset(0, 1) Then
cboStatus.Activate
End If
Si la cible est déjà une plage alors pourquoi ai-je besoin de spécifier l'individu de ligne et de colonne individuelle? Ce second code ne fonctionne pas et j'ai essayé de nombreuses variantes. J'ai même essayé quelque chose comme If Target.Range = range(“C4”) Then
ou If Target.Range = cells(4, 3) Then
, mais aucun de ceux qui ont travaillé. J'ai essayé de nombreuses variantes de trucs similaires. Bien que, je ne veux pas utiliser une gamme spécifique comme A4
, car je voulais utiliser le rTime
comme ce qui est dans l'exemple, mais j'essayais juste de comprendre cela.
Rien ne semble fonctionner, d'autres que la spécification de l'individu de ligne et de colonne à chaque fois. Quelqu'un peut-il expliquer cela à moi? Aussi, est-il une meilleure façon d'écrire ce que ce que j'ai fait dans le premier exemple, qui fonctionne?
Merci pour tout ce qui soulage ma confusion.
OriginalL'auteur Chris | 2013-11-11
Vous devez vous connecter pour publier un commentaire.
La propriété par défaut d'un objet range est
.Value
quand vous ditesIf Target = rTime.Offset(0, 1)
, il sera toujours comparer les valeurs de la plage plutôt que l'adresse de ces plages.Une façon est déjà illustré par L42. Voici une autre manière à l'aide de
Intersect
If Not Intersect(Target, rtime.Offset(0, 1)) Is Nothing Then cboStatus.Activate
MODIFIER
Quand vous dites
Target.Column
etTarget.Row
, vous obtiendrez toujours la première colonne et la première ligne de la cellule de la plage, même siTarget
a plusieurs cellules. Pour éviter cela, utilisez la fonction ci-dessous pour vous assurer que vous avez souhaitéTarget
. Votre code vous donnera des résultats inattendus, même si il ya une seule cellule dansTarget
. Par exemple, dire que la valeur de la celluleB1
est égal à n'importe quelle autre cellule qui est à l'heure actuelletarget
. Donc, si la CelluleB1
= "Sid" et de la CelluleF1
= "Sid" et vous sélectionnez la celluleF1
ensuite, vous recevrez le message "Hello World" de la boîte.Pour xl2003, vous pouvez utiliser un contrôle supplémentaire
Pour xl2007+, remplacer
Target.Cells.Count
avecTarget.Cells.CountLarge
Pour L42
Votre méthode est correcte, mais vous aurez à mettre la case ci-dessus pour obtenir des résultats corrects.
Range("A1:A2")
alors il ne fonctionnera pas puisque comme vous l'avez dit, la propriété par défaut estValue
et plusieurs valeurs ne peuvent pas être comparés tous en même temps? est ma compréhension correcte?nah, j'apprends de vous les gars, tout le temps. 🙂
Je pense que je vais ajouter une chose de plus pour éviter toute confusion... Un moment... mise à jour le post.
Merci à vous deux, vous ne savez pas à qui donner le crédit, étant donné que vous deux ont été utiles. Depuis Sid mis plus d'informations, je vais donner tout le crédit à lui, mais je n'ai marquer à la fois de vous. C'est ce qui explique tant de choses, et de réaliser que j'ai fait de mal pour un long moment maintenant. Il semble que j'ai un peu de feuilles de calcul à faire et correcte, même si ils font un travail.
OriginalL'auteur Siddharth Rout
essayez ceci:
Edit1: Pour couvrir Chis souci
vous ne pouvez pas comparer des objets, les propriétés? Je ne suis pas certains si.
.Address
Vous devriez vraiment utiliser
.Address(, , , TRUE)
juste au cas oùrtime
n'est pas sur le même classeur et de la feuille commeTarget
D'accord. Édité ma réponse pour vous 😀 même si un peu en retard.
OriginalL'auteur L42