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

あなたの問題はCash_Office_Long_Short_Log_FYE18 'でアクティブシートに潜在的にある' ActiveCell'を、使用によって引き起こされます.xlsx'。しかし、検索項目が795セルの範囲である「VLookup」を実行しようとすると、タイプミスマッチエラーが発生するという問題もあります。実際には、元のシートのB6、B7、B8などのセルを検索しようとしていますか? – YowE3K

+0

アクティブシートは潜在的にそのシートに存在する可能性がありますが、実行したテストインスタンスでは常にbook1またはThisWorkbookにあります。私はbook2のbook1からB列のセルの値を探しています。 – Rsheale

+0

コードで2番目のワークブックを開くことはありませんか?あなたが始めるときはいつも開いていますか? – 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 
関連する問題