2010-07-30 15 views
8

EDIT CUỐI CÙNG: Nó thực sự xuất hiện là một lỗi trình biên dịch - xem câu trả lời được chấp nhận.VBA: Điều gì gây ra đối số chuỗi này được truyền cho ParamArray để được thay đổi thành một số (trông có vẻ nghi ngờ giống như một con trỏ)?

Sử dụng VBA trong Excel 2007, tôi đã đoạn mã sau trong 'Class1':

Option Explicit 

Public Function strange(dummy As String, ParamArray pa()) 
    Debug.Print pa(LBound(pa)) 
End Function 

Public Sub not_strange(dummy As String, ParamArray pa()) 
    Debug.Print pa(LBound(pa)) 
End Sub 

Public Function also_not_strange(ParamArray pa()) 
    Debug.Print pa(LBound(pa)) 
End Function 

và một số mã chế độ trong một module:

Option Explicit 

Public Function not_strange_either(dummy As String, ParamArray pa()) 
    Debug.Print pa(LBound(pa)) 
End Function 

Public Sub outer(v) 
    Dim c As Class1 
    Set c = New Class1 

    Call c.strange("", v(LBound(v))) 
    Call c.not_strange("", v(LBound(v))) 
    Call c.also_not_strange(v(LBound(v))) 

    Call not_strange_either("", v(LBound(v))) 
End Sub 

Nếu gọi 'bên ngoài' từ ngay cửa sổ như thế này:

call outer(array("a")) 

Tôi lấy lại kết quả có vẻ lạ:

102085832 
a 
a 
a 

Có vẻ như vấn đề liệu thường trình được gọi là trong một mô-đun lớp hay không, cho dù đó là một Tiểu hoặc Hàm, và có hay không có đối số ban đầu. Tôi có thiếu một cái gì đó về cách VBA là nghĩa vụ phải làm việc? Bất kỳ ý tưởng?

Số lạ thay đổi từ khi chạy. Tôi nói "có vẻ nghi ngờ như một con trỏ" vì nếu tôi gọi đây là:

Public Sub outer2(v) 
    Dim c As Class1 
    Set c = New Class1 

    Dim ind As Long 
    For ind = LBound(v) To UBound(v) 
     Call c.strange("", v(ind)) 
    Next ind 
End Sub 

như vậy:

call outer2(array("a","b","c")) 

tôi nhận lại sản lượng như:

101788312 
101788328 
101788344 

Đó là tăng 16 điều đó khiến tôi nghi ngờ, nhưng tôi thực sự không biết. Ngoài ra, chuyển một giá trị, nói bằng cách gọi:

Call c.strange("", CStr(v(ind))) 

chỉ hoạt động tốt.

EDIT: biết thêm một chút ... Nếu tôi gán giá trị trả về từ 'c.strange' một cái gì đó thay vì ném nó đi, tôi nhận được hành vi tương tự:

Public Sub outer3(v) 
    Dim c As Class1 
    Set c = New Class1 

    Dim x 
    x = c.strange("", v(LBound(v))) 

    Call c.not_strange("", v(LBound(v))) 
    Call c.also_not_strange(v(LBound(v))) 

    Call not_strange_either("", v(LBound(v))) 
End Sub 

Điều thú vị là, nếu tôi gọi các thủ tục kiểm tra của tôi như trên, với một đối số kết quả từ việc gọi 'Array', giá trị con trỏ được thay đổi. Tuy nhiên, nếu tôi gọi nó như sau:

call outer([{1,2,3}]) 

Tôi lấy lại cùng một số, ngay cả khi tôi thực hiện cuộc gọi nhiều lần. (Số lượng thay đổi nếu tôi chuyển sang ứng dụng khác trong Windows, như trình duyệt của tôi.) Vì vậy, bây giờ tôi tò mò rằng bộ đánh giá Excel (được gọi với dấu ngoặc) dường như lưu trữ kết quả ...

Trả lời

5

Bây giờ điều này thật tuyệt vời .

Đã sao chép trên văn phòng 2003.
Trông giống như lỗi trình biên dịch.

Vấn đề là ở dòng này:

Call c.strange("", v(LBound(v))) 

Dưới đây trình biên dịch tạo ra một Variant chứa một mảng 1D của Variant 's, yếu tố duy nhất trong số đó là một con trỏ thay vì giá trị.Con trỏ này sau đó đi đến hàm strange mà thực sự không lạ, nó chỉ in giá trị Variant\Long được truyền cho nó.

Thủ thuật này mang lại các trình biên dịch sanity lại:

Call c.strange("", (v(LBound(v)))) 

EDIT

Vâng, con số kỳ diệu này là một con trỏ đến cấu trúc VARIANT mà là vụ phải được truyền cho phương thức strange. Trường đầu tiên là 8, là vbString và trường dữ liệu chứa con trỏ tới chuỗi thực tế "a".

Vì vậy, nó chắc chắn là một lỗi trình biên dịch ... Tuy nhiên, một lỗi trình biên dịch VB liên quan đến mảng;)

+0

Vâng, nó trông giống như một lỗi. Chỉ cần một số trường hợp cạnh lẻ ... ParamArray, trong một chức năng, trên một lớp học, với một tham số ở phía trước, vv .... @GSerg, bạn có bất kỳ kiến ​​thức bên trong của trình biên dịch VBA? – jtolle

+0

Điều gì xảy ra nếu bạn gọi nó là «ret = c.strange (" ", v (LBound (v)))» thay vì sử dụng Call? – ninjalj

+0

@ninjalj, tôi đã thử điều đó và tôi cũng có hành vi tương tự. – jtolle

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