Excel UDF – 引用另一个工作簿表时给出#值错误

我刚来这地方。 如果我犯了错误,请原谅我,如果有人给我指点,如果我做错了,我会很感激。

我的问题是关于创build一个UDF,通过匹配当前工作簿中的YEAR&NAME,可以从另一个工作簿工作表中提供一个build议编号。 当前的代码给出了一个#VALUE错误。

Function ProposalNo(BorrowerName As String, Year As String) As String Dim PropNo As String Dim BorrowerName As String Dim Year As String Dim CMISPath As String Dim wb As Workbook Dim sht As Worksheet Dim Match As Double CMISPath = "C:\Users\15169\Desktop\Data Dump\CMIS\SME- CMIS.xlsb" Set wb = Workbooks.Open(CMISPath) Set sht = wb.Worksheets("Sheet1") LastRow = wb.Worksheets(1).Cells(sht.Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).Value)) Then PropNo = sht.Cells(i, 1) End If Next ProposalNo = PropNo End Function 

JW是另外一个基本上用百分比匹配函数来匹配借款人名字的函数。 由于Set sht = wb.Worksheets("Sheet1")发生#值错误。 我试着创build另一个函数来分配工作表的详细信息,但没有奏效。 如果有人能给我一些指点,我将不胜感激。

用户定义函数(UDF) “不得修改任何单元格的内容或格式,也不得修改Excel的操作环境” 。

因此,所需的工作簿必须在您想使用该函数时已经打开,并且只将其设置为给定(或传递)工作簿名称

这里是你的UDF的相应的重构:

 Function ProposalNo(BorrowerName As String, Year As String) As String Dim PropNo As String Dim sht As Worksheet Dim i As Long Const WBNAME As String = "SME- CMIS.xlsb" Const SHEETNAME As String = "Sheet1" Set sht = GetSheet(WBNAME, SHEETNAME) If sht Is Nothing Then ProposalNo = "couldn't fine sheet '" & SHEETNAME & "' in workbook '" & WBNAME & "'" Else With sht For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).value)) Then ProposalNo = sht.Cells(i, 1) Exit For End If Next End With End If End Function Function GetSheet(WBNAME As String, shtName As String) As Worksheet On Error Resume Next Set GetSheet = Workbooks(WBNAME).Worksheets(shtName) On Error GoTo 0 End Function 

这不是完整的答案(因为我不知道JWfunction是什么)。 您的代码的一些更正:

1.删​​除以下2个variables声明(因为它们在调用此函数时通过):

  Dim BorrowerName As String Dim Year As String 

以下行:

Set sht = wb.Worksheets("Sheet1") – 对我Set sht = wb.Worksheets("Sheet1") ,你确定你的wb有一张名为“ Sheet1 ”的表叫做“ SME-CMIS.xlsb

3.一旦你能正确设置表格variablessht ,那么你可以在下面的行中使用:

 LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 

一般信息 :在开始时使用Option Explicit ,它将解决这些错误的一半。

(不要忘记在运行For循环之前先定义Dim i As Long )。

4. 最后 ,你定义了这个函数来接收BorrowerName As String, Year As String ,因此,在下面这行你不需要使用Cstr

 If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).Value)) Then 

只要使用:

 If (JW(Trim(UCase(BorrowerName)), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And Year = CStr(sht.Cells(i, 10).Value)) Then 

整个代码(不能testingJWfunction ):

 Option Explicit Function ProposalNo(BorrowerName As String, Year As String) As String Dim PropNo As String Dim CMISPath As String Dim wb As Workbook Dim sht As Worksheet Dim Match As Double Dim i As Long CMISPath = "C:\Users\15169\Desktop\Data Dump\CMIS\SME- CMIS.xlsb" Set wb = Workbooks.Open(CMISPath) Set sht = wb.Worksheets("Sheet1") LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow If ((JW(Trim(UCase(BorrowerName)), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85) And (Year = CStr(sht.Cells(i, 10).Value))) Then PropNo = sht.Cells(i, 1) End If Next ProposalNo = PropNo End Function