Validation 使用VBA在excel工作表中添加验证列表时出现问题

Validation 使用VBA在excel工作表中添加验证列表时出现问题,validation,vba,list,add,Validation,Vba,List,Add,我有一个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

我有一个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方法提供了在工作表中填充结果数据的起始行。我在代码的其他部分也使用了这个方法,它工作得非常好。 使用消息框进行调试建议在范围(..)处引发错误。select语句


关于这个错误的原因有什么想法。

让我试着在这里传递我内心的斯波尔斯基:

如果您引用的范围不在
ActiveSheet
上,则应完全限定该引用

类似于以下的方法应该可以工作:

ActiveWorkbook.Sheets("mysheet").Range("AO" & firstRow & ":AO" & lastRow).Select

第一件事是去掉选择对象。它最适合于宏记录器:)

BTW在循环中,每次重复选择同一块时,即使对其进行了更多的处理,也应考虑在每次迭代中选择正在进行的块或移除整个循环。< /P> 你能试一下这个吗

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

关于这一点的最后想法:

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

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

我使用的解决方案是在使用xx.validation之前取消工作表的保护,然后在使用xx.validation之后进行保护。[我不必在Excel 2000中执行此操作,我想我也不必在Excel 2003中执行此操作,直到可能添加了service pack,尽管不能说是100%。]

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

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


干杯。

我遇到了同样的问题,发现错误与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

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

  • 受保护的工作表:添加数据验证的工作表无法受到保护,即使添加验证的单元格未被锁定,即使保护模式为用户界面。必须完全取消对工作表的保护,添加验证,然后重新保护工作表

  • 工作表单元格区域的焦点丢失:如果用户先前单击的活动工作表上的任何控件(通常是命令按钮)已获取焦点,则在随后调用验证.Add方法时将触发此错误。(真的,这是真的!)这尤其适用于执行添加验证的代码的任何命令按钮,但也适用于在执行该代码之前可以单击的工作表上的任何控件。由于焦点状态和数据验证添加到单元格或范围之间似乎没有合法的连接,所以我认为这是Excel错误。以下是解决办法:

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

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


  • :-)嗯。。在这段代码之前有一个Me.Unprotect后跟一个Me.Activate调用。但是,我确实尝试了一个限定引用,结果在同一行出现了“下标超出范围”错误。想知道为什么…?'因为这段代码在“mysheet”中的一个公共子例程中,好的,亚当…这让我很困惑…告诉我这是否有意义。。。ActiveWorkbook.Sheets(“mysheet”).Range(“AO”&firstRow&“:AO”&lastRow)。Select给出了下标超出范围的错误。然而,真正起作用的是ActiveWorkbook.ActiveSheet.Range(“AO”&firstRow&“:AO”&lastRow),并且该列表确实是在“mysheet”中创建的。请您解释一下……?“下标超出范围”通常表示该工作表不是您所认为的名称。例如,是否会有尾随空格?这个问题让我更加困惑。现在,在这一行,.Add Type:=xlValidateList,AlertStyle:=xlValidAlertStop,Operator:=\xlBetween,Formula1:=VOptions,运行时错误-2147417848(80010108)自动化错误。调用的对象已与其客户端断开连接。我发现更奇怪的是,当我调试时,它进行得很顺利