Vba 所选案例中需要对象(错误424)

Vba 所选案例中需要对象(错误424),vba,excel,error-handling,compiler-errors,Vba,Excel,Error Handling,Compiler Errors,我在VBA编辑器Sheet2中有以下代码: Sub Organize_Data() Dim i As Integer Dim S2 As Worksheet, S3 As Worksheet Application.ScreenUpdating = False Set S2 = ThisWorkbook.Sheets("Sheet2") Set S3 = ThisWorkbook.Sheets("Sheet3") S3.Range("A:G").Clear S2.Range("F:H").Co

我在VBA编辑器Sheet2中有以下代码:

Sub Organize_Data()
Dim i As Integer
Dim S2 As Worksheet, S3 As Worksheet
Application.ScreenUpdating = False
Set S2 = ThisWorkbook.Sheets("Sheet2")
Set S3 = ThisWorkbook.Sheets("Sheet3")

S3.Range("A:G").Clear
S2.Range("F:H").Copy Destination:=S3.Range("A:C")
S2.Range("P:P").Copy Destination:=S3.Range("F:F")
S2.Range("K:K").Copy Destination:=S3.Range("G:G")


S3.Columns("A:G").Sort key1:=S3.Range("A2"), _
order1:=xlAscending, Header:=xlYes

S3.Cells(1, 4) = "Name Boy"
S3.Cells(1, 5) = "Name Girl"
Last = S3.Cells(Rows.Count, "A").End(xlUp).Row
For i = Last To 2 Step -1
If Len(S3.Cells(i, "A")) = 16 Or Len(S3.Cells(i, "A")) = 18 Then
Boys_Girls1
ElseIf Len(S3.Cells(i, "A")) = 23 Then
Boys_Girls2
Else
S3.Cells(i, "D") = ""
S3.Cells(i, "E") = ""
End If
Next i

End Sub

Sub Boys_Girls1()
BOY = Mid(S3.Cells(i, "A"), 6, 2)
Select Case BOY
    Case Is = "AM", "01"
        S3.Cells(i, "D") = "Aaron Mitchels"
    Case Is = "BP"
        S3.Cells(i, "D") = "Brian Parker"
    Case Else
        S3.Cells(i, "D") = ""
End Select
GIRL = Mid(S3.Cells(i, "A"), 8, 2)
Select Case GIRL
    Case Is = "AL"
        S3.Cells(i, "E") = "Alexa"
    Case Is = "EQ", "02"
        S3.Cells(i, "E") = "Elizabeth Queen"
    Case Else
        S3.Cells(i, "E") = ""
End Select
End Sub

Sub Boys_Girls2()
BOY = Mid(S3.Cells(i, "A"), 10, 2)
Select Case BOY
    Case Is = "AM", "01"
        S3.Cells(i, "D") = "Aaron Mitchels"
    Case Is = "BP"
        S3.Cells(i, "D") = "Brian Parker"
    Case Else
        S3.Cells(i, "D") = ""
End Select
GIRL = Mid(S3.Cells(i, "A"), 12, 2)
Select Case GIRL
    Case Is = "AL"
        S3.Cells(i, "E") = "Alexa"
    Case Is = "EQ", "02"
        S3.Cells(i, "E") = "Elizabeth Queen"
    Case Else
        S3.Cells(i, "E") = ""
End Select
End Sub
该程序的目的是从Sheet2复制数据集并将其粘贴到Sheet3,然后组织格式,如执行升序和标记数据。当我运行程序时,运行时错误“424”:所需对象不断弹出。错误没有指向任何行,但是当代码没有调用过程时,它可以完美地工作。几个小时以来,我一直无法找到一种方法来解决这个问题,也无法从在线搜索中找到一个想法。这里有人能解释一下我的程序中有什么错误以及如何修复它吗?

看看你的代码(假设你已经包含了所有内容),你似乎从来没有在最后一个to子例程中定义过
BOY
GIRL
变量。将行
Dim BOY作为String,Girl作为String
添加到这两个sub中,应该可以消除该错误

正如另一位评论者所指出的,由于变量的作用域,S3变量也不可用于后续的子例程。您可以将其作为子例程的参数传递,也可以使变量成为全局变量。任何一种解决方案都会奏效

一般来说,您似乎在变量范围方面存在问题。这可以帮助您理解VBA中的细微差别。就这个问题而言,你确定有必要调用一个单独的例程吗?由于例程的长度很短,而且它们似乎只在一种情况下被调用,因此您可以通过简单地将这些进程移动到原始例程中来同时解决大多数问题

为了回应OP的评论,我将代码的固定部分包括在下面:

If Len(S3.Cells(i, "A")) = 16 Or Len(S3.Cells(i, "A")) = 18 Then
Boys_Girls1(S3,i)
ElseIf Len(S3.Cells(i, "A")) = 23 Then
Boys_Girls2(S3,i)



Sub Boys_Girls1(InputSheet As WorkSheet, InputRow As Long)
'Your code here (replace calls to S3 with InputSheet and calls to i with InputRow)
End Sub

