VBA - проверка данных пустая ячейка - PullRequest
0 голосов
/ 30 апреля 2018

Я создал именованные диапазоны в Excel, присвоение имен диапазонам основано на ключевых значениях на листе2. Теперь я создал выпадающий список на другом листе 1, с использованием формулы - INDIRECT, снова на основе ключа, на листе 1. Как добавить пустой / специальный символ в выпадающий список? Я не могу добавить пустую ячейку между отсортированными элементами на листе. Лист2: enter image description here

У меня есть 2 именованных диапазона, основанных на столбцах MAT / AE, первый - диапазон C2: C4, а следующий - C5: C6.

enter image description here

И у меня есть Sheet1, я использую проверку данных, объединяю MAT1 и AE11 по формуле INDIRECT, и у меня есть значения, основанные на диапазонах из Sheet2.

ТАК мой вопрос, как добавить пустой / специальный символ в этот список?

Код для диапазонов:

    Sub Start()

lf_index_row = 1
lf_name_space_row = 2

gf_namespace = ""

Do

lf_index_row = lf_index_row + 1

lf_material = Sheets(gc_data).Cells(lf_index_row, 1)
lf_location = Sheets(gc_data).Cells(lf_index_row, 2)

gf_new_namespace = "X" & lf_material & lf_location

If gf_new_namespace = "X" Then
 If gf_namespace = "" Then
    End
 Else
    'create namespace
    Set lf_range = Range(Cells(lf_start_number, 3), Cells(lf_end_number, 3))
    lf_range.Select
    Range(Cells(lf_start_number, 3), Cells(lf_end_number, 3)).Select
    ActiveWorkbook.Names.Add Name:=gf_namespace, RefersTo:=lf_range
    End
 End If
End If
If gf_namespace <> gf_new_namespace Then
    If gf_namespace = "" Then
        'initialize newnamespace
        gf_namespace = gf_new_namespace
        lf_start_number = lf_index_row
        lf_end_number = lf_index_row
    Else
        'create namespace
        Set lf_range = Range(Cells(lf_start_number, 3), Cells(lf_end_number, 3))
        lf_range.Select
        Range(Cells(lf_start_number, 3), Cells(lf_end_number, 3)).Select
        ActiveWorkbook.Names.Add Name:=gf_namespace, RefersTo:=lf_range
        'initialize newnamespace
        gf_namespace = gf_new_namespace
        lf_start_number = lf_index_row
        lf_end_number = lf_index_row
    End If
Else
    lf_end_number = lf_index_row
End If

Loop

End Sub

Косвенная формула:

enter image description here

Определение первого именованного диапазона:

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Если список находится в Range("A1:A10"), то как получить список проверки только с одной пустой позицией:

enter image description here

со следующим кодом:

Sub TestMe()

    Dim list1               As Range
    Dim validationFormula   As String

    Set list1 = Range("A1:A10")

    Dim myCell As Range
    For Each myCell In list1
        If Not IsEmpty(myCell) Then
            validationFormula = validationFormula & myCell.Value2 & ","
        End If
    Next

    validationFormula = validationFormula & Chr(160)

    With Range("B5").Validation
        .Delete
        .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=validationFormula
        .IgnoreBlank = False
        .InCellDropdown = True
    End With

End Sub

В чем идея кода? Строка проверки выполняется в validationFormula путем объединения всех ячеек, которые Not IsEmpty(). Как только validationFormula готова, к ней добавляется Chr(160), чтобы убедиться, что у нас также есть пустая ячейка.

Его можно добавить даже так: validationFormula = Chr(160) & "," & validationFormula, если вам нужно, чтобы он был на первой позиции:

enter image description here

Как только строка validationFormula подготовлена, мы можем позволить себе написать .IgnoreBlank = True, поскольку в списке есть только один пробел - тот, который нам нужен.

Кредиты этому парню, за идею цикла - https://superuser.com/questions/1254754/data-validation-from-2-lists-excel-2010

0 голосов
/ 30 апреля 2018

Проверьте, не заполнена ли ячейка со значением строки = 3 и значением столбца = 4 со следующим:

Set objExcel = CreateObject("Excel.Application")
Set excelInput = objExcel.Workbooks.Open("myfile")
If excelInput.Sheets("Sheet1").Cells(3, 4) <> vbNullString Then
    'do the thing
End If

Приведенный выше код VBScript, но он должен работать. Если нет, то он почти идентичен в VBA.

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