使用列标题作为工作表名称的查找

我想查找某个产品代码(列a)的值,因为它对应于一个星期(在第1行中列出的数字)。 星期代码(在第1行中)是指每周都有一张工作表的工作簿,完全如此处所示。 我想去工作簿,访问正确的工作表,find产品代码,并从列L中拉出相应的单元格。我不知道如何写这个。
我有大约500周的代码和500个产品代码,所以我正在考虑需要一个macros。

一个例子,如果有帮助的话:在B2单元格中,我想要find来自表单40111的“Combined Performance Tracking.xlsx”中对应于NPPP的列L的数据。

工作表

我已经写了这个到目前为止,但是当我运行它时,我的索引匹配被单挑作为一个问题。 任何想法如何解决这一问题?

Sub populate() Dim ws As Worksheet Dim count Dim count2 Dim stock_code Dim rep Dim sheet_name As String ws = Sheets("Sheet3") For count = 2 To 140 sheet_name = ws.Cells(1, count) For count2 = 2 To 873 stock_code = ws.Cells(count2, 1) Workbooks("Combined Performance tracking.xlsx").Activate For rep = 1 To (Worksheets.count) If sheet_name = Sheets(rep).Name Then index($a$5:$az$800, match(stock_code, $A$5:$A$800, 0), match("uber", $a$5:$az$5, 0) ActiveCell.Select ActiveCell.Copy Workbooks("Jody Project Final.xlsm").Activate Worksheets("sheet3").Cells(count2, count).Activate ActiveCell.Select ActiveCell.Paste End If Next Next Next End Sub 

SQL可能会提供稍好的性能,因为我不知道必须使用ADO连接来自不同工作簿的表。 在Excel中将一个表与多个表进行比较时,我更喜欢使用脚本字典。

(500周)*(500个产品)= 25000乘以每次查找和分配的操作次数,可能超过10万次操作。 EXCEL VLOOKUP VS INDEX MATCH VS SQL VS VBA工作台testing各种方法。 根据这篇文章我的macros应该需要3至7秒。 让我知道它是否工作,需要多长时间来执行。

 Sub FillProductPrices() ToggleEvents False Dim dProducts Dim wsLookup As Worksheet Dim arSheetNames, arProducts, arValues, arLookUp Dim x As Long, y As Long, count As Long, i As Long Dim k As String, SheetName As String Dim wbTarget As Worksheet Dim wbDataSource As Workbook Set wbDataSource = Workbooks.Open("Combined Performance tracking.xlsx") Set wbTarget = Sheets("Sheet3") Set dProducts = CreateObject("Scripting.Dictionary") With wbTarget arProducts = .Range("A2", .Range("A2").End(xlDown)).Value arSheetNames = .Range("B1", .Range("B1").End(xlToRight)).Value count = UBound(arProducts, 1) End With For i = 1 To count k = UCase(Trim( arProducts(i, 1) )) If Not dProducts.Exists(k) Then dProducts.Add k, i Next For y = 1 To UBound(arSheetNames, 2) On Error Resume Next SheetName = arSheetNames(1, y) Set wsLookup = wbDataSource.Worksheets(SheetName) If Err.Number = 0 Then With wsLookup ReDim arValues(1 To count, 1 To 1) As Double arProducts = .Range("A2", .Range("A2").End(xlDown)).Value arLookUp = .Range("L2", .Range("L" & Rows.count).End(xlUp)).Value End With For x = 1 To count k = UCase(Trim( arProducts(x, 1) )) If dProducts.Exists(k) Then i = dProducts(k) arValues(i, 1) = arLookUp(x, 1) End If Next wbTarget.Cells(2, y + 1).Resize(count) = arValues Else Debug.Print SheetName & " not found" Err.Clear End If On Error GoTo 0 Next ToggleEvents True End Sub Sub ToggleEvents(EnableEvents As Boolean) With Application .ScreenUpdating = EnableEvents .Calculation = IIf(True, xlCalculationAutomatic, xlCalculationManual) End With End Sub