2017-08-01 10 views
1

我的項目包括使用未使用工作簿中的宏從文件夾中的多個不同工作簿中讀取數據。我一直在定義從哪個工作簿獲取信息,而且目前工作狀況良好。但是,我的程序太大了,所以我現在在我的流程中間調用了一些底層的子程序。當我打電話給我時,我得到一個「需要對象」的錯誤。以下是相關剪輯:在調用子程序中,讀取單元格時出現「需要對象」錯誤

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有關,但是在四處查看後,我無法弄清楚如何解決這個問題。提前致謝!

回答

1

您需要通過wb1工作簿對象。

變化的方式,你打電話給你Sub來自:

Call One_Wep 

要:

Private Sub 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(wb1 As Workbook) 

這同樣適用於您的i變量。


總體而言,你需要調用它:

One_Wep wb1, i 

和改變你Sub定義:

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

對於需要傳入的其他變量(例如,我是否需要這樣做? – Rosie

+0

@Rosie是的,但是如果你有太多的人,你可以考慮將它們聲明爲'Public',或者將它們定義在模塊的頂部(對於同一模塊中的所有'Sub's都可以識別) –

1

因爲wb1尚未聲明全局而言,子無法解析它。

Dim移到模塊中的所有子和功能之上。

1

的問題是,你沒有定義WB1或者我內子程序。解決這個問題的最簡單方法是將它們作爲參數傳遞。

Private Sub One_Wep(i as Integer, wb1 as WorkBook) 
相關問題