Berikan nilai alih-alih rentang ke Fungsi VBA

0

Saya membuat fungsi VBA di Excel 2007. Seseorang memiliki prototipe:

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

Saya bisa menyebutnya seperti ini dan mendapat hasil yang benar:

=ToLevelCode_Range(B2, Categories!D1:D4)

Ada sebuah instance, di mana saya ingin parameter kedua menjadi seperangkat nilai tertentu:

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

Ini menghasilkan #VALUE, dan saya bahkan tidak bisa mencapai breakpoint pertama dalam fungsi saya.

Saya secara terprogram menghasilkan spreadsheet, dan jumlah nilai dalam array adalah variabel, jadi saya tidak bisa melakukannya dengan fungsi dengan 5 parameter, dll. Saya tidak tahu apakah VBA memiliki sintaksis daftar argumen variabel, tapi itu akan menjadi pilihan.

Bagaimana saya bisa membuatnya bekerja?

Walter Williams
sumber

Jawaban:

2

ByRef berarti bahwa Anda harus memberikan referensi ke (alamat) objek yang ada sebagai argumen, sehingga dapat bekerja dengan objek aktual tersebut; vs. ByVal yang berarti Anda akan melewatkan nilai, dan nilai itu akan disalin ke argumen penerima.

Jadi Anda tidak bisa meneruskan daftar nilai sebagai referensi, Anda perlu membuat objek Rentang yang menyimpan nilai-nilai Anda, dan kemudian meneruskan objek (referensi ke itu) sebagai argumen itu.

Masalahnya di sini adalah bahwa Rangeobjek di Excel adalah representasi dari set Cell yang sebenarnya, tapi saya percaya kelas NamedRange akan memungkinkan Anda untuk secara terprogram membuat objek Range 'virtual', dengan sel-sel virtual yang berisi nilai-nilai Anda, tapi saya sudah tidak pernah menggunakannya secara pribadi. :)

Saya percaya pertanyaan ini di StackOverflow (pada dasarnya) sama dengan Anda, dan layak untuk dicoba:

Microsoft Excel: Secara terprogram membuat rentang bernama tersembunyi

Ƭᴇcʜιᴇ007
sumber
Keahlian googling Anda memungkiri insting pemrograman Anda.
surfasb
@surfasb Anda tahu, butuh sampai sekarang untuk akhirnya memahami apa yang Anda maksud dengan itu, dan bagaimana cara mengambilnya, bahkan setelah saya bertanya kepada Anda. :) Dalam hal ini, keterampilan googling semi-kompeten saya digunakan untuk meyakinkan diri sendiri bahwa saya (masih) mengerti petunjuk dalam VBA, dan untuk mengisi jawabannya dengan tautan. ;)
Ƭᴇcʜιᴇ007
Ya, saya mungkin harus membuat pernyataan "... memungkiri kurangnya insting progamming Anda :)" Kontradiksi akan membuat ironi lebih jelas.
surfasb
0

Jika Anda mengubah parameter fungsi menjadi

Function ToLevelCode_Range(val As Double, R As Variant)

itu akan menerima rentang dan array

Tentu Anda perlu menangani berbagai tipe data dalam kode fungsi

Saat dipanggil sebagai =ToLevelCode_Range(B2, Categories!D1:D4)R akan mengetikVariant/Object/Range

Saat dipanggil sebagai =ToLevelCode_Range(B2, { 0.38, 0.78, 1.18, 1.58 })R akan mengetikVariant/Variant(1 to 4)

chris neilsen
sumber