1

Чтобы повторно инициализировать дочерний выпадающий список (выпадающий список 2 в зависимости от выбора, сделанного в раскрывающемся списке 1), у меня есть следующий код в "ThisWorkbook".

Предполагается очистить содержимое дочернего раскрывающегося списка, если ячейка из определенного диапазона (где находится раскрывающийся список 1) изменяется. Он отлично работает на листе, где существует это имя диапазона (имя диапазона "RSTcabFINISHING").

ВОПРОС

на любом другом листе (= листе, где это имя диапазона не существует) этот код очищает содержимое любых трех ячеек прямо в ячейке, в которой я изменяю содержимое.

Решение было бы поместить код только на лист, который нуждается в этом, я полагаю. Но (скажите мне, если я ошибаюсь), выглядит более разумным поместить код в "ThisWorkbook", так как лист с диапазоном, описанным выше, подлежит умножению (= copy) ...

не уверен, что все это имеет смысл ... Я предполагаю, что вопрос заключается в том, «что я должен сделать, чтобы избежать очистки этого контента где-то еще, чем я хочу?».

Спасибо!

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Initialize cabinet finishing board
On Error Resume Next
If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, 1).Resize(, 3).ClearContents
End If

Exit Sub
End Sub

1 ответ1

0

Итак, ваша проблема связана с использованием On Error Resume Next .

  1. Ваша инструкция if выдаст ошибку, если диапазон не существует. Это означает, что он не будет оцениваться, и вместо этого вы переходите к следующей строке из-за возобновления следующего.

  2. Теперь это отключит события. Таким образом, ваше событие будет срабатывать только один раз, так как вы, кажется, никогда не включаете его снова.

  3. Теперь он очистит все содержимое, даже не проверив, что ваше пересечение действительно.

Итак, нам нужно сделать две вещи:

  1. Исправьте оценку
  2. Отказ от заявки.EnableEvents = false или, по крайней мере, исправить это. Большинство событий генерирует только пользователь, вносящий изменения, а не сценарий VBA, поэтому вы, вероятно, можете полностью это игнорировать.

Лучший способ исправить это - вызвать более безопасную функцию, которая проверяет существование диапазона и возвращает true или false в зависимости от этого результата.

Нечто подобное может быть более полезным для вас:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Initialize cabinet finishing board
    If RangeExists("RSTcabFINISHING") Then          'See below for what this does. We only progress if we get true.
        If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
            Target.Offset(0, 1).Resize(, 3).ClearContents
        End If
    End If
End Sub

Function RangeExists(RangeName As String)
    On Error GoTo NotValid:             'If we fail, jump to "NotValid"
    If Range(RangeName).Rows >= 0 Then  'Test if the range exists - if it doesn't we'll get an error, if it does it
                                        'will have 0 or more rows
        RangeExists = True              'We didn't error and we do have 0 or more rows, so the function is true
    End If
    Exit Function                       'Break out of the function before we hit our error handler
NotValid:                               'We only get this far if an error was thrown (Range doesn't exist)
    RangeExists = False                 'Flag the function as false before returning
End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .