2012-09-06 34 views
5

tôi đang tạo ra một ứng dụng VBA, và tôi có đoạn mã sau:đối tượng bắt buộc lỗi Excel VBA


Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort (previousCell) '**Here i get object required** 

ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private Function getEffort(ByVal cell As range) 

' do soemthing 

End Sub 

Tôi không chắc chắn lý do tại sao tôi nhận được thông báo lỗi: Object required error at getEffort(previousCell). Nếu tôi vượt qua trong Target, nó hoạt động.

Cảm ơn

+0

Nên _Private Function_ là _Private Sub_ vì bạn không quan tâm đến việc nhận được một giá trị trả về và chức năng riêng kết thúc bằng "END SUB"? – ray

+2

Không sử dụng dấu ngoặc đơn khi gọi getEffort. Nếu bạn sử dụng dấu ngoặc đơn thì mã của bạn sẽ mong đợi một giá trị trả về (không getEffort trả về bất kỳ thứ gì?) –

+0

Lưu ý: bạn có thể sử dụng các dấu ngoặc đơn nếu bạn nhập 'Gọi' trước tên phụ -' Gọi getEffort (previousCell) ' –

Trả lời

0

Có vẻ như mục tiêu không được đặt thành thể hiện của đối tượng đang cho bạn lỗi. khi bạn vượt qua trong mục tiêu, đối số cho hàm chức năng (đối số) được đặt thành một thể hiện của một đối tượng. khi bạn đặt previouscell = target target thực sự cần phải là cái gì đó, nếu không bạn sẽ nhận được lỗi exec.

thử thiết previouscell = động vào

0

Hai điều: thứ nhất, bạn cần phải sử dụng không () hoặc bao gồm một số loại giá trị trả về khi gọi getEffort như một hàm. Bạn cũng cần phải xác định xem bạn muốn đó là một phụ/chức năng, ngay bây giờ bạn đang sử dụng cả hai. Có lẽ bạn đang làm cho nó một phụ?

Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort previousCell '**Here i get object required** 
'or... 
call getEffort(previousCell) 

'add this too.. 
'exit sub 
ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private sub getEffort(ByVal cell As range) 

' do soemthing 

End sub 

Ngoài ra, chương trình chính của bạn không bao giờ thoát ra trước khi tuyên bố lỗi của bạn, vì vậy nó sẽ bật lên hộp thông báo luôn. Hãy thử thêm Exit Sub trước nhãn lỗi để tránh hộp thư trống luôn xuất hiện.

18

Như những người khác đã đề xuất, sự cố là dấu ngoặc đơn. Những gì không ai có đầy đủ giải thích là lý do tại sao nó là dấu ngoặc đơn.

Khi bạn nói điều này:

getEffort previousCell 

Sau đó, bạn đang đi qua các previousCellPhạm vi đối tượng thành các thủ tục getEffort. Đó là những gì các thủ tục mong đợi và vì vậy nó là hạnh phúc.

Khi bạn nói điều này:

getEffort (previousCell) 

Dấu ngoặc xung quanh previousCell nguyên nhân VBA để đánh giá đối tượng previousCell. Khi VBA đánh giá một đối tượng, nó trả về thuộc tính mặc định của đối tượng đó. Thuộc tính mặc định của đối tượng Range là .Value, là một chuỗi.

Vì vậy trước đóCell được đánh giá và chuỗi được chuyển sang getEffort. Tất nhiên getEffort đang mong đợi một đối tượng Range, vì vậy bạn nhận được thông báo lỗi.

Thực tế bạn đang chỉ định Target đến previousCell là cá trích màu đỏ. Bạn có thể đã giới thiệu dấu ngoặc đơn khi bạn chuyển sang previousCell. Nếu bạn không tin tôi, hãy thử điều này:

getEffort (Target) 

Bạn sẽ nhận được thông báo lỗi tương tự.

+3

+1 cho tuyệt vời giải trình. –

+2

Để biết thêm thông tin, hãy xem câu trả lời của tôi cho một câu hỏi khác: [ByRef dường như nhận giá trị chứ không phải tham chiếu trong VBA 6.0] (http://stackoverflow.com/a/4877030/154439) – mwolfe02

Các vấn đề liên quan