【问题标题】:Excel VBA Validation List set Default ValueExcel VBA 验证列表设置默认值
【发布时间】:2017-09-28 15:53:57
【问题描述】:

我已经制定了以下代码(减去 Dim 和 Set 部分,但 WS1 = Sheet1 和 WS2 = Sheet2)将我的目标 Excel 工作表上的所有“验证列表”默认值设置为其引用表中的第一项:

'+++Work through the processing of the 'Validation Lists' in the Worksheet+++
For Each rngValList In WS1.Cells.SpecialCells(xlCellTypeAllValidation).Cells
    With rngValList
        If .Validation.Type = xlValidateList Then
            'Process those that should be set as the first value in the list.
            .Value = Range(Replace(.Validation.Formula1, "=", "")).Cells(1, 1)
        End If
    End With
Next rngValList

但是,在同一目标页面上有一个验证列表,我想将默认值设置为列表中包含的不同项目。我可以通过单独计算项目然后更新选择验证列表值的单元格来做到这一点,这很有效。但是,我真正想做的是在选择下拉按钮时将列表(很长)重点放在目标默认项目上。使用这种方法,下拉列表中的第一项仍然是列表的焦点。

我尝试修改上面的代码以更改默认值(可能以一种过于复杂的方式进行更改,但它确实有效),它确实选择了正确的值。但是,下拉列表中的焦点仍然在列表中的第一项上,当它被选中时。

我修改后的代码如下:

    '+++Work through the processing of the 'Validation Lists' in the Worksheet+++
    For Each rngValList In WS1.Cells.SpecialCells(xlCellTypeAllValidation).Cells
        With rngValList
            If .Validation.Type = xlValidateList Then
                'If the Valdation List is Month End, then select the correct month date.
                If .Validation.Formula1 = "=LUT_MonthEnd" Then
                    'Set the Default End Month value to the correct Month.
                    i = 0
                    For Each rngSMList In WS2.Range(TS).Cells
                        i = i + 1
                        With rngSMList
                            If rngSMList = WS2.Range(DS) Then
                                 'Capture the counter at this point and exit to the rngValList Range Object.
                                 GoTo EndMthStop
                            End If
                        End With
                    Next rngSMList
EndMthStop:
                    .Value = Range(Replace(.Validation.Formula1, "=", "")).Cells(i, 1)
                Else
                    'Process those that should be set as the first value in the list.
                    .Value = Range(Replace(.Validation.Formula1, "=", "")).Cells(1, 1)
                End If
            End If
        End With

这没什么大不了的,因为我可以将默认值设置为正确的值,所以一切正常。但是,最好在选择下拉列表时选择默认值作为焦点,而不是总是列表中的第一项。

从概念上讲,我想我需要的是一个指向目标表列表中正确默认值的指针。

任何关于如何实现这一点的建议将不胜感激。

问候,

韦恩

【问题讨论】:

  • 您可以使用选择更改事件 (msdn.microsoft.com/en-us/vba/excel-vba/articles/…) 和 instersect 方法 (msdn.microsoft.com/en-us/vba/excel-vba/articles/…) 来识别单元格何时被选中,然后根据需要设置单元格值。然后该列表将在该项目上打开。
  • 感谢您的及时反馈。我仍在寻找使用 Excel VBA 的方法,所以我不熟悉那个事件和方法。但是,当我有机会时,我一定会看看它们。
  • Ok Absinthe,实际上我今晚设法尝试了这个过程,虽然这个过程对我来说是新的,并且让我觉得这是一种在工作表中导航时设置默认值的有趣且有用的方法(设置当我点击单元格时默认对我来说效果很好),它仍然不能满足我的特定需求。现在在导航到该单元格时在该单元格中正确选择了默认值,它仍在执行我当前代码的操作。
  • 也就是说,当我点击下拉列表时,列表中的第一项仍然是列表顶部的一项,而不是我现在选择的默认项,即在我的下拉列表中可能还有很长的路要走。正如我所说,这将是一个很好的调整,而不是阻碍。但它会将下拉列表的焦点放在我选择的默认项目上,这是我所追求的。
  • 事实上,我当前的代码效果更好,因为它是在用户选择我的表单[重置]按钮时有目的地触发的。因此,关于如何将下拉列表的焦点更改为新选择的默认值的任何建议都是我真正想要的。干杯,韦恩

标签: vba list excel validation


【解决方案1】:

这应该可以帮助您入门,以及上面的我的 cmets。将以下代码粘贴到工作表对象(不是模块)中。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    Target.value = "Your Value"
End If

End Sub

Sub Worksheet_SelectionChange是一个在每次选择新单元格时触发的事件。

Application.Intersect 返回一个表示两个范围之间重叠的范围。

上面的示例假设您的列表位于单元格 A1 中。

目标是被点击的单元格,因此我们将单元格的值设置为您希望在列表中选择的任何值。

【讨论】:

  • 嘿,谢谢,苦艾酒。在周一回到办公室之前,我无法尝试这个(除非我在周末找到一点时间),但我肯定会试一试。我从没想过利用工作表对象中的事件触发器。非常感激。一旦我有机会尝试这个,我会报告结果。韦恩
【解决方案2】:

选择您放置列表项的单元格。

列表项的范围是“Opleiding”

在您的 VBA 代码中:

selection.Value = Range("opleiding").Cells(2, 1)

结果是listItem的选中项是“Opleiding”范围内的第二项

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 2015-11-18
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多