Validation 使用VBA在excel工作表中添加验证列表时出现问题
我有一个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
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
这是对象“验证”“失败”错误的“方法”“添加”的变体。以下是可能的原因和解决方法:
:-)嗯。。在这段代码之前有一个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)自动化错误。调用的对象已与其客户端断开连接。我发现更奇怪的是,当我调试时,它进行得很顺利