以前は機能していたワークブックのこの関数。別のワークブックで、列A:Aのアイテムマスターワークシートで範囲を見つけ、見つかったパーツの範囲を返していました。
Set FindRow
は、添え字が範囲外であることを示すポップアップで失敗するようになりました。 [ヘルプ]をクリックするといくつかの情報が表示されますが、ここでは適用できません。どんな助けでもいただければ幸いです。
Function FindPartNumber(ByVal Part As String, ByVal mpl_wb As Workbook) As Range
Dim FindRow As Range
Set FindRow = mpl_wb.Worksheets("Item Master").Range("A:A").Find(What:=Part, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
MatchCase:=True)
If Not FindRow Is Nothing Then
Set FindPartNumber = FindRow
Else
Set FindPartNumber = Nothing
End If
End Function
両方の関数パラメーターを検証し、返されたオブジェクトでNothing
を確認してみてください
上のSub
は、Function
の戻り値の型を確認する方法を示すテストです。
Option Explicit
Public Sub TestPart()
Dim result As Range
Set result = FindPartNumber(123, ThisWorkbook) 'Make sure that "result" is Set
If Not result Is Nothing Then Debug.Print result.Address 'Check result object
End Sub
'If String/Workbook params are missing, or part is not found, this returns "Nothing"
Public Function FindPartNumber(ByVal part As String, ByVal mplWb As Workbook) As Range
Dim findRow As Range, ws As Worksheet
If mplWb Is Nothing Or Len(part) = 0 Then Exit Function 'Invalid file (mplWb)
With mplWb
On Error Resume Next 'Expected error: sheet name not found (sheet doesn't exist)
Set ws = .Worksheets("Item Master")
If Not ws Is Nothing Then
With ws.Range("A1:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
Set findRow = .Find(What:=part, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
MatchCase:=True)
If Not findRow Is Nothing Then Set FindPartNumber = findRow
End With
End If
End With
End Function
。
注
関数をより汎用的(再利用可能)にするには、ハードコードされたすべての部分を外部に移動します
Option Explicit
Public Sub TestPart()
Dim ws As Worksheet, result As Range, searchRange As Range
Set ws = ThisWorkbook.Worksheets("Item Master")
Set searchRange = ws.Range("A1:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
Set result = FindPartNumber(123, searchRange)
If Not result Is Nothing Then Debug.Print result.Address
End Sub
'If String/Range params are missing, or part is not found, this returns "Nothing"
Public Function FindPartNumber(ByVal part As String, ByVal rng As Range) As Range
Dim findRow As Range
If rng Is Nothing Or Len(part) = 0 Then Exit Function 'Invalid search range or part
Set findRow = rng.Find(What:=part, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
MatchCase:=True)
If Not findRow Is Nothing Then Set FindPartNumber = findRow
End Function