【问题标题】:Excel VBA Run time Error 424: Object RequiredExcel VBA 运行时错误 424:需要对象
【发布时间】:2020-05-17 12:21:13
【问题描述】:

我是 VBA 和一般编码方面的新手,如果满足条件粘贴到另一本书中,我会尝试从同一工作簿中的单元格获取数据。

我在尝试获取在 Excel 单元格中输入的值时遇到此错误:

Run Time Error '424' object required

当我按下调试按钮时,它会转到第一行并突出显示它。我无法识别为什么会这样?此外,当在监视窗口中时,它会显示 a=0。

代码是

Sub copycells()
    a = ThisWorkbook.Worksheets("Sale").Cells(Row.Count, 2).End(xlUp).Row
    For i = 2 To a
    If Worksheets("Sale").Cells(i, 6).Value = "Parmesh" Then
    Worksheets("Sale").Row(i).copy
    Workbooks("Source.xlsx").Worksheets("Billdetails").Activate
    b = Workbooks("Source.xlsx").Worksheets("Billdetails").Cells(Row.Count, 2).End(xlUp).Row
    Workbooks("Source.xlsx").Worksheets("Billdetails").Cells(b + 1, 1).Select
    ActivateSheet.Paste
    Worksheets("Sale").Activate
    End If
    Next
    Application.CutCopyMode = False
    Workbooks("Purchase.xlsx").Worksheets("Sale").Cells(1, 1).Select
    End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    选项显式:你的朋友

    这应该教会你始终使用Option Explicit。如果您一直在使用它,可能会发生以下情况 (Compile error: Variable not defined):

    确定后:

    您发现Row 有问题。

    在更改为Rows 后,另一个Compile error: Variable not defined。确定后:

    您发现a = 有问题。

    在添加Dim a As Long 后,再添加一个Compile error: Variable not defined。确定后:

    您发现i 有问题。

    在添加Dim i As Long 后,再添加一个Compile error: Variable not defined。确定后:

    你又发现Row 有问题了。

    更改为Rows 后,另一个Compile error: Variable not defined。确定后:

    您发现b = 有问题。

    在添加Dim b As Long 后,再添加一个Compile error: Variable not defined。确定后:

    您发现ActivateSheet 有问题。

    改成ActiveSheet后终于Run-time error

    Debug之后:

    Row 看起来又可疑了。

    改成Rows后又是Run-time error

    Debug之后:

    您发现ActiveSheet.Paste 有问题,尤其是Paste

    改成ActiveSheet.PasteSpecial后另一个Run-time error

    Debug之后:

    您发现Worksheets("Sale").Activate 有问题。

    由于 Source.xlsx 处于活动状态,您可以考虑更改为 Workbooks("Purchase.xlsx").Worksheets("Sale").Activate,一切终于正常。还是这样?

    守则

    Option Explicit
    
    Sub copycells()
        Dim a As Long
        Dim b As Long
        Dim i As Long
        With ThisWorkbook.Worksheets("Sale")
            a = .Cells(.Rows.Count, 2).End(xlUp).Row
            For i = 2 To a
                If .Cells(i, 6).Value = "Parmesh" Then
                    .Rows(i).Copy
                    With Workbooks("Source.xlsx").Worksheets("Billdetails")
                        b = .Cells(.Rows.Count, 2).End(xlUp).Row
                        .Cells(b + 1, 1).PasteSpecial
                    End With
                End If
            Next
            ' If Purchase.xlsx and ThisWorkbook are the same then use the following:
            '.Cells(1).Select
        End With
        Application.CutCopyMode = False
        ' If Purchase.xlsx and ThisWorkbook are not the same then use the following:
        'Workbooks("Purchase.xlsx").Worksheets("Sale").Cells(1, 1).Select
    End Sub
    
    
    ' Assuming that you need only values and that "Thisworkbook" is "Purchase.xlsx"
    Sub copyCellsValues()
    
        Const SourceBook As String = "Source.xlsx"
        Const SourceSheet As String = "Billdetails"
        Const MainSheet As String = "Sale"
        Const MainColumn As Long = 6
        Const Criteria As String = "Parmesh"
    
        Dim Sale As Worksheet
        Dim Bill As Worksheet
        Dim a As Long
        Dim b As Long
        Dim i As Long
    
        Set Sale = ThisWorkbook.Worksheets(MainSheet)
        Set Bill = Workbooks(SourceBook).Worksheets(SourceSheet)
    
        a = Sale.Cells(Sale.Rows.Count, 2).End(xlUp).Row
        b = Bill.Cells(Bill.Rows.Count, 2).End(xlUp).Row + 1
    
        For i = 2 To a
            If Sale.Cells(i, MainColumn).Value = Criteria Then
                Bill.Rows(b).Value = Sale.Rows(i).Value
                b = b + 1
            End If
        Next
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      首先,您似乎需要声明丢失的变量:

      Sub copycells()
          Dim a as Integer
          Dim b as Integer
          a = ThisWorkbook.Worksheets("Sale").Cells(Row.Count, 2).End(xlUp).Row
          For i = 2 To a
            If Worksheets("Sale").Cells(i, 6).Value = "Parmesh" Then
               Worksheets("Sale").Row(i).copy
               Workbooks("Source.xlsx").Worksheets("Billdetails").Activate
               b = Workbooks("Source.xlsx").Worksheets("Billdetails").Cells(Row.Count, 2).End(xlUp).Row
               Workbooks("Source.xlsx").Worksheets("Billdetails").Cells(b + 1, 1).Select
              ActivateSheet.Paste
              Worksheets("Sale").Activate
           End If
         Next
         Application.CutCopyMode = False
         Workbooks("Purchase.xlsx").Worksheets("Sale").Cells(1, 1).Select
      End Sub
      
      

      另外,您可以尝试使用Set 运算符。

      无论如何,尚不清楚哪个属性或方法会出错。所以,我建议打破属性和方法调用链:

      a = Workbooks("Purchase.xlsx").Worksheets("Sale").Cells(Rows.Count, 2).End(xlUp).Row
      

      只需在单独的代码行中声明一个属性或方法即可。例如:

      Dim workbk as Excel.Workbook
      Dim worksht as Excel.Worksheet
      
      Set workbk = Workbooks("Purchase.xlsx")
      Set worksht = workbk.Worksheets("Sale")
      

      按照这种方式,您将能够找到有问题的调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多