验证下载条件

时间:2009-04-08 21:57:01

标签: excel excel-2003 excel-formula

写一下我的想法有点令人困惑,但不好试一试。 这是我能做的。我在垂直单元格上有一个下拉列表,所以我有一个可以从中选择的名称列表[name] - > [define]和[data] - > [验证]。 我想要的是另一个垂直单元格,根据第一个条件填充另一个下拉。

例如,我有一份水果和蔬菜清单。我的第一个下拉菜单询问类型,所以我选择水果。由于这样的选择,我的第二次下拉将只给我一份水果清单(没有蔬菜),反之亦然。+

非常感谢您的帮助。

感谢帮派!


如果我想命名细胞而不是蔬菜,但2009年和水果2010我得到一个错误。周围有办法吗? 感谢

3 个答案:

答案 0 :(得分:4)

让我们使用一些命名范围。

姓名E7“选项”

将“蔬菜”放入E4,将“水果”放入E5;

在E7中,数据>验证>清单,来源$ E $ 4:$ E $ 5;

将一些蔬菜放入H4:H7;名称范围“蔬菜”;

将一些成果加入J4:J7;名称范围“fruits”;

现在,在E8:数据>验证>列表,来源“= INDIRECT(选项)”。

当您在E7中做出选择时,会相应地设置E8的选项。

答案 1 :(得分:0)

这是我完全按照你要求做的代码。

我已将独立列定义为名为Major_Category的命名范围,并将下拉验证设置为数据列表。然后我有几个名为cat_subItems的其他数据列表。因此,对于您的示例,主要类别将包含项目

  • 水果
  • 蔬菜

然后我定义了更多名为

的列表
  • cat_fruit
  • cat_vegetable

其中包含水果或蔬菜的名称。然后,基于主要类别选择,Worksheet_change事件会将下一列中的下拉验证更改为cat_fruitcat_vegetable

注意:如果您使用excel的保护工作表,则此代码效果不佳。 有关处理Excel工作表/图书保护的信息,请参阅this question

Public Sub Worksheet_Change(ByVal target As Range)
On Error GoTo ErrHandler:

Dim VRange As Range, cell As Range
Dim msg As String
Dim validateCode As Variant
Dim modCell As Range
Set VRange = Range("Major_Category")

If Intersect(VRange, target) Is Nothing Then Exit Sub

For Each cell In Intersect(VRange, target)
    b = cell.Value
    curRow = target.Row

    Set modCell = cell.Offset(0, 1) 'cell to modify the validation'

    If Not (b = "") Then
        modCell.Validation.Delete
        modCell.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _

        'sets the validation formula to the list/range name'
        xlBetween, Formula1:="=cat_" & b 

        modCell.Validation.IgnoreBlank = True
        modCell.Validation.InCellDropdown = True
        modCell.Validation.InputTitle = ""
        modCell.Validation.ErrorTitle = ""
        modCell.Validation.ErrorMessage = ""
        modCell.Validation.ShowInput = True
        modCell.Validation.ShowError = True

    End If
Next cell


Cleanup:

Exit Sub

ErrHandler:
MsgBox Err, vbOKOnly, "Error Occurred"
Resume Cleanup:

End Sub

答案 2 :(得分:0)

您无法命名范围“2009” - 因为Excel无法将其与整数值2009区分开来。还有一些其他限制 - 您无法命名范围“A1”,因为Excel会混淆与细胞A1。您可以做的是将2009和2010放在一个表中,然后在它们旁边放置范围的名称,然后执行VLOOKUP以获取范围名称。或者,您可以使用“_2009”并将公式设为

= INDIRECT(“_”& option)