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ả ...
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
Đ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
@ninjalj, tôi đã thử điều đó và tôi cũng có hành vi tương tự. – jtolle