【问题标题】:Macro gives error for no reason while creating a drop down data validation?宏在创建下拉数据验证时无缘无故地给出错误?
【发布时间】:2017-01-02 01:27:07
【问题描述】:
Range("C4").Select
    Application.CutCopyMode = False
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Materials"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

我正在尝试使用宏对一个单元格进行数据验证。这样,当您选择材料时,图表会自动更改。代码中的材料是数据验证范围,我命名了希望解决错误的范围。

所以主要问题是宏在运行时会给出“运行时错误 1004”。如果我调试并将我的黄色光标向后退几步并使用 f8,它会完美运行。我从记录宏中获取此代码。代码似乎是正确的,但我不知道为什么宏会给出错误。

【问题讨论】:

  • 删除Range("C4").Select这一行并将With Selection.Validation替换为With ThisWorkbook.Sheets("Sheet1").Range("C4").Validation 还将“Sheet1”更改为相关工作表名称,然后重试
  • 不幸的是没有工作:(。我知道有很多事情要避免选择,但避免它并不能一直解决问题。如果你知道如何正确使用它,它将毫无问题地工作. 我有 1 个月的宏工作,使用了很多选择和激活,完全没有问题。在您的解决方案中,它无法识别 thisworkbook,因为它适用于模块。即使我删除了它,程序总是在 .添加 Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Materials" 代码。感谢您的帮助!
  • 好的。几个问题...1 代码是否在具有Materials 命名范围的同一工作簿中? 2 代码是否试图在运行它的同一工作簿中添加 DV 列表? 3 如果上述问题的答案是“是”,那么您是否打开了多个工作簿?如果是,请关闭它们并重试。
  • 工作簿中没有代码。它位于工作簿的模块上。它使用其他工作簿来构建另一个结果工作簿。数据验证部分在结果工作簿上。材料表在一张纸上,我正在尝试将数据验证构建到另一张纸上。

标签: excel validation vba


【解决方案1】:

好的,我找到了。

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=Materials

既然 Materials 是一个表格,我应该删除多余的 = 和 "

注意:这样它不会出错,但也无法从材料表中读取数据。

【讨论】:

  • 您从未在问题的任何地方提到Materials 是一张桌子?你说是Named Range
  • 这是一个命名范围,我只是在尝试不同的东西。反正也没用
  • 有趣的是,当我在最大化工作簿窗口(即使它是唯一处于活动状态的工作簿)后进行调试并重新执行操作时,它会起作用。除此之外,它给出了错误。只是没有意义
【解决方案2】:

这对我来说很好用。

我的假设:

  1. Materials 是一个命名范围。
  2. Workbooks("ROL.xlsx") 在同一个 Excel 实例中打开。

代码

Sub Sample()
    Dim wbDV As Workbook
    Dim wsDV As Worksheet

    Set wbDV = Workbooks("ROL.xlsx")
    Set wsDV = wbDV.Sheets("Sheet1")

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

【讨论】:

  • 我会尝试,但就像我说的那样,excel 看不到我认为的代码。工作表和工作簿已经安排好了。但是等2分钟我会试试的。顺便说一句,感谢您的所有努力,这意味着很多。
  • 它给出了同样的错误。就像我说的,我需要让 excel 了解工作簿已打开。范围或工作簿的定义没有问题。
  • 就像我说的那样对我有用。 Workbooks("ROL.xlsx") 是否打开?
  • 如果它没有打开,那么将Set wbDV = Workbooks("ROL.xlsx") 更改为Set wbDV = Workbooks.Open("C:\ROL.xlsx") 我使用了`C:`。您必须用完整路径替换它..
  • 我已经改变了它,但就像我说的问题一样,我真的不合逻辑地解决了它。你可以检查答案
【解决方案3】:
 Workbooks(strii).Activate
    Application.WindowState = xlMaximized
Sheets("Sheet1").Activate
    With Sheets("Sheet1").Range("C4").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlEqual, Formula1:="=Materials"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

最大化 excel 效果很好。不知道为什么,但它有效

【讨论】:

  • 我刚刚检查过了。我错过了你说工作簿最小化的部分。当工作簿最大化时,我的代码工作得很好。所以你所要做的就是将最大化代码添加到我的代码中;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 2022-08-16
  • 1970-01-01
相关资源
最近更新 更多