2017-01-09 74 views
1

我對VBA很陌生,在Java和C++之前很生疏,所以對此有所幫助。在總覽中,我試圖讓該程序找到一個數字,並將該月解釋爲外部工作簿中的工作表編號,然後根據第一個數字返回一個值。我有這樣做,但我不能讓循環結束在第一個空單元格。這可能是lookFor中的範圍或循環語句的問題;我不確定。有什麼想法嗎?下面是代碼獲得一個循環以停止VBA中的打印

Sub Go() 

    Range("B6").Select 
    Do Until IsEmpty(ActiveCell) 

    Dim lookFor As Range 
    Dim srchRange As Range 
    Dim book1 As Workbook 
    Dim book2 As Workbook 
    Dim book2Name As String 
    book2Name = "Cash_Office_Long_Short_Log_FYE18.xlsx" 
    Dim book2NamePath As String 
    book2NamePath = ThisWorkbook.Path & "\" & book2Name 
    Dim refMonth As Integer 
    refMonth = Month(Cells(6, 5)) + 1 

    Debug.Print "refMonth="; refMonth 

    Set book1 = ThisWorkbook 

    If IsOpen(book2Name) = False Then Workbooks.Open (book2NamePath) 
    Set book2 = Workbooks(book2Name) 

    Set lookFor = book1.Sheets(1).Range("B6:B800") 
    Set srchRange = book2.Sheets(refMonth).Range("A1:B800") 

    lookFor.Offset(0, -1).Value = Application.VLookup(lookFor, srchRange, 2, False) 

    ActiveCell.Offset(1, 0).Select 

    Loop 

End Sub 

Function IsOpen(strWkbNm As String) As Boolean 

    On Error Resume Next 
    Dim wBook As Workbook 
    Set wBook = Workbooks(strWkbNm) 
    If wBook Is Nothing Then 
    IsOpen = False 
    Set wBook = Nothing 
    On Error GoTo 0 
    Else 
    IsOpen = True 
    Set wBook = Nothing 
    On Error GoTo 0 
    End If 

End Function 
+0

您的問題引起.xlsx'。但是,在嘗試執行帶有795個單元格範圍內的搜索項的VLookup時,您也遇到了問題 - 這會導致類型不匹配錯誤。你實際上只是試圖在原始頁面的B6,B7,B8等中搜索單元格嗎? – YowE3K

+0

活動可能會在該表中,但在運行它的測試實例中總是在book1或Thisworkbook中。我只是在book2中的book1中搜索B列中單元格的值。 – Rsheale

+0

所以你的代碼永遠不會打開第二個工作簿?開始時它總是打開的? – YowE3K

回答

0

你的循環問題是由您使用的ActiveCell造成的。一旦你打開一個新的工作簿,活動單元就變成了該工作簿中的一個單元,並且導致你的循環變得非常困惑。

請參考How to avoid using Select in Excel VBA macros,瞭解如何避免這些問題的建議。

在我已經重構你的代碼(希望)同時做你試圖做:用`ActiveCell`,這可能是在活動工作表中`Cash_Office_Long_Short_Log_FYE18

'Change name of sub - "Go" isn't valid 
Sub RunMe() 
    Dim controlRow As Long 
    Dim lookFor As Range 
    Dim srchRange As Range 
    Dim book1 As Workbook 
    Dim book2 As Workbook 
    Dim book2Name As String 
    Dim book2NamePath As String 
    Dim refMonth As Integer 

    Set book1 = ThisWorkbook 
    With book1.Worksheets(1) ' I have assumed that the active sheet was worksheets(1) 
     'Set row pointer to start at row 6 
     controlRow = 6 
     Do Until IsEmpty(.Cells(controlRow, "B")) 

      book2Name = "Cash_Office_Long_Short_Log_FYE18.xlsx" 
      book2NamePath = ThisWorkbook.Path & "\" & book2Name 
      refMonth = Month(.Cells(6, 5)) + 1 'Should this be controlRow rather than 6? 

      Debug.Print "refMonth="; refMonth 

      If Not IsOpen(book2Name) Then Workbooks.Open book2NamePath 
      Set book2 = Workbooks(book2Name) 

      Set lookFor = .Cells(controlRow, "B") ' Assumed that you are searching for value on this row 
      Set srchRange = book2.Worksheets(refMonth).Range("A1:B800") 

      lookFor.Offset(0, -1).Value = Application.VLookup(lookFor.Value, srchRange, 2, False) 

      'Point to next row 
      controlRow = controlRow + 1 
     Loop 
    End With 

End Sub 

Function IsOpen(strWkbNm As String) As Boolean 
    On Error Resume Next 
    Dim wBook As Workbook 
    Set wBook = Workbooks(strWkbNm) 
    IsOpen = Not (wBook Is Nothing) 
    Set wBook = Nothing 
    On Error GoTo 0 
End Function