Присваивание ячейке переменной без удаления ее исходного содержимого
Вопрос
Я настраиваю некоторый VBA в Excel для сравнения двух дат, чтобы увидеть, совпадают ли они.Проблема, с которой я сталкиваюсь, заключается в том, что после присвоения переменной ячейки значения "ActualStartDate" она удаляет все из ячейки.Таким образом, "ActualStartDate" присваивается правильно, но в то же время удаляется.
Вот мой код, любая помощь была бы фантастической.(этот материал activecell связан с тем, что все это относительные ссылки)
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
Когда он запускается, он распознает, что даты моих тестов совпадают, и раскрашивает ячейку.Он просто удаляет содержимое ячейки, содержащей "ActualStartDate".
Решение
Все, что при этом делается, - это перемещение на одну ячейку вверх, на одну ячейку влево и замена значения этой ячейки на ничто.
Dim ActualStartDate
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.FormulaR1C1 = ActualStartDate
Вы создаете переменную ActualStartDate, но никогда ничего ей не присваиваете.Итак, когда вы применяете значение переменной ActualStartDate к ячейке, оно "удаляет" существующую дату.
Вероятно, вы хотите сделать что-то более похожее на это, хотя я не уверен насчет смещений, потому что я не знаю, как вы разработали свою электронную таблицу.
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
Другие советы
Выделение ячеек перед изменением их значения не требуется, и FormulaR1C1
это излишне, так как вы не вводите диапазон в формулу.Следующее должно делать точно то же самое, но, я думаю, его легче отслеживать и отлаживать.
** То же предостережение, что и у Джима по поводу смещений, они выглядят немного странно, но могут быть тем, что задумано **
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
Явное объявление типа ваших переменных как Date
это также хорошая идея, поскольку в противном случае они хранятся внутри в виде Variant
типы данных, которые требуют больше памяти и могут привести к неожиданным последствиям, поскольку ответственность за принятие решения о том, как обращаться с данными, ложится на Excel.
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