我的项目包括使用未使用的工作簿中的宏从文件夹中的多个不同工作簿中读取数据。我一直在确定从哪个工作簿中提取信息,到目前为止工作正常。但是,我的程序太大了,所以我现在在底部有一些子程序,我在进程的中间调用。当我这样称呼时,我收到“需要对象”的错误。以下是相关剪辑:
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有关,但在环顾四周后我无法弄清楚如何解决这个问题。提前谢谢!
答案 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)