시나리오VBA 값이 일치하는 두 개의 통합 문서에서 값을 가져 옵니까?
나는, 나는 시트에 셀 I8에 값을 세 개의 통합 문서 내 마스터 통합 문서에서
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에 붙여 넣기 한 - 나는 또한 내 통합 전화 번호부에서 각 공급 업체의 연락처 이름을 복사 할.
내 전화 번호부 통합 문서에는 시트 A-Z가 있으며 공급 업체는이 시트 아래에 알파벳순으로 나열되어 있습니다.
번호부 :
I 칼럼 B에서 공급자 명칭 (마스터)에 일치하는 공급자 명칭에 대한 전화 번호부의 A 열에서 각 시트 해야하는Supplier (Column A) Contact Name (Column C)
A Linda
Aa Dave
Aa Terry
AB James
A | B | C | D etc... <----- Sheets
. 공급 업체 이름은 내가
Column A (number) Column B (Supplier) Column C (Contact)
2 A Linda
2 A Linda
마스터 통합 문서를 열 C.
내 결과이
마스터 같아야합니다 (시트 2)에 걸쳐 열 C의 연락처 이름을 복사하려면 다음과 일치하는 경우
어떤 이유
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
, 공동 :
여기 내 코드입니다 de는 첫 번째 행의 연락처 하나만을 마스터 통합 문서에 복사/붙여 넣기합니다.
나는 현재 한 시트 만보고있는 것으로 알고 있습니다.
With WB2.Worksheets(2)
분명히 모든 공급 업체 연락처 이름을 보려면이 코드가 필요합니다.
누군가 내가 잘못 가고있는 곳과이 코드를 작동시키는 방법을 보여줄 수 있습니까? 미리 감사드립니다.
편집 : 사용자 @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
그러나, 이것은 않는다 ' 맨 위 줄에 입력되지만 더 이상은 입력되지 않습니다.
편집 2 :
공급 업체 이름을 다른 값은 올바르게에서 복사되지 않습니다 R3uK 제공 @ 코드와
, 나는 다음과 같은 문제를 받고있는 것으로 보인다. 동일한 값이 열 I에서 반복해서 반복되는 것으로 보입니다.
어떤 이유로이 코드는 다른 시트를 생성합니까? 이 시트는 무엇을위한 것입니까?
코드는 매우 느리고 내가 20 분 이상 기다릴 필요하고 있습니다. 속도를 높이는 방법이 있습니까?
이유는 시트를 통해하지 당신 루프는 매번 찾기 문을 실행합니까? -> i = 1 ~ 26 WB2.Worksheets (i). 범위 (A1 : A100). 찾기 (값). 오프셋 (2). 값 다음 i. 뭔가를 발견했는지 확인해야하지만 그게 속임수일까요? –
@ BjörnBogers 가능하지만 어떻게 할 수 있을지 확신하지 못합니까? – user7415328
그냥 제안 : 시트를 반복하지 마십시오. 공급 업체 이름에서 첫 번째 편지를 가져옵니다. 전화 번호부의 한 시트 이름과 정확히 일치해야합니다. 특정 시트를 선택해야합니다. 매번 시트를 반복하는 것보다 약 26 배 (?) 더 빠릅니다. – tretom