【问题标题】:Using Column Heading as lookup for Sheet Name使用列标题作为工作表名称的查找
【发布时间】:2016-11-07 10:41:44
【问题描述】:

我想查找某个产品代码(a 列)的值,因为它对应于一周(在第 1 行中以数字形式列出)。周代码(在第 1 行)指的是每周都有一张工作表的工作簿,与此处显示的完全相同。我想去那个工作簿,访问正确的工作表,找到产品代码,然后从 L 列中提取相应的单元格。我不知道该怎么写。
我有大约 500 个周代码和 500 个产品代码,所以我认为需要一个宏。

一个有用的例子:在单元格 B2 中,我想从工作表 40111 中的“组合性能跟踪.xlsx”列 L 中找到与 NPPP 相对应的数据。

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

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

【问题讨论】:

  • 索引在很多方面都不是正确的语法,您还需要为其分配一个变量以获得结果。此外,您也许可以使用带有单元格拖动的公式(但宏可能更有效)
  • 您必须将 volatile INDIRECT function 合并到您的 INDEX/MATCH 函数对中才能将其用作本机函数,但您可以使用 WorksheetFunction object.. 构建一些东西跨度>
  • 你也确定工作簿中会存在工作表吗?
  • 是的,工作表将存在。我使用复制确切工作表名称的宏提取了这些列标题。我如何将间接功能纳入其中?
  • 这条线在做什么? sheet_name=wsdata.cells(1, count) wsdata 是在哪里声明的?或者你的意思是sheet_name=ws.cells(1,count)?此外,将Option Explicit 添加到非常 顶部(Sub populate() 上方)以强制您声明您正在使用的所有变量。

标签: vba excel indexing match


【解决方案1】:

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

(500 周) * (500 个产品) = 25000 乘以每次查找和分配的操作数,它可能超过 100,000 次操作。 EXCEL VLOOKUP VS INDEX MATCH VS SQL VS VBA bench 测试各种方法。根据那篇文章,我的宏应该需要 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

【讨论】:

  • 谢谢。这似乎比我更接近一吨。当我运行它时,我在许多列中得到零。列要么完全空白,要么在最后一个产品代码中一直为零。知道该怎么做吗?
  • 如果一列为空白,则未找到 Worksheets("Week Code")。零表示未找到产品代码。检查列标题并确保它与Combined Performance tracking.xlsx 中的工作表名称完全匹配。我刚刚添加了UCase(Trim([product codes])) 以使其不区分大小写并删除所有空格。如果值为零,请尝试在该周的工作表上查找产品代码。让我知道您发现了什么,我们可以尝试调整代码。
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多