Excel动态数据验证'名单

时间:2015-03-05 14:44:06

标签: excel excel-formula validation

我正在使用Excel工作表来帮助配置大型xml文件。

我有以下

Type selected from Data Validation - list

在24种不同的Type选项中,它们共享大量要配置的公共字段(黄色单元格,其中有15列,后面还有36列,主要适用于所有24种类型。 )

最后,我有21个列,只标记为Option1Option2 ...由于其单元格每个Type有不同的翻译:

Different meaning of Option for each type

该图像的关键词仅作为参考。

实际配置项目时,我使用了数据验证(如图1所示)来选择Type,然后在OptionX单元格中显示变量类型,这是从Options键引用的(A具体说明:作为对用户的提醒,我希望在应用数据验证列表的同时适当填充每个单元格的值 Option data_type updates with Type

以下是我遇到麻烦的地方。

我希望每个选项在需要时有条件地应用数据验证列表。所以基本上用户选择Type然后填充OptionX并根据Option单元格中的值,将显示相应的数据验证列表(如果适用,则作为一些选项)是基于ID号等...在这种情况下我不会有一个列表或最多是一个空的)

另一方注意事项:我从中学开始就没有使用excel-所以如果我的某些方法形式不好,我会道歉。因为我在问这个问题之前正在研究,所以我注意到了一些关于许多INDIRECT电话都不好,我目前有很多。每个Option都包含一个符合

的公式
=VLOOKUP(  OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,-54),Sheet2!A16:B39,2,FALSE)

为了引用Type的值,以便我可以将公式复制/粘贴~500行(每个项目配置的平均项目数),尽管我怀疑Excel会是能够以更优雅的方式处理这个问题。)

我通过用第一个替换第一个改进了单元格公式:
=VLOOKUP( D3,'smart MDR710 config.xlsx'!options,2,FALSE)
并将其复制/粘贴到下一个499个单元格

1 个答案:

答案 0 :(得分:1)

您需要按照这些教程进行操作,因为您没有提供有关问题的足够信息,以便在此详细说明确切的解决方案。

简而言之,您需要一个表格,其中最左边的列是类型选择,其余标题是第一列中的24种类型选择及其相关的子选择。基本上,交叉表。

然后,您需要使用类似......

的公式创建名为MainList的命名范围
=INDEX(Table1[[Choose…]],1):INDEX(Table1[[Choose…]],COUNTA(Table1[[Choose…]]))

您可以替换的地方选择您希望您的单元格提示您的用户的任何内容,并选择Table1以及您使用相关选择信息命名的表格。

然后,您需要使用类似......

的公式创建一个名为SubList的命名范围
=IF(OR(Sheet1!B8="Choose…",Sheet1!B8=""),"",INDEX(Table1,1,MATCH(Sheet1!B8,Table1[#Headers],0)):INDEX(Table1,COUNTA(INDEX(Table1,,MATCH(Sheet1!B8,Table1[#Headers],0))),MATCH(Sheet1!B8,Table1[#Headers],0)))

然后,您需要将这些命名范围作为数据验证标准应用于您的给定单元格(您的类型列= MainList以及您的后续列等于您的子列表)。

现在,您需要确保MainList列直接位于动态单元格的左侧,如果您希望组合框级联(即一列允许选择另一列中的某些值,等等),您将需要需要您的子列表数据验证单元格直接向左。

如果是我,我会完全按照附加链接中的注释进行操作,并将数据输入单元格放在表格中。这将使您能够使用下面的工作表事件,如果您更改某些内容,将更新单元格"上游"来自子列表选择。

Option Explicit

Const CHOOSE = "Choose…"

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
    Dim targetCell As Range
    Dim nextCell As Range
    Dim oldCalc As Excel.XlCalculation

    If Not Intersect(Target, [DataEntryTable]) Is Nothing Then
        If [Radio_Choice] = 1 Then
            With Application
                .EnableEvents = False
                .ScreenUpdating = False
                oldCalc = .Calculation
                .Calculation = xlCalculationManual
            End With

            For Each targetCell In Target
                'Clear any cells that use 'SubList' to the right of targetCell in the current table.
                If targetCell.Column < (targetCell.ListObject.ListColumns.Count + targetCell.ListObject.Range.Column - 1) Then 'there are table cells to the right
                    For Each nextCell In targetCell.Offset(, 1).Resize(, targetCell.ListObject.ListColumns.Count + targetCell.ListObject.Range.Column - targetCell.Column - 1)
                        If HasValidationFormula(nextCell) Then
                            If nextCell.Validation.Formula1 = "=SubList" Then nextCell.Value = ""
                        End If
                    Next nextCell
                End If

                'Perform different action depeding on whether we're dealing with a 'MainList' dropdown
                ' or a 'SubList' dropdown
                If HasValidationFormula(targetCell) Then
                    Select Case targetCell.Validation.Formula1
                    Case "=MainList"
                        If targetCell.Value = "" Then
                            targetCell.Value = CHOOSE
                        ElseIf targetCell.Value = CHOOSE Then
                            'Do nothing.
                        Else
                            targetCell.Offset(, 1).Value = CHOOSE
                        End If

                    Case "=SubList"
                        If targetCell.Value = "" Then
                            targetCell.Value = CHOOSE
                        ElseIf targetCell.Offset(, -1).Value = CHOOSE Then
                            targetCell.Value = ""
                        ElseIf targetCell.Value = CHOOSE Then
                            'Do nothing
                        Else
                            Set nextCell = targetCell.Offset(, 1)
                            If HasValidationFormula(nextCell) Then
                                If nextCell.Validation.Formula1 = "=SubList" Then nextCell.Value = CHOOSE
                            End If
                        End If
                    End Select
                End If
            Next targetCell
            With Application
                .EnableEvents = True
                .ScreenUpdating = True
                .Calculation = oldCalc
            End With
        End If
    End If
    Exit Sub
ErrorHandler:
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
        If oldCalc <> 0 Then .Calculation = oldCalc
    End With
    MsgBox Err.Description, vbCritical, Name & ".Worksheet_Change()"
End Sub

Private Function HasValidationFormula(cell As Range) As Boolean
    On Error GoTo ValidationNotExistsError
    If cell.Validation.Formula1 <> "" Then
        HasValidationFormula = True
    Else
        HasValidationFormula = False
    End If
    Exit Function
ValidationNotExistsError:
    HasValidationFormula = False
End Function

归功于

http://chandoo.org/wp/2014/02/13/dynamic-cascading-dropdowns-that-reset/

http://www.contextures.com/xlDataVal15.html