0

我有一个包含日期的数据验证列表。当您更改日期时,它会影响工作表其余部分中显示的数据。

我想创建 2 个命令按钮,

  1. “下一个” - 单击时将移动到列表中的下一个日期,当它到达列表末尾时,它会返回到列表的开头
  2. “上一个” - 单击时将移动到列表中的上一个日期,当它到达列表的开头时,它将转到列表的末尾

这可能吗?

我确实看过列表框和组合框,但对编码感到非常困惑!!!任何帮助都会很棒!

4

1 回答 1

2

你必须区分3种情况:

  1. 使用内联列表元素进行数据验证(例如 Source = "1;2;3;4;5")
  2. 使用范围内的列表元素进行数据验证
  3. 列表/组合框

情况 1 可能是最困难的,因为您只能在字符串中访问列表元素,并且必须将它们拆分为一个数组,获取当前选择的索引并使用两个按钮移动索引以获得想要的结果

情况 2 稍微简单一些,但您再次需要以某种方式跟踪定义日期范围内的当前位置

案例 3 可能是最容易实现的……但仍然需要一定的编码工作,例如

  • 在首次显示之前将日期列表加载到列表/组合框中(OnLoad 或 OnActivate
  • 为向上和向下按钮创建代码以增加/减少列表框索引,并自动环绕

我向您建议第 4 种情况……使用 ActiveX 旋转按钮……它在一个元素中提供向上和向下功能:

  • 在垂直命名范围DateList中创建日期列表
  • 为 Spin Button 的索引多保留一个单元格并将其命名为DateIndex
  • 使用开发人员功能区,插入一个 ActiveX 旋转按钮(默认名称为SpinButton1
  • 将SpinButton1中的 LinkedCell 属性(确保处于开发人员/设计模式;右键单击 Spin 按钮并选择“属性”)设置为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)
于 2013-06-03T09:06:42.070 回答