【问题标题】:How do I turn a validation list from a cell into a list with VBA如何使用 VBA 将单元格中的验证列表转换为列表
【发布时间】:2019-10-25 12:10:45
【问题描述】:

我有一张表格,我需要根据这些表格中的验证列表粘贴数据。在工作表中,有很多列,每列都有自己的数据验证列表 - 有些直接写为 "yes;no" 其他是引用 "='$$VALUES$$'!$IJ$1:$IJ$12"

我需要找到一种方法将每个列表中的每个项目添加到数组中。使用下面的代码,我可以找到上面的参考资料。

Debug.Print Cells(2, 6).Validation.Formula1

是否有任何优雅的方式将输出存储为包含每个有效输入的列表。到目前为止,我唯一的想法是首先检查我得到哪种类型的输出,然后如果它是“是;否”的列表形式,然后查找 ; 的数量。然后逐项拆分。如果它的工作表范围引用按工作表和范围拆分,并将该范围转换为数组。

【问题讨论】:

    标签: excel vba validation dropdown


    【解决方案1】:

    像这样的东西,会做到的。我会设置一个范围而不是使用 activecell,并且检查验证是否存在以减少您的错误。

    Sub get_val_lists()
    
    Dim arrOutput() As Variant
    
    If Left(ActiveCell.Validation.Formula1, 1) <> "=" Then
        arrOutput = Split(ActiveCell.Validation.Formula1, ",")
    Else
        arrOutput = Application.Transpose( _
                    Range(Mid(ActiveCell.Validation.Formula1, 2)).value)
    End If
    
    End Sub
    

    【讨论】:

    • 您好,非常感谢您的意见,我最终在离线时得到了自己的答案,抱歉。但是非常感谢您的意见
    【解决方案2】:

    我的时间有点紧迫,所以我最终自己做了一个不雅的解决方案。在这里发布它以防其他人遇到同样的问题。

    Sub ValidList()
    Dim strFormula As String
    Dim intLastSemi As Integer
    Dim intCurSemi As Integer
    Dim intSemi As Integer
    Dim aryList() As Variant
    Dim intLen As Integer
    Dim blnCont As Boolean
    
    Dim strSheet As String
    Dim strRange As String
    Dim intSplit As Integer
    
    Dim ws As Worksheet
    Dim rng As Range
    Dim e As Variant
    
    Dim Row As Integer
    Dim Col As Integer
    
    'This is just an example, turning it into a fucntion based on row and col later
    'so now my test validation list is just in A1
    Row = 1
    Col = 1
    
    strFormula = Cells(Row, Col).Validation.Formula1
    intLen = Len(strFormula)
    If InStr(1, strFormula, "=") Then 'Sheet reference
       intSplit = InStr(1, strFormula, "!")
       strSheet = Right(Left(strFormula, intSplit - 1), intLen - intSplit - 3)
       strRange = Right(strFormula, intLen - intSplit)
    
       Set ws = Worksheets(strSheet)
       Set rng = ws.Range(strRange)
    
       aryList() = rng
    
    ElseIf Not InStr(1, strFormula, ";") Then 'Hardcoded list
        intSemi = 0
        intLastSemi = 0
        blnCont = True
        While blnCont
            intCurSemi = InStr(intLastSemi + 1, strFormula, ";")
            If intCurSemi <> 0 Then
                intSemi = intSemi + 1
                ReDim Preserve aryList(intSemi)
                aryList(intSemi) = Right(Left(strFormula, intCurSemi - 1), intCurSemi - intLastSemi - 1)
                intLastSemi = intCurSemi
            ElseIf intCurSemi = 0 Then
                intSemi = intSemi + 1
                ReDim Preserve aryList(intSemi)
                aryList(intSemi) = Right((strFormula), intLen - intLastSemi)
                blnCont = False
            End If
        Wend
    End If
    
    'For my attempt at passing the array to a function
    'For Each e In aryList
    '    MsgBox e
    'Next
    'ReDim ValidList(UBound(aryList))
    'ValidList = aryList
    

    结束子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多