-2

我在两台不同的 PC 上运行下面的代码,同时得到两个不同的结果:一个工作正常,另一个提醒“运行时错误 91 对象变量或未设置块”。有人可以帮帮我吗?

Function FindArchiveFile() As String 

FindArchiveFile = Application.Intersect(Worksheets("Filelist").UsedRange, _
    Worksheets("Filelist").Range("B:B")).Find( _
    CDate(WorksheetFunction.Large(Workshee‌​ts("Filelist").Range("B:B"), 2))).Offset(0, -1).Value 

Worksheets("Setting").Range("LastDate").Value = _
    Application.Intersect(Worksheets("Filelist").UsedRange,  _
    Worksheets("Filelist").Range("B:B")).Find( _
    CDate(WorksheetFunction.Large(Workshee‌ts("Filelist").Range("B:B"), 2))).Value 

End Function
4

1 回答 1

0

我已经修改了您的功能,使其更易于阅读。这应该有一些警告。

如果您从工作表中调用此函数,则它不太可能起作用。

  • 这是因为 workhseet 函数通常只能向调用单元返回一个值。它不能以其他方式操作工作表对象。此函数试图在命名范围内设置一个值,"LastDate"这很可能会失败。它可能会在这一行静默失败,但仍会将值返回给调用单元。
  • 从工作表调用此函数时可能会引发循环引用错误

从子例程调用时,此函数似乎可以工作,或者至少它不会为我返回错误。

Sub Test()
'Use this to test the function
MsgBox FindArchiveFile
Worksheets("Setting").Range("LastDate").Value = FindArchiveFile
End Sub

Function FindArchiveFile() As String
    Dim ws As Worksheet
    Dim rngB As Range
    Dim rngInt As Range
    Dim foundVal As String

    Set ws = Worksheets("Filelist") 
    Set rngB = ws.Range("B:B")
    Set rngInt = Application.Intersect(ws.UsedRange, rngB)

    foundVal = rngInt.Find( _
        CDate(WorksheetFunction.Large(rngB, 2))).Offset(0, -1).Value

    '## I comment the next line out and put it in the calling subroutine, since
    '   the function returns a value, use the function properly.
    'Worksheets("Setting").Range("LastDate").Value = foundVal

    FindArchiveFile = IIf(foundVal = vbNullString, "Not Found", foundVal)

End Function
于 2013-09-21T18:52:36.457 回答