Excel VBA错误1004应用程序定义错误或对象定义错误

Excel VBA错误1004应用程序定义错误或对象定义错误,excel,vba,Excel,Vba,如果可能的话,我会得到帮助。 我在同一工作簿中有两张工作表。通过表单,我搜索Dados工作表并将结果复制到Pesquisa工作表。结果显示在列表视图中。当我双击结果时,会出现错误1004应用程序定义错误或对象定义错误。我不理解错误的原因,因为我已经检查了我的代码,没有发现任何问题 非常感谢你的帮助。下面,按照我的代码 Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Sheets("D

如果可能的话,我会得到帮助。 我在同一工作簿中有两张工作表。通过表单,我搜索Dados工作表并将结果复制到Pesquisa工作表。结果显示在列表视图中。当我双击结果时,会出现错误1004应用程序定义错误或对象定义错误。我不理解错误的原因,因为我已经检查了我的代码,没有发现任何问题

非常感谢你的帮助。下面,按照我的代码

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)  
      Sheets("Dados").Range("A" & Sheets("Pesquisa").Range("W" & ListBox1.ListIndex + 2)).Select
    End Sub

不确定这是否是问题所在,但可能需要在表达式中包含.Value

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)  
    Sheets("Dados").Range("A" & Sheets("Pesquisa").Range("W" & ListBox1.ListIndex + 2).Value).Select
End Sub

此外,您是否确信sheetSpesqusussa.RangeW&ListBox1.ListIndex+2.处的值为正整数?如果不是,这将抛出您收到的错误。

不确定这是否是问题所在,但您可能需要在表达式中包含.Value

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)  
    Sheets("Dados").Range("A" & Sheets("Pesquisa").Range("W" & ListBox1.ListIndex + 2).Value).Select
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "You selected:" & vbCrLf & ListBox1.ListIndex & ": " & ListBox1.List(ListBox1.ListIndex)
    'Sheets("Dados").Range("A" & Sheets("Pesquisa").Range("W" & ListBox1.ListIndex + 2)).Select
End Sub
此外,您是否确信sheetSpesqusussa.RangeW&ListBox1.ListIndex+2.处的值为正整数?如果不是,这将抛出您正在接收的错误

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "You selected:" & vbCrLf & ListBox1.ListIndex & ": " & ListBox1.List(ListBox1.ListIndex)
    'Sheets("Dados").Range("A" & Sheets("Pesquisa").Range("W" & ListBox1.ListIndex + 2)).Select
End Sub
这是一个单一的声明中发生的很多事情,有几个原因导致事情出错

把它拆开

首先获取工作表对象:

接下来,我们要从ListBox1.ListIndex在W列中构建一个范围地址字符串,并从pesquisaSheet中的该单元格中获取一个行索引:

然后我们要在列A中构建另一个范围地址字符串:

最后,我们要选择该范围:

targetRange.Select
当然,它更多的是代码,而且可以说比需要的局部变量要多一些。但是,由于所有内容都是显式的,并且每个成员都在自己的指令中调用,因此任何给定的指令只有一个失败的原因,这使得调试更加容易

这是一个单一的声明中发生的很多事情,有几个原因导致事情出错

把它拆开

首先获取工作表对象:

接下来,我们要从ListBox1.ListIndex在W列中构建一个范围地址字符串,并从pesquisaSheet中的该单元格中获取一个行索引:

然后我们要在列A中构建另一个范围地址字符串:

最后,我们要选择该范围:

targetRange.Select

当然,它更多的是代码,而且可以说比需要的局部变量要多一些。但是,由于所有内容都是显式的,并且每个成员都在自己的指令中调用,因此任何给定的指令都只有一个失败的原因,这使得调试更加容易。

