Excel VBA 从要在列表中使用的两个不同范围创建名称(数据验证)
Excel VBA create name from two different ranges to be used in list (data validation)
是否可以从两个不同的范围创建一个名称以用于列表(数据验证)?
我有两列:A 包含第 1 行到第 3 行的内容,C 包含第 1 行到第 4 行的内容。
我尝试使用 ThisWorkbook.Names.Add Name:="TheList", RefersTo:=Range("A1:A3,C1:C4")
,但是当在数据验证字段中插入 =TheList
时,它显示 "The list source must be a delimited list, or a reference to a single row or column"。
有没有办法合并两列的值?
由于 Excel 需要将连续范围的值用作数据验证列表,因此您实际上有两个选择。
- 在工作簿的未使用区域中创建一个单独的(可能是链接的)连续值列。建议为范围添加定义的名称,但不是必需的。
对于这种方法,我会在 "Z" 列(或可能在另一个隐藏的工作表中)中建立一个列表。这是一个例子:
Option Explicit
Sub MakeValidationRange()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim dataRange As Range
Set dataRange = ws.Range("A1:A3,C1:C3")
Dim valRange As Range
Set valRange = ws.Range("Z1")
Dim entry As Variant
For Each entry In dataRange
valRange.Formula = "=" & entry.Address
Set valRange = valRange.Offset(1, 0)
Next entry
Set valRange = ws.Range("Z1").CurrentRegion
'--- alternate method using a named range
ThisWorkbook.Names.Add Name:="TheList", RefersTo:=valRange
Dim dropDownCell As Range
Set dropDownCell = ws.Range("B1")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="=TheList"
'--- alternate method without creating a named range
Set dropDownCell = ws.Range("B2")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="=(" & valRange.Address & ")"
End Sub
- 第二种方法是根本不使用另一个范围,只创建一个分隔列表。这使列表成为 "hard-coded",但由于它是使用 VBA 创建的,因此在您的情况下可能不会成为障碍。
这个的关键在于定义列表到.Validation.Add
方法没有一个等号。例如,验证列表将为 Red,Orange,Yellow,Green,Blue,Indigo,Violet
。没有双引号。没空间了。没有平等。这是示例:
Option Explicit
Sub MakeValidationList()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim dataRange As Range
Set dataRange = ws.Range("A1:A3,C1:C3")
Dim dataList As String
Dim entry As Variant
For Each entry In dataRange
dataList = dataList & entry.Value & ","
Next entry
'--- remove the last trailing comma
dataList = Left$(dataList, Len(dataList) - 1)
Dim dropDownCell As Range
Set dropDownCell = ws.Range("B3")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:=dataList
End Sub
是否可以从两个不同的范围创建一个名称以用于列表(数据验证)?
我有两列:A 包含第 1 行到第 3 行的内容,C 包含第 1 行到第 4 行的内容。
我尝试使用 ThisWorkbook.Names.Add Name:="TheList", RefersTo:=Range("A1:A3,C1:C4")
,但是当在数据验证字段中插入 =TheList
时,它显示 "The list source must be a delimited list, or a reference to a single row or column"。
有没有办法合并两列的值?
由于 Excel 需要将连续范围的值用作数据验证列表,因此您实际上有两个选择。
- 在工作簿的未使用区域中创建一个单独的(可能是链接的)连续值列。建议为范围添加定义的名称,但不是必需的。
对于这种方法,我会在 "Z" 列(或可能在另一个隐藏的工作表中)中建立一个列表。这是一个例子:
Option Explicit
Sub MakeValidationRange()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim dataRange As Range
Set dataRange = ws.Range("A1:A3,C1:C3")
Dim valRange As Range
Set valRange = ws.Range("Z1")
Dim entry As Variant
For Each entry In dataRange
valRange.Formula = "=" & entry.Address
Set valRange = valRange.Offset(1, 0)
Next entry
Set valRange = ws.Range("Z1").CurrentRegion
'--- alternate method using a named range
ThisWorkbook.Names.Add Name:="TheList", RefersTo:=valRange
Dim dropDownCell As Range
Set dropDownCell = ws.Range("B1")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="=TheList"
'--- alternate method without creating a named range
Set dropDownCell = ws.Range("B2")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="=(" & valRange.Address & ")"
End Sub
- 第二种方法是根本不使用另一个范围,只创建一个分隔列表。这使列表成为 "hard-coded",但由于它是使用 VBA 创建的,因此在您的情况下可能不会成为障碍。
这个的关键在于定义列表到.Validation.Add
方法没有一个等号。例如,验证列表将为 Red,Orange,Yellow,Green,Blue,Indigo,Violet
。没有双引号。没空间了。没有平等。这是示例:
Option Explicit
Sub MakeValidationList()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim dataRange As Range
Set dataRange = ws.Range("A1:A3,C1:C3")
Dim dataList As String
Dim entry As Variant
For Each entry In dataRange
dataList = dataList & entry.Value & ","
Next entry
'--- remove the last trailing comma
dataList = Left$(dataList, Len(dataList) - 1)
Dim dropDownCell As Range
Set dropDownCell = ws.Range("B3")
dropDownCell.Validation.Delete
dropDownCell.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:=dataList
End Sub