使用VBA从数据范围条件填充Excel数据验证下拉列表

时间:2016-07-04 22:46:45

标签: excel vba excel-vba

我正在构建一个电子表格,其中包含供用户选择的数据验证下拉列表。根据某些预定义条件,从(隐藏)选项卡上的命名区域填充下拉列表。

数据范围的提取(当前> 500行)是

| Type | Code | Description      | Start Date | End Date   | Status |
| A    | 001  | IT               | 01/01/2016 | 31/12/2016 | O      |
| A    | 002  | HR               | 31/10/2017 | 31/12/2018 | O      |
| A    | 003  | Payrol           | 01/01/2016 | 31/12/2016 | O      |
| A    | 004  | Marketing        | 01/01/2016 | 31/12/2016 | C      |
| B    | 110  | Technical Review | 01/01/2016 | 31/12/2016 | O      |

并且位于命名范围'代码数据'

我想使用来自数据范围的VBA在代码列中填充数据验证下拉列表,其中:

  • Type = A
  • 状态= O
  • 开始日期<今天的日期
  • 结束日期>今天的日期

我尝试使用ODBC / SQL但运行良好但启动缓慢 - 我认为在查询之前它正在连接到数据范围

有更快/更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为数据验证需要一个连续的范围,因此您可能需要首先过滤然后将结果单元格移动到其他位置,否则数据验证将包含隐藏的单元格,类似于此(显然修改为您自己的工作表和范围):

Sub someMacro()
With Sheets("Sheet1")
    With .Range("a1:f6")
        .AutoFilter Field:=1, Criteria1:="A"
        .AutoFilter Field:=6, Criteria1:="O"
        .AutoFilter Field:=4, Criteria1:="<" & Date
        .AutoFilter Field:=5, Criteria1:=">" & Date
    End With
    .Range(.Range("b2"), .Range("b2").End(xlDown)).Copy
    .Range("g1").PasteSpecial xlPasteValues 'Put this whereever is suitable, don't forget to add something in to delete this with each run
    .Range("h1").Validation.Add Type:=xlValidateList, Formula1:="='Sheet1'!" & .Range(.Range("g1"), .Range("g1").End(xlDown)).Address 'I've validated cell h1, change this to whatever
End With
End Sub