4

我有一个加载了动态结果数据集的 excel 表。加载完所有数据后,我需要在每行末尾添加一个“是/否”下拉列表。我必须动态执行此操作,因为我事先不知道结果集的大小。以下代码引发“应用程序定义或对象定义错误”:

Dim firstRow As Integer
Dim lastRow As Integer
Dim I As Integer
Dim VOptions As String
VOptions = "1. Yes, 2. No"

firstRow = GetResultRowStart.row + 1
lastRow = GetResultRowStart.End(xlDown).row

For I = firstRow To lastRow

Range("AO" & firstRow & ":AO" & lastRow).Select

With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=VOptions
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = "Options"
    .ErrorTitle = ""
    .InputMessage = "Click yes or no"
    .errorMessage = ""
    .ShowInput = True
    .ShowError = True
End With


 Next I

GetResultRowStart 方法为我提供了表格中填充结果数据的起始行。我在代码的其他部分的其他地方也使用了这种方法,并且效果很好。使用消息框进行调试建议在 Range(..).select 语句中引发错误。

有关此错误原因的任何想法。

4

8 回答 8

4

关于这个的最终想法:

将工作簿中每个按钮的 SetFocusOnClick 属性设置为 false 似乎已经成功了(至少目前如此)。但是,如果这是一个必需条件,那么在设置为 true 的情况下,它根本不应该起作用。但是,有时确实如此。但这是我找到的可靠解决方案。

于 2009-07-13T10:25:56.123 回答
1

让我试着在这里引导我内心的斯波尔斯基:

如果您指的是不在 上的范围,ActiveSheet则应完全限定 reference

像下面这样的东西应该可以工作:

ActiveWorkbook.Sheets("mysheet").Range("AO" & firstRow & ":AO" & lastRow).Select
于 2009-06-15T06:04:35.570 回答
1

我也面临同样的问题,“自动化错误”。我所做的是激活我要放入验证列表的工作表,错误就消失了。

于 2009-08-28T03:02:24.017 回答
1

我使用的解决方案是在 With xx.validation 之前取消保护工作表,然后在之后进行保护。[我不必在 Excel 2000 中执行此操作,而且我认为我不必在 Excel 2003 中执行此操作,直到可能添加了服务包,但不能说 100%。]

于 2011-02-11T01:10:48.833 回答
1

我刚刚在 Excel 中遇到了一个非常相似的问题。当我在即时窗口中运行它时,我发现以编程方式设置验证下拉列表的代码工作正常,但从工作表上的按钮调用时不起作用。我现在意识到这是因为按钮具有焦点,并且在设置验证之前尝试选择或激活代码中的工作表或单元格似乎解决了这个问题。但是,我刚刚意识到 Excel 中有一个按钮的“TakefocusOnClick”属性,默认设置为 True。通过将其设置为 False,按钮永远不会获得焦点,嘿,我的设置验证代码现在可以正常工作了。

它可能不是每个人的验证问题的答案,但我希望可能有人可以从上述问题中受益。

干杯。

于 2012-05-30T17:16:06.153 回答
1

这是“对象'验证'失败的方法'添加'”错误的变体。以下是可能的原因以及解决方法:

  1. 受保护的工作表:无法保护正在添加数据验证的工作表,即使要添加验证的单元格未锁定并且即使保护模式为UserInterfaceOnly也是如此。您必须完全取消保护工作表,添加验证,然后重新保护工作表。

  2. 工作表单元格范围失去焦点:如果用户先前单击的活动工作表上的任何控件(通常是命令按钮)已获得焦点,则随后调用Validation.Add方法. (真的,这是真的!)这尤其适用于执行添加验证的代码的任何命令按钮,但它也适用于在执行该代码之前可以单击的工作表上的任何控件。由于在焦点状态和向单元格或范围添加数据验证之间似乎没有合法的联系,我认为这是一个 Excel 错误。以下是解决方法:

    A. 防止工作表的单元格范围失去焦点:将工作表上所有控件的TakeFocusOnClick属性设置为False

    B. 将焦点检索到工作表的单元格区域:在 VBA 代码中,在执行Validation.Add方法之前,调用工作表上任何单元格的Select方法。合乎逻辑的选择是选择要添加数据验证的单元格或范围,但任何单元格都可以。

于 2014-11-21T19:03:00.627 回答
0

首先是摆脱 Selection 对象。它最适合宏记录器:)

顺便说一句,每次您一次又一次地选择同一个块时,即使您正在对其进行更多处理,也要考虑在每次迭代中选择正在处理的块或删除整个循环。

你可以在你循环之后试试这个吗?

With ActiveWorkbook.ActiveSheet.Range("AO" & firstRow & ":AO" & lastRow).Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=VOptions
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = "Options"
    .ErrorTitle = ""
    .InputMessage = "Click yes or no"
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
于 2009-06-17T17:47:36.390 回答
0

我有同样的问题,发现错误与 Application.ReferenceStyle 的设置有关

请参阅下面的更正代码 -

If Application.ReferenceStyle = xlR1C1 Then
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=R1C16:R" & foldercnt & "C16"
Else
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$P1:$P" & foldercnt
End If
于 2014-10-30T17:30:15.277 回答