如果为ListBox1.ListIndex+2添加一个控制表达式,您得到的数字是多少?我认为您调用的范围不正确。如果我假设ListBox1.ListIndex+2是一个数字,那么当前它解析为RangeA&W2,这是不正确的。您需要类似于…RangeA1:&…的内容作为猜测,我想说对sheetSpesqussa.RangeW&ListBox1.ListIndex+2的引用没有返回有效的数字。我建议将这些嵌套引用分解为中间变量,以明确您试图访问的对象,这样您就可以在访问过程中检查值。等等-您正在调用Dados表上的范围,但也尝试从另一个范围中选择一个范围。我相信这也是它失败的原因。@Ass3mbler,在这种情况下,我得到了数字2。如果你为ListBox1.ListIndex+2添加了一个控制表达式,你得到了什么数字?我认为你调用的范围不正确。如果我假设ListBox1.ListIndex+2是一个数字,那么当前它解析为RangeA&W2,这是不正确的。您需要类似于…RangeA1:&…的内容作为猜测,我想说对sheetSpesqussa.RangeW&ListBox1.ListIndex+2的引用没有返回有效的数字。我建议将这些嵌套引用分解为中间变量,以明确您试图访问的对象,这样您就可以在访问过程中检查值。等等-您正在调用Dados表上的范围,但也尝试从另一个范围中选择一个范围。我相信这也是它失败的原因。@Ass3mbler,在这种情况下,我得到了数字2。好的,好的,matthew mcconaughey voiceDim targetRange作为Range Set targetRange=dadosSheet.RangetargetAddress是的,这里实际抛出的错误,出现以下消息:运行时错误1004:_工作表对象的Range方法失败。@user2734504因此,现在只需查看实际工作表中sourceRowAddress的值,即可找到工作表中包含错误数据的位置=@user2734504,空单元格使targetAddress为A0,这就是抛出错误1004的原因:@user2734504看起来你已经走上正轨了!好吧好吧matthew mcconaughey voiceDim targetRange作为范围集targetRange=dadosSheet.RangetargetAddress是的,这里实际抛出的错误,出现以下消息:运行时错误1004:_工作表对象的Range方法失败。@user2734504因此,现在您只需查看实际工作表中sourceRowAddress的值,即可找到工作表中包含错误数据的位置=@user2734504,空单元格使targetAddress为A0,这就是引发错误1004的原因:@user2
734504看起来你走上正轨了!事实上,这就是错误1004可能被抛出的一个原因——投票表决=@值是隐式的,使其显式除了提高可读性之外没有任何实际的区别。试着按照另一个答案中的建议来分解这个表达;有一个断言肯定会失败。考虑一下,首先尝试MsgBox SheetsPesquisa.RangeW&ListBox1.ListIndex+2.Value,看看您得到了什么值。其次,在Listbox1之前可能需要一个工作表引用,例如:SheetSpesqussa.RangeW&SheetSpesqussa.Listbox1.ListIndex+2.Value。第三,我知道有时候直接引用组合框对我不起作用,所以我必须按照以下思路做一些事情:sheetspesqussa.OLEObjectsListBox1.Object.ListIndex,在您的案例中可能不需要,但希望给出一个参考答案是的,请务必查看@MathieuGuindon的答案,您可以真正缩小错误发生的原因列表框1对我来说并不是一个问题;代码似乎位于listbox控件的处理程序中,因此它的位置没有区别:如果它是一个UserForm,那么它隐式地是Me.ListBox1;如果它是一个工作表,那么它仍然隐式地是我。ListBox1-用除我之外的任何东西限定它,使它成为一个迂回的引用-事实上,这就是错误1004可能被抛出的一个原因——投票表决=@值是隐式的,使其显式除了提高可读性之外没有任何实际的区别。试着按照另一个答案中的建议来分解这个表达;有一个断言肯定会失败。考虑一下,首先尝试MsgBox SheetsPesquisa.RangeW&ListBox1.ListIndex+2.Value,看看您得到了什么值。其次,在Listbox1之前可能需要一个工作表引用,例如:SheetSpesqussa.RangeW&SheetSpesqussa.Listbox1.ListIndex+2.Value。第三,我知道有时候直接引用组合框对我不起作用,所以我必须按照以下思路做一些事情:sheetspesqussa.OLEObjectsListBox1.Object.ListIndex,在您的案例中可能不需要,但希望给出一个参考答案是的,请务必查看@MathieuGuindon的答案,您可以真正缩小错误发生的原因列表框1对我来说并不是一个问题;代码似乎位于listbox控件的处理程序中,因此它的位置没有区别:如果它是一个UserForm,那么它隐式地是Me.ListBox1;如果它是一个工作表,那么它仍然隐式地是我。ListBox1-用除我之外的任何东西限定它,使它成为一个迂回的引用-在本例中,msgbox显示:“您选择了:0:2”。这意味着已选择Listbox1中的Entry0。此条目的值为2。现在,您可以根据@Mathieu Guindon的优秀答案继续。在本例中,msgbox显示:“您选择了:0:2”。这意味着已选择Listbox1中的Entry0。此条目的值为2。现在您可以根据@Mathieu Guindon的精彩答案继续。
targetRange.Select