2017-02-01 15 views
1

私は2つのワークブックがありますVBA値が一致する別のブックに値をコピーしますか?

"LO配達追跡者"

Col A 
01/01/2017 
02/01/2017 
15/01/2017 
15/03/2017 
12/03/2017 

そして、 "報告書" と呼ばれる別のワークブックを

私は「LO配信のシート1で私のコラムを検索したい
A1 = 01  Column E 
    A2 = 2017   

セルA1の月とセルA2の年と一致する日付の「トラッカー」を「レポート」ワークブックに表示します。

次に、 "L.O. Delivery Tracker"ワークブックの一致するすべての値を、 "Report"ワークブックのE列にコピーします。

望ましい結果:

Sub CopyBasedonSheet1() 

'open workbook if not open 
Dim WB As Workbook 
On Error Resume Next 
Set WB = Workbooks("L.O. Delivery Tracker.xlsm") 
On Error GoTo 0 
If WB Is Nothing Then 
    Set WB = Workbooks.Open("C:\Users\Mark O'Brien\Desktop\L.O. Delivery Tracker.xlsm") 
End If 

Dim i As Long 
Dim j As Long 
Sheet1LastRow = ThisWorkbook.Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row 
Sheet2LastRow = WB.Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row 

    For j = 1 To Sheet1LastRow 
     For i = 1 To Sheet2LastRow 
      If Month(WB.Worksheets(1).Cells(i, 4).Value) = ThisWorkbook.Worksheets(1).Range("O8").Value Then 
       ThisWorkbook.Worksheets(2).Cells(j).Value = WB.Worksheets(1).Cells(i, 1).Value 

      Else 
      End If 
     Next i 
    Next j 
End Sub 

を私はブランドのVBAに新たなんだと私はイムは、この間違っているかなり確信している:

Column E 
01/01/2017 
02/01/2017 
15/01/2017 

ここで私が試したものです。誰かが私がどこに間違っているのかを教えてもらえますか?編集2 @Shaiラドーによって

Option Explicit 

Sub CopyBasedonSheet1() 

Dim WB As Workbook 
Dim i As Long 
Dim j As Long 
Dim LastRow As Long 

On Error Resume Next 
Set WB = Workbooks("L.O. Lines Delivery Tracker.xlsm") 
On Error GoTo 0 
If WB Is Nothing Then 'open workbook if not open 

Set WB = Workbooks.Open("G:\WH DISPO\(3) PROMOTIONS\(18) L.O. Delivery Tracking\L.O. Lines Delivery Tracker.xlsm") 

End If 

With WB.Worksheets(1) 
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    j = 1 

    For i = 1 To LastRow 
     If CInt(ThisWorkbook.Worksheets(1).Range("F9").value) = Month(WB.Worksheets(1).Range("A" & i).value) Then ' check if Month equals the value in "A1" 
      If CInt(ThisWorkbook.Worksheets(1).Range("F10").value) = Year(WB.Worksheets(1).Range("A" & i).value) Then ' check if Year equals the value in "A2" 
       ThisWorkbook.Worksheets(2).Range("E" & j).value = WB.Worksheets(1).Range("A" & i).value 
       j = j + 1 
      End If 
     End If 
    Next i 
End With 

End Sub 

を提供するコードで

EDIT

:私はそれが配信トラッカーワークブック上でのカラムAをルックアップするためになっていた@Shaiラドーするには、[OK]を

を謝罪しかし、私の日付はB列にあった。

更新されたコードをご覧ください。今、私はこの行の型の不一致エラーを取得:

If CInt(ThisWorkbook.Worksheets(1).Range("F9").value) = Month(.Range("B" & i).value) Then ' check if Month equals the value in "A1" 

コード

Option Explicit 

Sub CopyBasedonSheet1() 
Application.ScreenUpdating = False 
Dim app As New Excel.Application 
app.Visible = False 'Visible is False by default, so this isn't necessary 


Dim WB As Workbook 
Dim i As Long 
Dim j As Long 
Dim LastRow As Long 

On Error Resume Next 
Set WB = Workbooks("L.O. Lines Delivery Tracker.xlsm") 
On Error GoTo 0 
If WB Is Nothing Then 'open workbook if not open 

Set WB = Workbooks.Open("G:\WH DISPO\(3) PROMOTIONS\(18) L.O. Delivery Tracking\L.O. Lines Delivery Tracker.xlsm") 

End If 

With WB.Worksheets(1) 
    LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row 
    j = 1 

    For i = 1 To LastRow 
     If CInt(ThisWorkbook.Worksheets(1).Range("F9").value) = Month(.Range("B" & i).value) Then ' check if Month equals the value in "A1" 
      If CInt(ThisWorkbook.Worksheets(1).Range("F10").value) = Year(.Range("B" & i).value) Then ' check if Year equals the value in "A2" 
       ThisWorkbook.Worksheets(2).Range("E" & j).value = .Range("B" & i).value 
       j = j + 1 
      End If 
     End If 
    Next i 
End With 
Application.ScreenUpdating = True 
End Sub 

EDIT 3:

ます。Option Explicit:

@Shaiラドー、コードは現在このようになります。

Sub CopyBasedonSheet1() 

