VLookupdynamic范围在另一个工作表中

我正在尝试使用一个函数来允许我从以前的工作表中导入一个范围。 我不确定我目前的macros是否允许这样做。 我可以手动调用以前的工作表,但不能与我有的function。

这是我手动input工作表名称时正常工作的function:

=IFERROR(VLOOKUP(D3,Aug9Daily!$D$3:$F$50,3, FALSE),"") 

这是我正在尝试使用的function:

 =IFERROR(VLOOKUP(D3,NextSheetName()$D$3:$F$50,3, FALSE),"") 

这是我用于NextSheetNamemacros的VBA:

 Function NextSheetName(Optional WS As Worksheet = Nothing) As String Application.Volatile True Dim S As String Dim Q As String If IsObject(Application.Caller) = True Then Set WS = Application.Caller.Worksheet If WS.Index = WS.Parent.Sheets.Count Then With Application.Caller.Worksheet.Parent.Worksheets Set WS = .Item(1) End With Else Set WS = WS.Next End If If InStr(1, WS.Name, " ", vbBinaryCompare) > 0 Then Q = "'" Else Q = vbNullString End If Else If WS Is Nothing Then Set WS = ActiveSheet End If If WS.Index = WS.Parent.Worksheets.Count Then With WS.Parent.Worksheets Set WS = .Item(1) End With Else Set WS = WS.Next End If Q = vbNullString End If NextSheetName = Q & WS.Name & Q End Function 

我究竟做错了什么? 有没有更好的方法来dynamic地从另一个工作表中select范围?

试试看看它是否适用于你解决你的函数的输出:

 NextSheetName = Q & WS.Name & Q & "!" 

然后你将需要像这样在一个间接函数里面进行输出:

 =IFERROR(VLOOKUP(D3,INDIRECT(NextSheetName() & "$D$3:$F$50"),3, FALSE),"") 

我发现这个小UDF是方便的:

 Function sheet_offset(rng As Range, i As Integer) As Range Application.Volatile 'necessary since value can change even when values of parameters do not Set sheet_offset = rng.Worksheet.Parent.Worksheets.Item(rng.Worksheet.Index + i).Range(rng.Address) End Function 

用i表来抵消 – 例如,i = 0表示同一张表,i = -1表示前一张表,i = 1表示下一张表。

在你的例子中,你可以使用:

 IFERROR(VLOOKUP(D3,sheet_offset($D$3:$F$50,1),3, FALSE),"") 

这将抵消引用下一个工作表的范围。

请注意,要引用相对于当前工作表(如您的),您不会指定工作表。 为了进行绝对引用,只需在引用中指定一个工作表(例如'Sheet1'!$ D $ 3:$ F $ 50)并且成为您的原点(当i = 0时引用的工作表)