【发布时间】:2017-02-17 08:26:13
【问题描述】:
场景
我有三本工作簿
Master
Planner
Phonebook
在我的主工作簿中,我在工作表 1 的单元格 I8 中有一个值。
主(表 1)
I8 = 2
在第 2 页上,我有以下空列:
主(表 2)
Column A (number) Column B (Supplier) Column C (Contact)
我打算用计划员工作簿和电话簿工作簿中的数据填充这些列。
在我的规划器中,我在 A 列中有一个数字列表,在 N 列中有供应商列表。
Numbers Supplier
2 A
2 B
2 C
3 D
4 E
2 F
我正在尝试从计划员工作簿中复制与单元格 I8 中的值匹配的所有供应商(在本例中为 2)。
我将 A 列中的数字 (2) 粘贴到主工作簿的 B 列中。
我的代码已经很好地复制和粘贴了这些值。 (我还将其他值从 planner 复制到 master 的其他列中 - 但对于这个问题,这些不相关)。
所以我的这部分代码工作正常。
问题
将供应商粘贴到主工作簿的 B 列后 - 我还想从我的工作簿电话簿中复制每个供应商的联系人姓名。
我的电话簿工作簿有表格 A-Z,供应商按字母顺序列在这些表格下。
电话簿:
Supplier (Column A) Contact Name (Column C)
A Linda
Aa Dave
Aa Terry
AB James
A | B | C | D etc... <----- Sheets
我需要在电话簿 A 列中的每张表中查找与 B 列(主)中的供应商名称相匹配的供应商名称。
如果供应商名称匹配,那么我想将 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
由于某种原因,代码将第一行上的一个联系人姓名复制/粘贴到主工作簿中。
我也知道目前我只看一张纸。
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,我似乎遇到了以下问题:
供应商名称和其他值未正确复制。 相同的值似乎在第一列中一次又一次地重复。
由于某种原因,这段代码创建了另一个工作表?这张表是干什么用的?
代码非常慢,我不得不等待 20 分钟或更长时间。 有没有办法加快速度?
【问题讨论】:
-
为什么不循环遍历工作表并每次都执行一个 find 语句? -> For i = 1 To 26 WB2.Worksheets(i).Range(A1:A100).Find(Value).Offset(, 2).Value Next i.你必须检查它是否找到了一些东西,但这会成功吗?
-
@BjörnBogers 可能,但我对如何做到这一点没有信心?
-
只是一个建议:不要循环浏览床单。取供应商名称的第一个字母。它必须与电话簿中的一个工作表名称完全匹配。只需选择特定的工作表。所以它比每次循环遍历工作表快大约 26 倍 (?)。