Đăng ký ngoài phạm vi (Lỗi 9)


1

Hàm này trong sổ làm việc được sử dụng để làm việc. Nó đã được tìm thấy, trong một sổ làm việc khác, một phạm vi trên bảng tính Mục chính trong cột A: A và trả về một phạm vi cho Phần được tìm thấy.

Các Set FindRowhiện không thành công với một popup nói subscript ra khỏi phạm vi. Nhấp vào Trợ giúp cung cấp một số thông tin nhưng tôi chưa thể áp dụng nó ở đây. Bất kỳ trợ giúp sẽ được đánh giá cao.


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

Câu trả lời:


2

Hãy thử xác nhận cả hai tham số chức năng và kiểm tra đối tượng được trả về Nothing

Trên cùng Sublà một bài kiểm tra minh họa cách kiểm tra kiểu trả về củaFunction


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

.

Ghi chú

Để làm cho chức năng chung chung hơn (có thể sử dụng lại), hãy di chuyển tất cả các phần được mã hóa cứng bên ngoài


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

Hoạt động tuyệt vời, cấu trúc có tổ chức cho phép tôi tìm ra nguyên nhân của vấn đề. Đó là khi Phần không được tìm thấy, hàm hiện tạo lỗi "Biến đối tượng hoặc Không đặt biến khối" trên Hàm cuối. Tôi đã sử dụng Tùy chọn Giải thích, không có lỗi biên dịch, mọi thứ đều là Dim As. Có vẻ như FindRow không có gì là vấn đề? Không chắc chắn làm thế nào để giải quyết nó mặc dù.
Rab

@Rab - sau đó, sự cố chỉ xuất hiện trong hàm, nhưng nguyên nhân là do dòng mã gọi hàm này: nó gửi một chuỗi rỗng dưới dạng id "Phần" (không chắc điều gì gây ra điều đó)
paul bica

Phần được điền và không trống nhưng phần này không được FindRow tìm thấy vì phần này có thể cũ hoặc bị nhầm lẫn và không có trong ws.Range. Điều này khiến FindRow không có gì là không bao giờ Đặt FindPartNumber với một phạm vi và hàm trả về ném lỗi?
Rab

Có, trong trường hợp đó, hàm trả về Nothingvà mã khác đang mong đợi a Range; bạn có thể làm cho hàm trả về một phạm vi nhất định trong trường hợp không tìm thấy phần đó
paul bica

1
Cảm ơn bạn, đề nghị tuyệt vời. Tôi cũng đã thêm một số tin nhắn người dùng để giúp đỡ. Tôi đang trên đường trở lại.
Rab
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.