シナリオVBAは値が一致する2つのブックから値を取得しますか?
私は、私はシート上のセルI8の値を3つのワークブック私のマスターブックで
Master
Planner
Phonebook
を持っている1.
マスター(シート1)
I8 = 2
シート2には次の空の列があります。
マスター(シート2)
Column A (number) Column B (Supplier) Column C (Contact)
私はプランナーのワークブックや電話帳、ブックの両方からのデータでこれらのカラムを投入する予定。
私のプランナーで、私は列のN.の列A内の数値とサプライヤーのリストを持って、私は(セルI8の値と一致し、私のプランナーのワークブックからすべてのサプライヤーをコピーしようとしています
Numbers Supplier
2 A
2 B
2 C
3 D
4 E
2 F
この例では2)です。
私は、列Aに番号(2)を貼り付けて、マスタワークブックの列Bにサプライヤ名を貼り付けています。
私のコードはすでにこれらの値をコピーして貼り付けています。 (plannerからmasterの他の列にも他の値をコピーしていますが、この質問については関係ありません)。
私のコードのこの部分はうまくいきます。
問題
サプライヤーは、マスターワークブックの列Bに貼り付けるされたら - 私も自分のワークブック電話帳から各サプライヤの連絡先の名前をコピーしたいです。
私の電話帳ワークブックにはシートがあり、サプライヤはアルファベット順に記載されています。
電話帳:
Supplier (Column A) Contact Name (Column C)
A Linda
Aa Dave
Aa Terry
AB James
A | B | C | D etc... <----- Sheets
Iは、列B(マスタ)で供給者名と一致業者名の電話帳の列Aの各シートに見える必要があります。
サプライヤー名が、その後、私はマスターワークブックの列C.
へのカラムCに連絡先の名前をコピーしたいと一致した場合私の結果は、この
マスター(シート2)
Column A (number) Column B (Supplier) Column C (Contact)
2 A Linda
2 A Linda
のようになります。
ここに私のコードです:何らかの理由で
Option Explicit
Sub CreateAnnounce()
Dim WB As Workbook
Dim WB2 As Workbook
Dim i As Long
Dim i2 As Long
Dim j As Long
Dim LastRow As Long
Dim j2 As Long
Dim LastRow2 As Long
Dim ws As Worksheet
'Open Planner
On Error Resume Next
Set WB = Workbooks("2017 Planner.xlsx")
On Error GoTo 0
If WB Is Nothing Then 'open workbook if not open
Set WB = Workbooks.Open("G:\BUYING\Food Specials\2. Planning\1. Planning\1. Planner\8. 2017\2017 Planner.xlsx")
End If
'Open PhoneBook
On Error Resume Next
Set WB2 = Workbooks("Phone Book for Food Specials.xls")
On Error GoTo 0
If WB2 Is Nothing Then 'open workbook if not open
Set WB2 = Workbooks.Open("G:\BUYING\Food Specials\1. General\Phone Book\Phone Book for Food Specials.xls")
End If
' ======= Edit #2 , also for DEBUG ======
With WB.Worksheets(1)
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
j = 2
For i = 1 To LastRow
' === For DEBUG ONLY ===
Debug.Print CInt(ThisWorkbook.Worksheets(1).Range("I8").Value)
If CInt(ThisWorkbook.Worksheets(1).Range("I8").Value) = .Range("A" & i).Value Then ' check if Week No equals the value in "A1"
ThisWorkbook.Worksheets(2).Range("A" & j).Value = .Range("A" & i).Value
ThisWorkbook.Worksheets(2).Range("B" & j).Value = .Range("N" & i).Value
ThisWorkbook.Worksheets(2).Range("H" & j).Value = .Range("K" & i).Value
ThisWorkbook.Worksheets(2).Range("I" & j).Value = .Range("L" & i).Value
ThisWorkbook.Worksheets(2).Range("J" & j).Value = .Range("M" & i).Value
ThisWorkbook.Worksheets(2).Range("K" & j).Value = .Range("G" & i).Value
ThisWorkbook.Worksheets(2).Range("L" & j).Value = .Range("O" & i).Value
ThisWorkbook.Worksheets(2).Range("M" & j).Value = .Range("P" & i).Value
ThisWorkbook.Worksheets(2).Range("N" & j).Value = .Range("W" & i).Value
ThisWorkbook.Worksheets(2).Range("O" & j).Value = .Range("Z" & i).Value
'Retrieve Contact Details for supplier
'Worksheet 1
'Retrieve Contact Details for supplier
With WB2.Worksheets(2)
LastRow2 = .Cells(.Rows.Count, "A").End(xlUp).Row
j2 = 2
For i2 = 1 To LastRow2
Dim rngToFill As Range
Set rngToFill = .Range("C2")
Do
Debug.Print ThisWorkbook.Worksheets(2).Range("B" & j2).Value
If ThisWorkbook.Worksheets(2).Range("B" & j2).Value Like .Range("A" & i2).Value Then ' check if Company equals the value in "B1 Phonebook"
ThisWorkbook.Worksheets(2).Range("C2").Value = .Range("C" & i2).Value
Set rngToFill = rngToFill.Offset(1, 0)
End If
Loop
Next i2
End With
'Retrieve Contact Details for supplier - END
End If
Next i
End With
End Sub
、コ最初の行の連絡先名を1つだけマスターブックにコピー/貼り付けしています。
私はまた、現時点では1枚しか見ていないことを認識しています。
With WB2.Worksheets(2)
このコードでは、すべてのサプライヤの連絡先の名前をすべてのシートに明示する必要があります。
私が間違っている場所と、このコードを動作させる方法を教えてもらえますか?前もって感謝します。
EDIT:
私は、ユーザー@BjornBogersによって
を提案し、コードを構成している「サプライヤー
Dim FoundCellRng As Range
Dim ContactValue As String
Dim SearchStr As String
For i2 = 1 To 26
'Assuming --> ThisWorkbook.Worksheets(2).Range("B1").Value is what you are looking for?
SearchStr = ThisWorkbook.Worksheets(2).Range("B2").Value
Set FoundCellRng = WB2.Worksheets(i2).Range("A2:A200").Find(SearchStr)
If (FoundCellRng Is Nothing) Then
'Didn't find anything
Else
'We found it
ContactValue = WB2.Worksheets(i2).Cells(FoundCellRng.Row, FoundCellRng.Column + 2).Value
ThisWorkbook.Worksheets(2).Range("C" & j).Value = ContactValue
Exit For
End If
Next i2
'Retrieve Contact Details for supplier - END
のための連絡先の詳細を取得しかし、これは同じことを行い、唯一の連絡先名があります一番上の行には何も入力されていません。
EDIT 2:
R3uK @コードを提供して、私は次の問題を取得しているようだ:
サプライヤーの名前と他の値が正しく全体でコピーされていません。 同じ値が何度も繰り返されるようです。
何らかの理由で、このコードで別のシートが作成されますか?このシートは何ですか?
コードは非常に遅く、私は20分以上待たいます。 これをスピードアップする方法はありますか?
はなぜシート通じない、あなたのループとは、毎回検索文を実行しますか? - > i = 1〜26 WB2.Worksheets(i).Range(A1:A100).Find(Value).Offset(、2).Value次にi。 あなたは何かを発見したかどうかを確認する必要がありますが、それは右のトリックを行うだろうか? –
@BjörnBogersかもしれませんが、私はこれをどうやってやるか自信を持っていませんか? – user7415328
ちょうど提案:シートをループしないでください。サプライヤーの名前から最初の手紙を取る。電話帳には必ず1つのシート名と一致する必要があります。特定のシートを選択するだけです。そして、それは毎回シートをループするよりも約26倍速くなります。 – tretom