首页 > 解决方案 > 使用单元格下拉列表中的值填充 vba ComboBox

问题描述

我想用在特定单元格中找到的下拉值填充组合框,比如 C10。

C10 使用 Excel 的数据验证功能将可输入单元格的值限制为下拉列表。我想使用这个列表来填充 vba userForm 中的组合框。

目前我的方法是使用:

Range("C10").Validation.Formula1

这是可以返回的 3 个任意示例:

  1. “=制作”
  2. "=INDIRECT(C9 & "_MK")"
  3. “0;1;2;3;4;5;6;7;8;9;10”

我的方法是对此进行评估并尝试将其形成一个可用范围,该范围可用于设置我的组合框的 RowSource 属性。但是,我无法解释所有可以退回的可行案例。

当然,有一种简短而简单的方法可以实现我想要的,而无需为每种情况编写异常代码。

这样做的正确方法是什么?

标签: excelvbacombobox

解决方案


但是,我无法解释所有可以退回的可行案例。

您将不得不单独考虑它。没有直接的方法来获得这些值。

这是我编写的一个快速代码GetDVList(),它将处理您的所有 3 个场景。

下面的代码将在一个数组中返回数据验证列表的值,您可以从中填充组合框。我已经对代码进行了注释,因此您理解它应该没有问题,但是如果您这样做了,那么只需询问即可。

这是你正在尝试的吗?

Option Explicit

Sub Sample()
    Dim rng As Range
    Dim i As Long
    Dim cmbArray As Variant
    
    '~~> Change this to the relevant sheet and range
    Set rng = Sheet1.Range("A1")
    
    '~~> Check if range has data validation
    On Error Resume Next
    i = rng.SpecialCells(xlCellTypeSameValidation).Count
    On Error GoTo 0
    
    '~~> If no validation found then exit sub
    If i = 0 Then
        MsgBox "No validation found"
        Exit Sub
    End If
    
    '~~> The array of values
    cmbArray = GetDVList(rng)
    
    '~~> You can transfer these values to Combobox
    For i = LBound(cmbArray) To UBound(cmbArray)
        Debug.Print cmbArray(i)
    Next i
End Sub

Function GetDVList(rng As Range) As Variant
    Dim tmpArray As Variant
    Dim i As Long, rw As Long
    Dim dvFormula As String
    
    dvFormula = rng.Validation.Formula1
    
    '~~> "=Makes"
    '~~> "=INDIRECT(C9 &_MK)"
    If Left(dvFormula, 1) = "=" Then
        dvFormula = Mid(dvFormula, 2)
        
        rw = Range(dvFormula).rows.Count
        
        ReDim tmpArray(1 To rw)
        
        For i = 1 To rw
            tmpArray(i) = Range(dvFormula).Cells(i, 1)
        Next i
    '~~> "0;1;2;3;4;5;6;7;8;9;10"
    Else
        tmpArray = Split(dvFormula, ",") '~~> Use ; instead of , if required
    End If

    GetDVList = tmpArray
End Function

推荐阅读