Truyền giá trị thay vì phạm vi cho Hàm VBA


0

Tôi đang tạo các hàm VBA trong Excel 2007. Người ta có một nguyên mẫu:

Function ToLevelCode_Range(val As Double, ByRef R As Range)

Tôi có thể gọi nó theo cách này tốt và nó nhận được kết quả chính xác:

=ToLevelCode_Range(B2, Categories!D1:D4)

Có một ví dụ, trong đó tôi muốn tham số thứ hai là một bộ giá trị cụ thể:

=ToLevelCode_Range(B2, { 0.38, 0.78, 1.18, 1.58 })

Điều này dẫn đến #VALUE và tôi thậm chí không thể đến điểm dừng đầu tiên trong chức năng của mình.

Tôi đang lập trình tạo bảng tính và số lượng giá trị trong mảng là biến, vì vậy tôi không thể làm điều đó với một hàm có 5 tham số, v.v. sẽ là một lựa chọn.

Làm thế nào tôi có thể làm điều này để làm việc?

Câu trả lời:


2

ByRef có nghĩa là bạn phải chuyển một tham chiếu đến (địa chỉ của) một đối tượng hiện có làm đối số, để nó có thể hoạt động với đối tượng thực tế đó; so với ByVal có nghĩa là bạn vượt qua một giá trị và giá trị đó sẽ được sao chép vào đối số nhận.

Vì vậy, bạn không thể chuyển danh sách các giá trị làm tham chiếu, bạn cần tạo một đối tượng Phạm vi chứa các giá trị của bạn và sau đó chuyển đối tượng (tham chiếu đến đó) làm đối số đó.

Vấn đề ở đây là Range đối tượng trong Excel là một đại diện của một tập hợp các ô thực tế, nhưng tôi tin rằng NamedRange lớp sẽ cho phép bạn lập trình một đối tượng Phạm vi 'ảo', với các ô ảo chứa giá trị của bạn, nhưng tôi chưa bao giờ sử dụng nó một cách cá nhân. :)

Tôi tin rằng câu hỏi này tại StackOverflow (về cơ bản) giống với câu hỏi của bạn và đáng để kiểm tra:

Microsoft Excel: Lập trình tạo một phạm vi có tên ẩn


Kỹ năng googling của bạn tin vào bản năng lập trình của bạn.
surfasb

@surfasb Bạn biết đấy, tôi phải mất đến bây giờ mới hiểu được ý của bạn là gì và làm thế nào để lấy nó, ngay cả sau khi tôi hỏi bạn. :) Trong trường hợp này, các kỹ năng làm việc bán thành thạo của tôi đã được sử dụng để trấn an bản thân tôi (tôi) vẫn hiểu các con trỏ trong VBA và điền vào câu trả lời bằng các liên kết. ;)
Ƭᴇcʜιᴇ007

Vâng, tôi có lẽ nên đưa ra tuyên bố "... tin rằng bạn thiếu bản năng lập trình :)" Sự mâu thuẫn sẽ làm cho sự trớ trêu trở nên rõ ràng hơn.
surfasb

0

Nếu bạn thay đổi các tham số chức năng thành

Function ToLevelCode_Range(val As Double, R As Variant)

nó sẽ chấp nhận cả một phạm vi và một mảng

Tất nhiên bạn sẽ cần xử lý các loại dữ liệu khác nhau trong mã chức năng

Khi được gọi là =ToLevelCode_Range(B2, Categories!D1:D4) R sẽ là loại Variant/Object/Range

Khi được gọi là =ToLevelCode_Range(B2, { 0.38, 0.78, 1.18, 1.58 }) R sẽ là loại Variant/Variant(1 to 4)

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.