如何避免重复同一块公式n次

时间:2016-02-02 11:34:40

标签: excel excel-formula excel-2013

说明

我发现我的问题在我现在正在处理的事情中很常见,而且我过去也做过。

我正在编写Excel公式,对于来自列Lookup value的给定输入,将扫描10个不同的Excel文件,以便使用MATCHINDEX函数返回值。

    [A]              [B]
Lookup value    Returned value
    123              val

Returned value具有以下公式(草图):

=IFNA(
  INDEX('[File1.xlsx]Sheet1'!$A:$B;MATCH(A2;'[File1.xlsx]Sheet1'!$B:$B;0);1);
  INDEX('[File1.xlsx]Sheet2'!$A:$B;MATCH(A2;'[File1.xlsx]Sheet2'!$B:$B;0);1)
 )

这样做的基本思想是从一行中的第一列中查找一个值,其中给定值(输入)出现在文件中的两个工作表中的任何一个中。 使用不同的文件名进行10次完全相同的操作

我使用IFNA函数继续运行,直到在任何文件中找到值或所有文件都已处理完毕。

问题

对于File1, ... File10中的每个文件,如果不重复给定草图10次,我怎样才能更简单地处理此问题,而不是重复代码10次?越简越好。

1 个答案:

答案 0 :(得分:0)

我建议在VBA中这样做。然后你可以轻松地遍历文件,例如:

Function FindValue()

    Dim fileNames
    fileNames = Array("FileName1", "FileName2", "FileName3")


    For i = 1 To UBound(fileNames)
        'Generic code for finding value using fileName(i)
    Next i
End Function

更新

这似乎对我有用。错误处理可能已经做得更好了。如果没有匹配项,可能需要根据您想要做的事情来改变行为。

Function FindValue(LookupString)

    Dim fileNames
    Dim tempRange
    Dim tempRange3

    fileNames = Array("VBATesting2.xlsm", "VBATesting3.xlsm")
    On Error GoTo ErrorHandler

    For i = 0 To UBound(fileNames)
        tempRange = Workbooks(fileNames(i)).Worksheets("Sheet1").Range("A:B").Find(LookupString).Offset(, 1)
        If tempRange <> "" Then
            FindValue = tempRange
            Exit Function
        Else
            tempRange = Workbooks(fileNames(i)).Worksheets("Sheet2").Range("A:B").Find(LookupString).Offset(, 1)
            If tempRange <> "" Then
                FindValue = tempRange
                Exit Function
            Else
                FindValue = "No Match"
            End If
        End If
    Next i

    ErrorHandler:
    tempRange = ""
    Resume Next
End Function