Основной выпуск:
Вы Select
участвуете в событии Worksheet_Change
.
Range("C" & cRow & ":O" & cRow).Select
Selection.Copy
Это снова вызывает событие Selection_Change
, перезаписывая oldValue
.
Нет необходимости Select
здесь. См. Как избежать использования Select в Excel VBA .
Range("C" & cRow & ":O" & cRow).Copy
Вторичный (но все еще очень важный вопрос):
В вашей исходной версии изменения выбора:
Dim oldValue As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target.Value
End Sub
Это приведет к ошибке несоответствия типов, если Target
не содержит String
или что-то, что может быть приведено к String
.
В вашем случае это было потому, что Target
на самом деле было несколькими ячейками: Range("C" & cRow & ":O" & cRow)
.
Но ваш код также выдаст ошибку, если вы выберете ячейку со значением ошибки (#N/A
, #DIV/0
и т. Д.).
Исправление:
Прежде всего, избегайте использования Select
, как уже отмечалось.
Если по какой-либо (редкой) причине вам абсолютно необходимо Select
, то включайте и выключайте события:
Private Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
... do your stuff
Application.EnableEvents = True
End Sub
Наконец, при изменении выбора вместо того, чтобы предполагать, что вы выберете только строку или только одну ячейку, добавьте некоторую проверку.
Dim oldValue As Variant
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge <> 1 Then Exit Sub ' ignore a multi-cell selection
If IsError(Target.Value) Then Exit Sub ' ignore selection of errors
oldValue = Target.Value
End Sub