【问题标题】:Index/Match formula referencing separate sheet using VBA使用 VBA 引用单独工作表的索引/匹配公式
【发布时间】:2021-02-20 20:38:59
【问题描述】:

我有一个 Excel 电子表格,其中包含许多工作表,这些工作表因一个用例而异。在此示例中,假设我有 3 张名为 "Lever 1""Lever 2""Lever 3" 的工作表。对于其中的每一个,还有 3 个标题如下的工作表:
对于工作表"Lever 1" - "Lever 1Query1", "Lever 1Query2", "Lever 1Query3"
对于工作表"Lever 2" - "Lever 2Query1", "Lever 2 Query2", "Lever 2Query3"
对于工作表"Lever 3" - "Lever 3Query1", "Lever 3Query2", "Lever 3Query3"
等等

我正在尝试编写一个 VBA 脚本,该脚本将在所有 "Lever X" 表格中输入以下公式:

=INDEX('Lever XQuery2'!$C$2:$C$10000,MATCH(1,($F4='Lever XQuery2'!$B$2:$B$10000)*($G4='Lever XQuery2'!$A$2:$A$10000),0))

到目前为止,我有这个 VBA 代码,希望有人可以帮我修复:

For i = 1 To wBk.Worksheets.Count
Sheets("Lever " & i).Range("I4:I10000").Values = WorksheetFunction.Index(Range("'Lever " & i & "Query2'!$C$2:$C$10000"), _
            WorksheetFunction.Match(1, ("$F4"=Range("'Lever " & i & "Query2'!$B2$:$B$10000")) _
            * ("$G4"=Range("'Lever " & i & "Query2'!$A2$:$A$10000")),0)
Next i

【问题讨论】:

  • 什么有效,什么无效?您具体需要哪些方面的帮助?我的意思是我希望该循环在找不到具有该编号的工作表时会引发错误,但其余的工作是否正常?
  • @ChristoferWeber 循环返回错误,这很好。问题是 VBA 代码没有在任何工作表中填充公式。这让我觉得我编写索引/匹配公式的方式有问题

标签: excel vba


【解决方案1】:

使用 VBA 复制公式

  • 这仅涵盖Query2。我不明白与Query1Query3 的联系。希望您的意思是使用不同的公式做类似的事情。

守则

Option Explicit

Sub copyFormulas()
    
    Const lPattern As String = "LEVER *"
    Const lRangeAddress As String = "I4:I10000"
    Const qSuffix As String = "Query2"
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim lws As Worksheet ' Each (Possible Lever) Worksheet
    Dim qws As Worksheet ' Query Worksheet
    Dim lwsID As Variant ' Lever Worksheet ID
    Dim lwsName As String ' Lever Worksheet Name
    Dim qwsName As String ' Query Worksheet Name
    
    ' Loop through all worksheets.
    For Each lws In wb.Worksheets
        ' Write the name of the current worksheet to a variable.
        lwsName = lws.Name
        ' Test if current worksheet follows the pattern.
        If UCase(lwsName) Like UCase(lPattern) Then
            ' Attempt (As Variant) to determine the Lever Worksheet ID ('*').
            lwsID = Right(lwsName, Len(lwsName) - Len(lPattern) + 1)
            ' Test if '*' is a number.
            If IsNumeric(lwsID) Then
                ' Determine the Query Worksheet Name.
                qwsName = lwsName & qSuffix
                ' Attempt to create a reference to the Query Worksheet.
                On Error Resume Next
                Set qws = wb.Worksheets(qwsName)
                On Error GoTo 0
                ' Test for existence of Query Worksheet.
                If Not qws Is Nothing Then
                    ' Write formulas to Lever Worksheet.
                    lws.Range(lRangeAddress).Formula = "=INDEX('" _
                        & qwsName & "'!$C$2:$C$10000,MATCH(1,($F4='" _
                        & qwsName & "'!$B$2:$B$10000)*($G4='" _
                        & qwsName & "'!$A$2:$A$10000),0))"
                    Set qws = Nothing
                End If
            End If
        End If
    Next ws

End Sub

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-10-04
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多