Sub Boys_Girls2(InputSheet As WorkSheet, InputRow As Long)
'Your code here (replace calls to S3 with InputSheet and calls to i with InputRow)
End Sub
查看您的代码(并假设您已经包含了所有内容),您似乎从未在最后一个to子例程中定义
BOY
GIRL
变量。将行
Dim BOY作为String,Girl作为String
添加到这两个sub中,应该可以消除该错误

正如另一位评论者所指出的,由于变量的作用域,S3变量也不可用于后续的子例程。您可以将其作为子例程的参数传递,也可以使变量成为全局变量。任何一种解决方案都会奏效

一般来说,您似乎在变量范围方面存在问题。这可以帮助您理解VBA中的细微差别。就这个问题而言,你确定有必要调用一个单独的例程吗?由于例程的长度很短,而且它们似乎只在一种情况下被调用,因此您可以通过简单地将这些进程移动到原始例程中来同时解决大多数问题

为了回应OP的评论,我将代码的固定部分包括在下面:

If Len(S3.Cells(i, "A")) = 16 Or Len(S3.Cells(i, "A")) = 18 Then
Boys_Girls1(S3,i)
ElseIf Len(S3.Cells(i, "A")) = 23 Then
Boys_Girls2(S3,i)



Sub Boys_Girls1(InputSheet As WorkSheet, InputRow As Long)
'Your code here (replace calls to S3 with InputSheet and calls to i with InputRow)
End Sub

Sub Boys_Girls2(InputSheet As WorkSheet, InputRow As Long)
'Your code here (replace calls to S3 with InputSheet and calls to i with InputRow)
End Sub

我会把你的例行程序写在下面。注意:我正在将
S3
I
变量传递给两个例程,并且
选项Explicit
应该在任何过程之前位于模块的最顶部

Option Explicit

Sub Organize_Data()

    Dim i As Integer
    Dim S2 As Worksheet, S3 As Worksheet
    Dim Last As Long
    Application.ScreenUpdating = False
    Set S2 = ThisWorkbook.Sheets("Sheet2")
    Set S3 = ThisWorkbook.Sheets("Sheet3")

    S3.Range("A:G").Clear
    S2.Range("F:H").Copy Destination:=S3.Range("A:C")
    S2.Range("P:P").Copy Destination:=S3.Range("F:F")
    S2.Range("K:K").Copy Destination:=S3.Range("G:G")

    S3.Columns("A:G").Sort key1:=S3.Range("A2"), _
        order1:=xlAscending, Header:=xlYes

    S3.Cells(1, 4) = "Name Boy"
    S3.Cells(1, 5) = "Name Girl"
    Last = S3.Cells(Rows.Count, "A").End(xlUp).Row
    For i = Last To 2 Step -1
        If Len(S3.Cells(i, "A")) = 16 Or Len(S3.Cells(i, "A")) = 18 Then
            Boys_Girls1 S3, i
        ElseIf Len(S3.Cells(i, "A")) = 23 Then
            Boys_Girls2 S3, i
        Else
            S3.Cells(i, "D") = ""
            S3.Cells(i, "E") = ""
        End If
    Next i

End Sub

Sub Boys_Girls1(S3 As Worksheet, i As Integer)

    Dim BOY As String, GIRL As String

    BOY = Mid(S3.Cells(i, "A"), 6, 2)
    Select Case BOY
        Case Is = "AM", "01"
            S3.Cells(i, "D") = "Aaron Mitchels"
        Case Is = "BP"
            S3.Cells(i, "D") = "Brian Parker"
        Case Else
            S3.Cells(i, "D") = ""
    End Select
    GIRL = Mid(S3.Cells(i, "A"), 8, 2)
    Select Case GIRL
        Case Is = "AL"
            S3.Cells(i, "E") = "Alexa"
        Case Is = "EQ", "02"
            S3.Cells(i, "E") = "Elizabeth Queen"
        Case Else
            S3.Cells(i, "E") = ""
    End Select

End Sub

Sub Boys_Girls2(Sht As Worksheet, i As Integer)

    Dim BOY As String, GIRL As String

    BOY = Mid(S3.Cells(i, "A"), 10, 2)
    Select Case BOY
        Case Is = "AM", "01"
            S3.Cells(i, "D") = "Aaron Mitchels"
        Case Is = "BP"
            S3.Cells(i, "D") = "Brian Parker"
        Case Else
            S3.Cells(i, "D") = ""
    End Select
    GIRL = Mid(S3.Cells(i, "A"), 12, 2)
    Select Case GIRL
        Case Is = "AL"
            S3.Cells(i, "E") = "Alexa"
        Case Is = "EQ", "02"
            S3.Cells(i, "E") = "Elizabeth Queen"
        Case Else
            S3.Cells(i, "E") = ""
    End Select

End Sub

我会把你的例行程序写在下面。注意:我正在将
S3
I
变量传递给两个例程,并且
选项Explicit
应该在任何过程之前位于模块的最顶部

Option Explicit

