基本上这应该是一个修改过的INDEX/MATCH
公式,但它依赖于另一个工作簿上的变量和标题,并且希望通过只要求它们提供两个参数来使用户更容易。
Option Compare Text
Function DATAFILL(ID_number, source_headerRow) As Variant
ID_header_name = Cells.Item(1, ID_number.column).Value
Dim wb As String, ws As String
Dim ID_src As Range
'check if source_headerRow is an external workbook
If source_headerRow Like "'" Then
src = Split(source_headerRow.address(External:=True), "!")(0)
wb = Replace(Split(src, "]")(0),"[","")
ws = Split(src, "]")(1)
id_col = Application.WorksheetFunction.Match(ID_header_name, source, 0)
Set ID_src = Workbooks(wb).Worksheets(ws).Range(Cells(1, id_col))
Else
Set ID_src = Range(Cells(1, Application.WorksheetFunction.Match(ID_header_name, source_headerRow, 0)))
End If
headername = "Shift" 'placeholder
Set addr = Workbooks(wb).Range("A:Z")
DATAFILL = Application.WorksheetFunction.Index(addr, Application.WorksheetFunction.Match(ID_number, ID_src), Application.WorksheetFunction.Match(headername, source_headerRow, 0))
End Function
我对VBA很陌生,所以我无法准确指出我出错的地方......
无论我做什么,我都会遇到#VALUE!
错误。
或者有没有办法让INDEX/MATCH
用户友好而不需要VBA /宏?
答案 0 :(得分:0)
你没有说什么行给你VALUE错误。那会有所帮助。 或者是在特定的细胞中?
您还没有在我能看到的任何地方定义“addr”变量类型 并且顶部没有OPTION EXPLICIT,因此默认情况下“addr”将是Variant数据类型。
至少需要Object
,最好是Range
您应该将Option Explicit
添加到模块的顶部(Option Compare Text
之上)并重新编译,直到您可以修复所有错误(如果还有更多)