【问题标题】:Excel VBA - Select first item on Data Validation Dropdown ListExcel VBA - 选择数据验证下拉列表中的第一项
【发布时间】:2021-06-01 13:14:38
【问题描述】:

我正在尝试让一个单元格自动将其第一个值添加到该单元格的数据验证下拉列表中。还没有在网上找到任何似乎有效的东西。

当用户从工作簿的其他部分输入信息时,此 Sub 被 Private Sub 激活。

我已经剪掉了应该选择第一个下拉值并将其添加到单元格的代码部分,但事实并非如此。 .Value = 1 对我来说似乎不合适...... 我也无法列出此下拉列表将从中选择的范围,因为这将是动态的。我见过多个使用“with”语句的示例,但似乎它们需要此列表的工作范围才能操作。

我应该提到单元格“LastProject”已经包含一个下拉列表。

谁有更好的主意?

Dim LastProject As Range
    Set LastProject = FoundBMR.Offset(0, 1)

'''Find Last Project Produced for unit
    ''' Function ListSourceRange Required.
    Dim rngSource As Range
        
    rngSource = LastProject
        
    Set rngSource = ListSourceRange(Target)
        If Not rngSource Is Nothing Then
            rngSource.Parent.Activate
        End If
    
    With LastProject
        .ClearContents
        .Validation.Delete
        .Validation.Add Type:=xlValidateList, Formula1:="+" & rngSource
        .Value = rngSource.Cells(1, 1).Value
    End With

Function ListSourceRange(c As Range) As Range
    Dim vType, rng As Range
    On Error Resume Next       'ignore error if no validation
    vType = c.Validation.Type
    On Error GoTo 0            'stop ignoring errors
    
    If vType = 3 Then
        'try to get a source range...
        On Error Resume Next
        Set rng = Range(c.Validation.Formula1)
        On Error GoTo 0
    End If
    Set ListSourceRange = rng 'source range, or Nothing if no range found
End Function

【问题讨论】:

  • 您的下拉菜单是真正的数据验证>>列表,还是其他类型的实现? DropDowns 与数据验证无关 - 这些将是从开发人员功能区选项卡添加的表单控件。
  • 如果你想从列表源范围中选择第一个值,那么你可以使用这样的东西:stackoverflow.com/questions/66323724/…
  • @TimWilliams 和 kevin9999 天才思维!这真是个好主意。但是,我收到一个编译错误:Set rngSource = ListSourceRange(Target) 上的 ByRef 参数类型不匹配。不知道为什么会这样。我已经修改了原始帖子中的代码,因为我在 cmets 中遇到了问题。

标签: excel vba list dropdown


【解决方案1】:

更像这样,虽然我不确定你在用这里的验证列表做什么?为什么要删除然后重新添加?

编辑:测试并为我工作

Sub Tester()

    Dim c As Range, rngList As Range
    
    Set c = ActiveSheet.Range("A1") 'has a list-based validation
    
    Set rngList = ListSourceRange(c)
    
    If Not rngList Is Nothing Then
        c.Value = rngList.Cells(1).Value
    End If
    
End Sub


'Given a cell, see if it has a validation list, and
'  try to get the source range for the list
Function ListSourceRange(c As Range) As Range
    Dim vType, rng As Range
    On Error Resume Next       'ignore error if no validation
    vType = c.Validation.Type
    On Error GoTo 0            'stop ignoring errors
    
    If vType = 3 Then
        'try to get a source range...
        On Error Resume Next
        Set rng = Range(c.Validation.Formula1)
        On Error GoTo 0
    End If
    Set ListSourceRange = rng 'source range, or Nothing if no range found
End Function

【讨论】:

  • 嘿@Tim,这段代码似乎有效。但是,它没有选择下拉列表中的第一项。我认为根据我一直在查看内容的其他代码,应该删除任何以前的验证。
  • 查看我上面的编辑 - 这对我有用,所以如果你看到不同的东西,你需要做一些调试。
  • 嘿@Tim,刚刚回到这个。我可以确认您的代码可以正常工作,只是在新的工作簿中累了它,没有任何问题。我厌倦了修改我的代码没有运气。我什至完全复制并粘贴了您在上面写的内容,并将范围更改为选定的下拉单元格并强制运行子,这也不起作用!我什至在我现有的工作簿中制作了一张新的空白纸并进行了相同的测试,但它不起作用。不知道我做错了什么。这本工作簿被诅咒了吗??
  • 如果你能分享你的文件,我会看看,否则我没有太多建议......
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2013-09-23
相关资源
最近更新 更多