Dim WB As Workbook 
Dim i As Long 
Dim j As Long 
Dim LastRow As Long 

On Error Resume Next 
Set WB = Workbooks("L.O. Lines Delivery Tracker.xlsm") 
On Error GoTo 0 
If WB Is Nothing Then 'open workbook if not open 
    Set WB = Workbooks.Open("G:\WH DISPO\(3) PROMOTIONS\(18) L.O. Delivery Tracking\L.O. Lines Delivery Tracker.xlsm") 
End If 

' ======= Edit #2 , also for DEBUG ====== 
With WB.Worksheets(1) 
    LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row 
    j = 1 

    For i = 1 To LastRow 
     ' === For DEBUG ONLY === 
     Debug.Print CInt(ThisWorkbook.Worksheets(1).Range("F9").value) 
     Debug.Print Month(.Range("B" & i).value) 
     Debug.Print CInt(ThisWorkbook.Worksheets(1).Range("F10").value) 
     Debug.Print Year(.Range("B" & i).value) 


     If CInt(ThisWorkbook.Worksheets(1).Range("F9").value) = Month(.Range("B" & i).value) Then ' check if Month equals the value in "A1" 
      If CInt(ThisWorkbook.Worksheets(1).Range("F10").value) = Year(.Range("B" & i).value) Then ' check if Year equals the value in "A2" 
       MsgBox "OK, Passed the 2 Ifs" 
       ThisWorkbook.Worksheets(2).Range("E" & j).value = .Range("B" & i).value 
       j = j + 1 
      End If 
     End If 
    Next i 
End With 

End Sub 

元のブック、配信トラッカー、(私は日付をコピーしています):

enter image description here

enter image description here

ブックへのコピーのフォーマット:レポート、シート1 セルF9とF10が含まれています< --- F9とF10の両方が明らかに数値形式です。

enter image description here

コピーブックには:レポート、シート2(iは、列Eに貼り付けデータを必要とする場合)ワークシートの列A内のすべての値を介して

enter image description here

+0

コードがエラーをスローしていますか?どのように機能しないのですか?また、 'Rows.Count'、' Columns.Count'、 'Cells()'などを使うときは、それを実行したいワークシートで修飾する必要があります。それ以外の場合は実行されます予期しない値を返すActiveSheet – BruceWayne

+0

レポートのブック内でマクロを実行していると仮定すると、BruceWayneの説明どおりにシートやワークブックを指定する必要があります。その場合、検証と貼り付けのたびにレポートブックを呼び出す必要はありません。状況をもう少し詳しくご説明ください。 – jsanchezs

答えて

0

意志ループ以下のコード(1) "LO Delivery Tracker"ワークブックで、MonthYearを、ワークシート(1)の列Aの値をThisWorkbookと比較してください。結果は、ワークシート(1)の列Eに記載されています。

:あなたは、ブック内のワークシートの順序を変更した場合は、エラー、または予期しない結果が得られます、Worksheets(1)を使用することは危険であることに注意してください。私はのようにWorksheet.Nameを参照することを好みます。このコードを実行した後の結果の

コード

Option Explicit 

Sub CopyBasedonSheet1() 

Dim WB As Workbook 
Dim i As Long 
Dim j As Long 
Dim LastRow As Long 

On Error Resume Next 
Set WB = Workbooks("L.O. Delivery Tracker.xlsm") 
On Error GoTo 0 
If WB Is Nothing Then 'open workbook if not open 
    Set WB = Workbooks.Open("C:\Users\Mark O'Brien\Desktop\L.O. Delivery Tracker.xlsm") 
End If 

' ======= Edit #2 , also for DEBUG ====== 
With WB.Worksheets(1) 
    LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row 
    j = 1 

    For i = 1 To LastRow 
     ' === For DEBUG ONLY === 
     Debug.Print CInt(ThisWorkbook.Worksheets(1).Range("F9").Value) 
     Debug.Print Month(.Range("B" & i).Value) 
     Debug.Print CInt(ThisWorkbook.Worksheets(1).Range("F10").Value) 
     Debug.Print Year(.Range("B" & i).Value) 


     If CInt(ThisWorkbook.Worksheets(1).Range("F9").Value) = Month(.Range("B" & i).Value) Then ' check if Month equals the value in "A1" 
      If CInt(ThisWorkbook.Worksheets(1).Range("F10").Value) = Year(.Range("B" & i).Value) Then ' check if Year equals the value in "A2" 
       MsgBox "OK, Passed the 2 Ifs" 
       ThisWorkbook.Worksheets(2).Range("E" & j).Value = .Range("B" & i).Value 
       j = j + 1 
      End If 
     End If 
    Next i 
End With  

End Sub 

スクリーンショット:

enter image description here

+0

は今や素晴らしい作品です。私が別の行を追加すると、対応する値を他の列にコピーすることができます:ThisWorkbook.Worksheets(2).Range( "B"&j).value = .Range( "G"&i).value – user7415328

+0

最初の行に別の行を追加すると、セルの値が日付ではなく普通の場合に 'Month(.Range(" G "&i).value)'を使用しようとするとエラーが発生することに注意してくださいテキスト、エラーが発生します –

関連する問題