【问题标题】:How to select next item in Data Validation list using VBA如何使用 VBA 选择数据验证列表中的下一项
【发布时间】:2013-06-03 03:00:00
【问题描述】:
我有一个包含日期的数据验证列表。当您更改日期时,它会影响工作表其余部分中显示的数据。
我想创建 2 个命令按钮,
- “下一个” - 单击时将移动到列表中的下一个日期,当它到达列表末尾时将返回到列表开头
- “上一个” - 单击时将移动到列表中的上一个日期,当它到达列表的开头时,它将转到列表的末尾
这可能吗?
我确实看过列表框和组合框,但对编码感到非常困惑!!!
任何帮助都会很棒!
【问题讨论】:
标签:
excel
excel-2010
validation
commandbutton
vba
【解决方案1】:
你要区分3种情况:
- 使用内联列表元素进行数据验证(例如 Source = "1;2;3;4;5")
- 使用范围内的列表元素进行数据验证
- 列表/组合框
情况 1 可能是最困难的,因为您只能在字符串中访问列表元素,并且必须将它们拆分为一个数组,获取当前选择的索引并使用两个按钮移动索引以获得想要的结果
情况 2 稍微简单一些,但您需要再次以某种方式跟踪定义日期范围内的当前位置
案例 3 可能是最容易实现的......但仍然需要一定的编码工作,例如
- 在首次显示之前将日期列表加载到列表/组合框中(OnLoad 或 OnActivate
- 为向上和向下按钮创建代码以增加/减少列表框索引,并自动环绕
我向您建议第 4 种情况……使用 ActiveX 旋转按钮……它在一个元素中提供向上和向下功能:
- 在垂直命名范围内创建日期列表DateList
- 为旋转按钮的索引再保留一个单元格并将其命名为 DateIndex
- 使用开发者功能区,插入一个 ActiveX 旋转按钮(默认名称为 SpinButton1)
- 将 SpinButton1 中的 LinkedCell 属性设置为 DateIndex
- 创建以下代码(仍处于设计模式,右键单击 SpinButton 并选择“查看代码”)
代码
Private Sub SpinButton1_SpinDown()
If SpinButton1 = 0 Then
SpinButton1 = Range("DateList").Rows.Count
End If
End Sub
Private Sub SpinButton1_SpinUp()
If SpinButton1 = Range("DateList").Rows.Count + 1 Then
SpinButton1 = 1
End If
End Sub
- 在要显示所选日期的单元格中,输入公式
=INDEX(DateList,DateIndex)
- 由于您使用的是命名范围,DateList 和 DateIndex 可能与用户工作表位于不同的工作表(甚至是隐藏的工作表)中。
- 如果您想在用户当前放置光标的单元格中创建当前所选日期的副本,请将以下语句添加到 SpinDown/Up Sub 的末尾(
End If 之后:Selection = Range("DateList").Cells(SpinButton1, 1)