【问题标题】:VBA - Data validation empty cellVBA - 数据验证空单元格
【发布时间】:2018-10-10 12:29:36
【问题描述】:

我在 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

间接公式:

第一个命名范围的定义:

【问题讨论】:

  • 你能去掉Igonre blank的复选标记吗?
  • 我可以删除它,但它不起作用,因为在我的范围内没有空格
  • 那你想做什么?不修改 Sheet2 上的范围,而是直接在下拉列表中添加一个或多个值?可能是动态的?为什么不能将特殊字符放在指定范围内?
  • 如果我在下拉列表中使用公式 INDIRECT,我该如何添加它们,可能有什么我不知道的吗?
  • 我仍然不清楚你的意图是什么。您想在数据验证下拉列表中增加一行,对吗?这个额外的行应该包含什么?没有?特殊字符(哪些)?而且您不能将这些添加到您现有的命名范围(为什么不)?您必须看到,除了您在这里告诉我们的内容之外,我们对您的项目、它的约束和要求以及您想要实现的目标一无所知。

标签: vba excel


【解决方案1】:

如果列表在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

代码的想法是什么?通过连接所有Not IsEmpty() 的单元格,验证字符串在validationFormula 中生成。一旦validationFormula 准备就绪,就会将Chr(160) 添加到其中,以确保我们也有可用的空单元格。

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

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

感谢这个人的循环想法 - https://superuser.com/questions/1254754/data-validation-from-2-lists-excel-2010

【讨论】:

  • 我认为应该可以为数据验证源生成一个列表。我的问题是我想通过 UDF 生成该列表并将其直接分配为源。 (也许这也有效?)不知何故,我没想过直接用VBA设置所有东西......所以有一个+1。不错的解决方案!
  • 哦,请注意您的解决方案取决于语言。对于某些语言设置(例如德语),逗号不是有效的列表分隔符。在这种情况下,它需要是一个分号。您可以使用通用的Application.International(xlListSeparator) 来涵盖所有情况。
  • @Inarion - 不是。分隔符仅在Excel 中存在问题。另一方面,VBA 不关心德国的列表分隔符。
  • 有时,Excel 决定今天不想玩...(这就是 SO 发挥作用的地方!);)
  • @Inarion - 万岁啊?
【解决方案2】:

使用以下内容检查行值 = 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 中几乎相同。

【讨论】:

  • 您能否详细说明您的解决方案将如何回答以下问题:“如何在下拉列表中添加空白/特殊符号?”您正在通过 VBA 提出某种外部验证代码 - 如果用户同时打开相同的文件,这将如何工作?
  • 对不起。我以为您问如何检查单元格是否为空白,因为我只阅读标题哈哈。但是您可以尝试将 vbNullString 添加到下拉列表中。
  • 在这种情况下,我实际阅读问题的错误...... 困惑
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多