Обходной путь, поскольку проверка данных не работает с копированием / вставкой
Удалите проверку данных Excel и замените ее собственной проверкой - это может решить вашу проблему.
Это позволяет вам выполнять свои собственные проверки. И если были вставлены недействительные данные, мы просто .Undo
действие вставки. Таким образом, могут быть вставлены только полностью действительные данные.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim AffectedCells As Range
Dim Cell As Range
'rule 1: column A allows only text length <=9
Set AffectedCells = Intersect(Target, Target.Parent.Range("A:A"))
If Not AffectedCells Is Nothing Then
For Each Cell In AffectedCells
If Not Len(Cell.Value) <= 9 Then 'check length of each cell
MsgBox "The data """ & Cell.Value & """ inserted in " & Cell.Address & " in column A was longer than 9. We undo!", vbCritical
Application.Undo 'undo insert
Exit Sub 'stop checking after one invalid data was found.
End If
Next Cell
End If
'rule 2: column B allows only …
'Set AffectedCells = Intersect(Target, Target.Parent.Range("B:B"))
'If Not AffectedCells Is Nothing Then
'to be continued as above …
End Sub
Обратите внимание, что приведенное выше решение имеет один большой недостаток
Диапазоны проверки жестко закодированы в коде VBA. Например, если вы задали правило проверки для столбца C, а затем вставили столбец перед этим столбцом C, он переместится в D, но правила проверки все еще будут применяться к C.
Чтобы избежать этой проблемы, вы можете использовать Именованные диапазоны вместо жестко закодированных диапазонов. Таким образом, вы определяете диапазон в вашем листе и, например. назовите его Rule1
(лучше выбрать значимое имя вместо правил нумерации). Например, отметьте столбец C и дайте ему имя.
Тогда вы можете использовать это имя в ...
Set AffectedCells = Intersect(Target, Target.Parent.Range("Rule1"))
… и теперь правила будут придерживаться именованного диапазона, и вы можете вставлять и перемещать диапазоны, как вам нравится.