我发现我的问题在我现在正在处理的事情中很常见,而且我过去也做过。
我正在编写Excel公式,对于来自列Lookup value
的给定输入,将扫描10个不同的Excel文件,以便使用MATCH
和INDEX
函数返回值。
[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次?越简越好。
答案 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