Sub Organize_Data()

    Dim i As Integer
    Dim S2 As Worksheet, S3 As Worksheet
    Dim Last As Long
    Application.ScreenUpdating = False
    Set S2 = ThisWorkbook.Sheets("Sheet2")
    Set S3 = ThisWorkbook.Sheets("Sheet3")

    S3.Range("A:G").Clear
    S2.Range("F:H").Copy Destination:=S3.Range("A:C")
    S2.Range("P:P").Copy Destination:=S3.Range("F:F")
    S2.Range("K:K").Copy Destination:=S3.Range("G:G")

    S3.Columns("A:G").Sort key1:=S3.Range("A2"), _
        order1:=xlAscending, Header:=xlYes

    S3.Cells(1, 4) = "Name Boy"
    S3.Cells(1, 5) = "Name Girl"
    Last = S3.Cells(Rows.Count, "A").End(xlUp).Row
    For i = Last To 2 Step -1
        If Len(S3.Cells(i, "A")) = 16 Or Len(S3.Cells(i, "A")) = 18 Then
            Boys_Girls1 S3, i
        ElseIf Len(S3.Cells(i, "A")) = 23 Then
            Boys_Girls2 S3, i
        Else
            S3.Cells(i, "D") = ""
            S3.Cells(i, "E") = ""
        End If
    Next i

End Sub

Sub Boys_Girls1(S3 As Worksheet, i As Integer)

    Dim BOY As String, GIRL As String

    BOY = Mid(S3.Cells(i, "A"), 6, 2)
    Select Case BOY
        Case Is = "AM", "01"
            S3.Cells(i, "D") = "Aaron Mitchels"
        Case Is = "BP"
            S3.Cells(i, "D") = "Brian Parker"
        Case Else
            S3.Cells(i, "D") = ""
    End Select
    GIRL = Mid(S3.Cells(i, "A"), 8, 2)
    Select Case GIRL
        Case Is = "AL"
            S3.Cells(i, "E") = "Alexa"
        Case Is = "EQ", "02"
            S3.Cells(i, "E") = "Elizabeth Queen"
        Case Else
            S3.Cells(i, "E") = ""
    End Select

End Sub

Sub Boys_Girls2(Sht As Worksheet, i As Integer)

    Dim BOY As String, GIRL As String

    BOY = Mid(S3.Cells(i, "A"), 10, 2)
    Select Case BOY
        Case Is = "AM", "01"
            S3.Cells(i, "D") = "Aaron Mitchels"
        Case Is = "BP"
            S3.Cells(i, "D") = "Brian Parker"
        Case Else
            S3.Cells(i, "D") = ""
    End Select
    GIRL = Mid(S3.Cells(i, "A"), 12, 2)
    Select Case GIRL
        Case Is = "AL"
            S3.Cells(i, "E") = "Alexa"
        Case Is = "EQ", "02"
            S3.Cells(i, "E") = "Elizabeth Queen"
        Case Else
            S3.Cells(i, "E") = ""
    End Select

End Sub


错误指向哪里?@RGA请查看我的编辑。我补充道:“错误并不指向任何行,但当它不调用过程时,代码可以完美地工作。”您的
S3
变量在第一个子部分声明,因此第二个或第三个例程不可见。您应该在模块级声明它,或者将它作为参数传递给其他例程。我所能看到的是,
Boys_Girls1
Boys_Girls2
过程不知道
I
意味着什么,因为它只在
Organize_Data
@Rory中声明过
S2
S3
变量或将它们也放入过程中,但错误不断出现。错误指向何处?@RGA请查看我的编辑。我补充道:“错误并不指向任何行,但当它不调用过程时,代码可以完美地工作。”您的
S3
变量在第一个子部分声明,因此第二个或第三个例程不可见。您应该在模块级声明它,或者将它作为参数传递给其他例程。我所能看到的是,
Boys_Girls1
Boys_Girls2
过程不知道
I
意味着什么,因为它只在
Organize_Data
@Rory中声明过
S2
S3
变量或将它们也放在过程中,但错误不断出现。您可以通过添加答案来修复代码吗?我很困惑。关于调用我提到的子程序,它说如果你不使用
Call
我同意Anastasiya-你可以只使用名称调用子程序,而不需要
Call
关键字。但是-您没有声明
i
,所以它是一个变体,意思是在代码的第一行
BOY=Mid(S3.Cells(i,“a”),6,2)
-
i
空的,这将导致出现错误。虽然确实可以在不使用
Call
关键字的情况下调用它们,最好的做法是始终包含它,这样您就可以更容易地看到引用子例程的位置。我个人更喜欢始终使用
应用程序。运行
方法,因为这样可以防止在子例程更改为私有或代码移动到其他模块时出现错误。从技术上讲,这不是运行代码的要求,而是避免将来头痛的好方法(因此,我将其包括在其他解决方案中),谢谢您的回答。我真的很感激。也谢谢你的建议。看来我终于找到了错误。(+1)@Anastasiya Romanova秀 如果我的解决方案(或其他解决方案)证明是您问题的正确答案,请将其标记为已接受,以便从未回答的问题队列中删除此问题。您可以修复代码吗