Несоблюдение правил проверки данных во время события копирования и вставки в Excel - PullRequest
0 голосов
/ 24 января 2019

В этом листе с макросами у меня есть данные для проверки столбцов, где я хочу регулировать ввод данных. Проблема, с которой я здесь сталкиваюсь, заключается в том, что, учитывая сценарий, когда клиент желает скопировать данные из другого файла Excel. Реализуя этот сценарий, я скопировал некоторые данные из иностранного Excel в свой лист с проверкой данных. У меня есть столбец, в который пользователь может ввести только длину текста меньше 9, но когда я копирую данные, скажем, длина текста больше 9, в таких сценариях не появляется сообщение об ошибке. Есть ли обходной путь, который поможет мне преодолеть эту ситуацию?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Обходной путь, поскольку проверка данных не работает с копированием / вставкой

Удалите проверку данных 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"))

… и теперь правила будут придерживаться именованного диапазона, и вы можете вставлять и перемещать диапазоны, как вам нравится.

0 голосов
/ 24 января 2019

Это известная проблема с Excel. Проверка данных не работает, если пользователь вставляет значение в ячейку.

Что вы можете сделать, однако, это смягчить против вставки, по крайней мере, с помощью Ctrl + v. Введите следующее в модуль ThisWorkbook в редакторе VBA:

Private Sub Workbook_Activate()
    Application.OnKey "^v", ""
End Sub
 
Private Sub Workbook_Deactivate()
    Application.OnKey "^v"
End Sub

Это позволяет сделать так, чтобы при активации книги Ctrl + v не выполнял никаких действий. Затем, если вы работаете с несколькими рабочими книгами и хотите использовать Ctrl + v в другом месте, при деактивации этой книги поведение сбрасывается до нормального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...