-2

以下のコードを 2 つの異なる PC で実行すると、2 つの異なる結果が得られます。誰でも私を助けることができますか?

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

あなたの関数を改訂して、人間が読めるようにしました。これは、いくつかの注意事項で機能するはずです。

この関数をワークシートから呼び出している場合、機能する可能性はほとんどありません。

  • これは、ワークシート関数は通常、呼び出し元のセルにのみ値を返すことができるためです。それ以外の場合、ワークシート オブジェクトを操作することはできません。この関数は名前付き範囲に値を設定しようとしていますが、"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 に答える