我的项目包括使用未使用工作簿中的宏从文件夹中的多个不同工作簿中读取数据。我一直在准确定义要从哪个工作簿中提取信息,到目前为止工作正常。但是,我的程序太大了,所以我现在在底部有几个子例程,我在过程中调用它们。当我调用它时,我收到"需要对象"错误。以下是相关剪辑:
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 有关,但在环顾四周后,我不知道如何解决这个问题。提前感谢!
您需要传递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)
问题是你没有在子例程中定义 wb1 或 i。解决此问题的最简单方法是将它们作为参数传递。
Private Sub One_Wep(i as Integer, wb1 as WorkBook)
由于尚未将wb1
声明为全局,因此 sub 无法解析它。
将Dim
移动到模块中所有子和函数的上方。