首页 > 解决方案 > VBA - 数据验证空单元格

问题描述

我在 excel 中创建了命名范围,范围的命名基于 sheet2 上的键值。现在我在另一个 sheet1 上创建了下拉列表,使用公式 - INDIRECT,再次基于 key,在 sheet1 上。如何在下拉列表中添加空白/特殊符号?我无法在工作表上的已排序项目之间添加空单元格。表2: 在此处输入图像描述

我有 2 个基于 MAT/AE 列的命名范围,第一个是 C2:C4 的范围,下一个是 C5:C6。

在此处输入图像描述

我有 Sheet1,我使用数据验证,使用公式 INDIRECT 连接 MAT1&AE11,并且我有基于 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

间接公式:

在此处输入图像描述

第一个命名范围的定义:

在此处输入图像描述

标签: vbaexcel

解决方案


如果列表在Range("A1:A10")这就是如何实现只有一个空位置的验证列表:

在此处输入图像描述

使用以下代码:

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()。验证公式准备好后,Chr(160)将其添加到其中,以确保我们也有可用的空单元格。

它甚至可以像这样添加:validationFormula = Chr(160) & "," & validationFormula,如果您需要将它放在第一个位置:

在此处输入图像描述

一旦validationFormula字符串准备好,我们就可以让自己写.IgnoreBlank = True,只要列表中只有一个空白——我们需要的那个。

归功于这个人,因为循环的想法 - https://superuser.com/questions/1254754/data-validation-from-2-lists-excel-2010


推荐阅读