【问题标题】:Creating data validation list with indirect formula through VBA通过 VBA 使用间接公式创建数据验证列表
【发布时间】:2016-03-19 17:06:06
【问题描述】:

通常 Excel 中的记录选项很棒,但这次没有帮助。

我可以使用此代码通过 VBA 创建数据验证列表:

Sub Macro 8()

With Range("C8").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Land"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
End Sub

现在可以了。但在下面的单元格中,我需要公式为=INDIRECT($C$8)。所以使用 Recorder 我得到了几乎相同的代码:

Sub Macro1()

With Range("C9").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=indirect($C$8)"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
End Sub

但使用该代码时,我总是会收到指向该行的“应用程序定义或对象定义错误”

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=indirect($C$8)"

谁能告诉我我的错误在哪里?

【问题讨论】:

    标签: excel vba validation macros excel-indirect


    【解决方案1】:

    您的代码大部分是正确的。您不需要大量代码来执行 Indirect() 部分。这是整个事情:

    Sub Macro8()
    
    With Range("C8").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Land"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Range("C9").Formula = "=INDIRECT(""$C$8"")"
    End Sub
    

    【讨论】:

    • 嗨迈克,感谢您的回答!我也需要 INDIRECT 单元格作为下拉列表...如果我手动执行它,因为我从 C8 获得的值是我的工作表中列表的名称,所以我从 C9 中的列表中获得选择只需插入=INDIRECT($C$8) 它不起作用...有什么想法吗?
    • 你必须使用 =Indirect("$C$8")。除此之外,我认为这个问题得到了回答。对于任何进一步的问题,最好开始一个新问题。
    【解决方案2】:

    好的,我得到它的工作一次,现在我又得到同样的错误......:

    With Range("C9").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Indirect(" & Range("C8").Address & ")"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    

    我不太明白为什么... 谁能解释一下

    " & Range("C8").Address & "
    

    是什么意思?

    【讨论】:

    • 计算C8的地址。所以它评估为“C8”。所以是一样的。
    • 你有 C8 作为参数。它需要参数是字符串形式的地址;所以它应该是“C8”或一些计算结果为“C8”的字符串表达式
    • 啊,我明白了,但现在我完全糊涂了......它工作了 2 次,现在它要么返回相同的错误,要么返回“语法错误”。什么……我做错了吗???有没有别的写法??
    • 错误是什么,在哪一行?尝试使用 F8 单步执行代码
    • 又是同一行。从.添加
    【解决方案3】:

    让它工作!

    我将现有代码放在一个单独的宏中,并使其与 ActiveCell 相关

    现在只要在上面的单元格中选择某些内容,它就会运行

    谢谢你!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2020-05-09
      • 2015-10-22
      相关资源
      最近更新 更多