在被调用的子例程中,读取单元格时出现“需要对象”错误

时间:2017-08-01 13:23:50

标签: excel excel-vba vba

我的项目包括使用未使用的工作簿中的宏从文件夹中的多个不同工作簿中读取数据。我一直在确定从哪个工作簿中提取信息,到目前为止工作正常。但是,我的程序太大了,所以我现在在底部有一些子程序,我在进程的中间调用。当我这样称呼时,我收到“需要对象”的错误。以下是相关剪辑:

Sub LoopFiles()
Dim MyFileName, FilenameNew, MyPath As String
Dim wb1 As Workbook

MyPath = "C:\ExcelT2\"
MyFileName = Dir(MyPath & "*.csv")

Do Until MyFileName = ""
    Set wb1 = Workbooks.Open(MyPath & MyFileName)

With wb1

    .Sheets.Add After:=.Worksheets(.Worksheets.Count)
    .Sheets.Add After:=.Worksheets(.Worksheets.Count)

    wb1.Worksheets(1).Select

    For i = 17 To 5000

        ElseIf wb1.Worksheets(1).Cells(i, 3) <> wb1.Worksheets(1).Cells((i - 1), 3) Then
            cn = cn + 1
            prevval = prevval + 1

            Call One_Wep
'......

        End If
    End With
Loop

End Sub

Private Sub One_Wep()
        If wb1.Worksheets(1).Cells(i, 1) = 1 And wb1.Worksheets(1).Cells((i + 3), 1) = 11 And wb1.Worksheets(1).Cells(i, 3) = wb1.Worksheets(1).Cells((i + 3), 3) And wb1.Worksheets(1).Cells((i + 2), 6) <> 57 Then
            OneWep = 1

'......
        End If
End Sub

One_Wep下显示的If语句发生错误。我认为这可能与在被调用函数中引用wb1有关,但在环顾四周后我无法弄清楚如何解决这个问题。提前谢谢!

3 个答案:

答案 0 :(得分:1)

由于wb1尚未声明全球,因此无法解析它。

Dim移到模块中的所有子和函数之上。

答案 1 :(得分:1)

您需要传递wb1工作簿对象。

更改您从Sub致电的方式:

Call One_Wep

要:

One_Wep wb1 '<-- this will pass wb1 object to your sub, there's no need to use `Call`

并改变Sub的定义方式:

Private Sub One_Wep()

要:

Private Sub One_Wep(wb1 As Workbook)

这同样适用于您的i变量。

总的来说,你需要用:

来调用它
One_Wep wb1, i

并将您的Sub定义更改为:

Private Sub One_Wep(wb1 As Workbook, i As Integer)

答案 2 :(得分:1)

问题是你没有在子程序中定义wb1或i。解决这个问题的最简单方法是将它们作为参数传递。

Private Sub One_Wep(i as Integer, wb1 as WorkBook)