Assigner une variable à une cellule sans supprimer son contenu d'origine
Question
Je suis en train de mettre en place une VBA dans Excel pour comparer deux dates pour voir si elles sont identiques. Le problème que j'ai, c'est qu'après avoir affecté la variable de la cellule à "ActualStartDate", tout est supprimé de la cellule. So " ActualStartDate " est assigné correctement, mais supprimé en même temps.
Voici mon code, toute aide serait fantastique. (ce genre de choses est parce qu’il s’agit de références relatives)
Dim ActualStartDate, ProjectedStartDate
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.FormulaR1C1 = ActualStartDate
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = ProjectedStartDate
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Range("A1").Interior.Color = RGB(0, 0, 255)
End If
Lorsqu’il est lancé, il reconnaît que mes dates de test sont identiques et colorie la cellule. Il supprime simplement le contenu de la cellule contenant "ActualStartDate"
.La solution
Tout ce que vous faites est de déplacer une cellule vers le haut, une cellule vers la gauche, et de remplacer la valeur de cette cellule par rien.
Dim ActualStartDate
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.FormulaR1C1 = ActualStartDate
Vous créez la variable ActualStartDate, mais vous ne lui affectez jamais rien. Par conséquent, lorsque vous appliquez la valeur des variables ActualStartDate à une cellule, celle-ci "supprime". la date existante.
Vous voudrez probablement faire quelque chose de plus, même si je ne suis pas sûr des compensations, car je ne sais pas comment vous avez conçu votre feuille de calcul.
Sub Button1_Click()
Dim ActualStartDate, ProjectedStartDate
ActiveCell.Offset(-1, -1).Select
ActualStartDate = ActiveCell.FormulaR1C1
ActiveCell.Offset(1, 0).Select
ProjectedStartDate = ActiveCell.FormulaR1C1
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If
End Sub
Autres conseils
Il est inutile de sélectionner les cellules avant de modifier leur valeur, et FormulaR1C1
est superflu, de même que vous n'entrez pas de plage dans la formule. Ce qui suit devrait faire exactement la même chose, mais je pense qu'il est plus facile à suivre et à déboguer.
** Même remarque que Jim au sujet des compensations, elles ont l’air un peu bizarre, mais pourraient être ce à quoi on s’attend **
Dim ActualStartDate, ProjectedStartDate
ActualStartDate = ActiveCell.Offset(-1, -1)
ProjectedStartDate = ActiveCell.Offset(1, 0)
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If
Déclarer explicitement le type de vos variables comme Date
est également une bonne idée, car elles sont stockées de manière interne en tant que type de données Variant
qui nécessitent plus de mémoire et peuvent conduire à conséquences inattendues car Excel se voit confier la responsabilité de décider comment traiter les données.
Dim ActualStartDate as Date
Dim ProjectedStartDate as Date
ActualStartDate = ActiveCell.Offset(-1, -1)
ProjectedStartDate = ActiveCell.Offset(1, 0)
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If