Как реализовать динамическую проверку данных, например, в качестве VBA-функции Excel? - PullRequest
0 голосов
/ 01 апреля 2019

Проверка данных в Excel - полезный способ проверки ввода пользователя в Excel. Стандартным способом является (1) где-то определить (например, на вспомогательном листе) список с возможными входными значениями и (2) затем выбрать этот диапазон в поле Source. Кроме того, можно также напрямую ввести различные параметры в этом поле, например:

Excel Data Validatio Dialog Window

Мой вопрос: Как нам сделать список проверки данных динамическим?

До сих пор я пытался ввести формулу (возможно, определяемую пользователем VBA), возвращающую список строк в поле Source диалогового окна проверки данных, например

=INDEX({"New","Mint","Very Good","Good","Acceptable","Poor"},{1,RANDBETWEEN(1,6)})

Однако этот подход не работает, так как приводит к сообщению об ошибке

Вы не можете использовать ссылочные операторы (такие как объединения, пересечения, и диапазоны) или константы массива для критериев проверки данных.

Что мне не хватает? Какой (возможно, более элегантный) способ сделать динамическую проверку данных Source вы предлагаете?

Редактировать: Моя конкретная проблема:

На всех (кроме первой) вкладках у меня есть ячейка с именем myTest, и список допустимых значений предназначен для ячейки на первой вкладке, где я хочу иметь возможность из списка, составленного из всех возможных значений myTest.

Ссылка:

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вы можете использовать что-то подобное в модуле кода первого листа:

Private Sub Worksheet_Activate()

    Const LIST_COL As Long = 26
    Dim sht As Worksheet, i As Long

    i = 1
    Me.Columns(LIST_COL).ClearContents       '<< clear current list
    For Each sht In ThisWorkbook.Worksheets  '<< collect all the values
        If sht.Name <> Me.Name Then            
            Me.Cells(i, LIST_COL).Value = sht.Range("myTest").Value
            i = i + 1
        End If
    Next sht

End Sub

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

Примечание: если значения другого листа обновляются с помощью кода или формул (т. Е. Вам не нужно переходить на каждый лист для изменения значений), вам потребуется проделать немного больше работы.


РЕДАКТИРОВАТЬ - это более запутанный, но работает более надежно, так как он запускается всякий раз, когда вы нажимаете на раскрывающийся список проверки

1. Поместите это в обычныймодуль (при необходимости измените):

'A function to return a range containing the 
'  various values which need to appear in the validation list
Public Function ListCompile() As Range

    Const LIST_COL As Long = 26      '<< create the list in Col Z
    Dim sht As Worksheet, i As Long

    i = 1
    Sheet1.Columns(LIST_COL).ClearContents
    For Each sht In ThisWorkbook.Worksheets
        If sht.Name <> Sheet1.Name Then
            Sheet1.Cells(i, LIST_COL).Value = sht.Range("myTest").Value
            i = i + 1
        End If
    Next sht
    'return the list we just created
    Set ListCompile = Sheet1.Cells(1, LIST_COL).Resize(i, 1)
End Function

Примечание. Я использую кодовое имя для Sheet1 (которое может отличаться от имени вкладки).Вы можете увидеть кодовое имя в редакторе VB Project Explorer.

2. Определить именованный диапазон "tester" с "RefersTo", равным ListCompile()

3. Наконец, установите диапазон списка проверки данных: =tester

0 голосов
/ 01 апреля 2019

Предполагая, что:

  • Ваш список находится в столбце A
  • Нет заголовка

Вы можете выполнить проверку данных с помощью динамического списка, используя эту формулу в качестве источника:

=OFFSET(A1,0,0,COUNTA(A:A),1)

Редактировать: ниже приведено изображение примера, использующего формулу выше при проверке данных, примененной к ячейке B1:

enter image description here

Если вы можете каким-то образом объединить ваши значения в один столбец, это возможно.

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