2017-01-09 2 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

Ваш проблема вызвана использованием 'ActiveCell', которое потенциально в активном листе в' Cash_Office_Long_Short_Log_FYE18 .xlsx'. Но у вас также есть проблемы с попыткой сделать «VLookup», при этом элемент поиска представляет собой диапазон из 795 ячеек, что дает ошибку несоответствия типа. Вы на самом деле просто пытаетесь найти ячейку в своих исходных листах B6, B7, B8 и т. Д.? – YowE3K

+0

Активен потенциально может быть на этом листе, но в тестовых экземплярах, которые я запускал, он всегда находится в book1 или Thisworkbook. Я просто ищу значение ячеек в столбце B из book1 в book2. – Rsheale

+0

Значит, ваш код никогда не открывает вторую книгу? Он всегда открыт, когда вы начинаете? – YowE3K

ответ

0

Ваш вопрос зацикливание вызвано использованием Вами ActiveCell. Как только вы открываете новую книгу, активная ячейка становится ячейкой в ​​этой книге, и это привело к тому, что ваш цикл стал очень запутанным.

Для получения информации о том, как избежать этих проблем, обратитесь к How to avoid using Select in Excel VBA macros.

В то же время я реорганизованным свой код (я надеюсь) делать то, что вы пытаетесь сделать:

'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 
Смежные вопросы