Excel UDF tidak berfungsi: masalah dan penyelesaian

  • Berkongsi Ini
Michael Brown

Dalam artikel ini, kami akan melihat isu yang mungkin anda hadapi apabila menggunakan fungsi tersuai dalam buku kerja anda. Saya akan cuba menunjukkan kepada anda apa yang menyebabkannya dan betapa mudahnya ia boleh diselesaikan.

Berikut ialah perkara yang akan kita bincangkan:

    Sebelum ini kita bercakap tentang apa yang fungsi tersuai ialah, cara mencipta dan menggunakannya. Jika anda rasa anda perlu menyegarkan semula pengetahuan asas tentang UDF terlebih dahulu, berhenti seketika dan lihat artikel saya sebelum ini.

    Mengapa Excel UDF tidak mengira semula?

    Apabila anda membuat sebarang perubahan dalam buku kerja anda, Excel tidak akan mengira semula setiap formula yang anda ada di sana. Ia akan mengemas kini keputusan untuk formula tersebut yang dipautkan kepada sel yang diubah sahaja.

    Tetapi ini melibatkan fungsi Excel standard. Bagi yang tersuai, Excel tidak boleh mengesahkan kod VBA dan mengenal pasti sel lain yang juga boleh menjejaskan hasil fungsi tersuai. Oleh itu, formula tersuai anda mungkin tidak berubah apabila anda membuat perubahan pada buku kerja.

    Untuk menyelesaikan isu ini, anda hanya perlu menggunakan pernyataan Application.Volatile . Lihat bab seterusnya untuk mengetahui arahan langkah demi langkah tentang cara menggunakannya.

    Fungsi tersuai tidak menentu vs tidak menentu

    Secara lalai, fungsi tersuai dalam Excel tidak meruap. Ini bermakna bahawa UDF dikira semula hanya jika nilai mana-mana sel yang dirujuknya berubah. Tetapi jika format sel, namalembaran kerja, nama fail berubah, maka tiada perubahan akan berlaku dalam UDF.

    Mari bertukar daripada perkataan kepada contoh. Sebagai contoh, anda perlu menulis nama buku kerja anda dalam sel. Untuk melakukan ini, anda mencipta fungsi tersuai:

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    Sekarang bayangkan kes berikut. Anda menulis formula tersuai =WorkbookName() ke dalam sel dan mendapat nama fail di sana. Tidak lama kemudian, anda memutuskan untuk menamakan semula fail dan menyimpannya dengan nama lain. Tetapi anda melihat nilai dalam sel dan melihat bahawa ia tidak berubah. Masih terdapat nama fail lama yang tidak lagi betul.

    Memandangkan tiada hujah dalam fungsi ini, fungsi tidak dikira semula (walaupun anda menukar nama buku kerja, tutupnya dan kemudian buka semula ia).

    Nota. Untuk mengira semula semua fungsi dalam fail anda, anda boleh menggunakan pintasan Ctrl + Alt + F9.

    Adakah cara yang lebih mudah? Untuk membuat pengiraan semula formula setiap kali lembaran kerja berubah, anda memerlukan baris kod tambahan. Tampalkan sekeping kod berikut pada permulaan fungsi anda:

    Application.Volatile

    Jadi, kod anda akan kelihatan seperti ini:

    Fungsi WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Kini UDF anda tidak menentu, oleh itu ia akan dikira semula secara automatik jika ada sel dalam lembaran kerjatelah dikira semula atau sebarang perubahan telah berlaku dalam buku kerja. Sebaik sahaja anda menukar nama fail, anda akan melihat kemas kini itu serta-merta.

    Nota. Sila ingat bahawa terlalu banyak fungsi yang tidak menentu boleh melambatkan Excel anda. Lagipun, terdapat terlalu banyak fungsi tersuai yang melakukan pengiraan kompleks dan beroperasi pada julat data yang besar secara berterusan.

    Oleh itu, saya mengesyorkan menggunakan turun naik hanya di tempat ia benar-benar diperlukan.

    Mengapa fungsi tersuai tidak tersedia

    Apabila anda memasukkan huruf pertama nama fungsi tersuai, ia muncul dalam senarai lungsur di sebelah sel input, sama seperti fungsi Excel standard.

    Walau bagaimanapun, ini tidak selalu berlaku. Apakah kesilapan yang boleh menyebabkan keadaan ini?

    Jika anda mempunyai Excel 2003-2007, maka UDF tidak pernah muncul dalam senarai lungsur turun. Di sana anda hanya boleh melihat fungsi standard.

    Tetapi walaupun anda menggunakan versi Excel yang lebih baharu, terdapat satu lagi kesilapan yang mungkin anda lakukan secara tidak sengaja.

    Anda lihat, fungsi tersuai mestilah dalam modul VBA standard yang dipanggil Modul. Apabila anda menambah modul baharu untuk menulis kod fungsi, folder Modul dibuat secara automatik di mana semua modul ditulis.

    Tetapi kadangkala ia berlaku bahawa modul baharu tidak semakin tercipta. Pada tangkapan skrin seterusnya anda boleh melihat bahawa kod fungsi tersuai berada dalam modul "Microsoft Excel Objects" bersama-sama denganThis Workbook.

    Intinya ialah anda tidak boleh meletakkan fungsi tersuai dalam kawasan kod lembaran kerja atau buku kerja. Dalam kes ini, fungsi tidak akan berfungsi. Selain itu, ia tidak akan muncul dalam senarai juntai bawah fungsi. Oleh itu, kod hendaklah sentiasa berada dalam folder Modul .

    Teks bantuan fungsi tersuai Excel tidak dipaparkan

    Masalah lain mungkin berlaku ialah pembayang yang anda lihat apabila anda menampal fungsi tersuai. Jika anda menggunakan fungsi standard, anda akan sentiasa melihat petua alat untuk fungsi dan hujahnya. Tetapi bagaimana pula dengan UDF?

    Jika anda mempunyai banyak fungsi tersuai, amat sukar untuk anda mengingati pengiraan yang dilakukan oleh setiap satu daripadanya. Ia akan menjadi lebih sukar untuk mengingati hujah yang hendak digunakan. Saya fikir adalah idea yang baik untuk mempunyai penerangan tentang fungsi tersuai anda sebagai peringatan.

    Untuk ini, saya cadangkan menggunakan kaedah Application.MacroOptions . Ia akan membantu anda menunjukkan penerangan bukan sahaja fungsi tetapi juga setiap hujahnya dalam tetingkap Function Wizard. Anda melihat tetingkap ini apabila anda mengklik butang Fx dalam bar formula.

    Mari lihat cara menambah pembayang sedemikian pada UDF anda. Dalam artikel sebelumnya kami melihat fungsi tersuai GetMaxBetween. Ia mencari nombor maksimum dalam julat yang ditentukan dan mengambil tiga argumen: julat nilai angka, dan nilai maksimum dan minimum untukcari.

    Kini kami akan menambah penerangan untuk fungsi tersuai ini. Untuk melakukan ini, cipta dan jalankan perintah Application.MacroOptions . Untuk fungsi GetMaxBetween , anda boleh menjalankan perintah berikut:

    Sub RegisterUDF () Dim strFuncName As String 'nama fungsi yang anda ingin daftarkan Dim strDescr As String ' keterangan fungsi sendiri Dim strArgs () Sebagai String 'penerangan hujah fungsi ' Daftar GetMaxBetween fungsi ReDim strArgs (1 Hingga 3) 'Bilangan argumen dalam fungsi anda strFuncName = "GetMaxBetween" strDescr = "Nombor maksimum dalam julat yang ditentukan" = strArgs (1) "Julat nilai berangka" strArgs (2) = "Sempadan selang bawah " strArgs (3) = " Sempadan selang atas " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Fungsi Tersuai Saya " End Sub

    atau

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Penerangan: = "Nombor maksimum dalam julat yang ditentukan" , _ Kategori: = "Saya Fungsi Tersuai" , _ ArgumentDescriptions: = Array (_ "Julat nilai angka" , _ "Bor selang rendah der" , _ "Sempadan selang atas" ) End Sub

    Pembolehubah str FuncName ialah nama fungsi. strDescr - penerangan fungsi. Pembolehubah strArgs mengandungi petunjuk untuk setiap hujah.

    Anda mungkin tertanya-tanya apakah hujah keempatAplikasi.MacroOptions. Argumen pilihan ini dinamakan Kategori dan menunjukkan kelas fungsi Excel yang akan diletakkan fungsi GetMaxBetween () tersuai kami. Anda boleh menamakannya selepas mana-mana kategori sedia ada: Matematik & amp ; Trig, Statistik, Logik, dsb. Anda boleh menentukan nama untuk kategori baharu di mana anda akan meletakkan fungsi yang anda cipta. Jika anda tidak menggunakan hujah Category, maka fungsi tersuai akan diletakkan secara automatik dalam kategori "User Defined".

    Tampal kod fungsi ke dalam tetingkap modul:

    Kemudian klik pada butang “Jalankan”. Perintah akan melaksanakan semua tetapan untuk menggunakan butang Fx dengan fungsi GetMaxBetween() anda.

    Jika anda cuba memasukkan fungsi ke dalam sel menggunakan Alat Sisip Fungsi , anda akan melihat bahawa terdapat fungsi GetMaxBetween anda dalam kategori "Fungsi Tersuai Saya":

    Anda boleh mula menaip nama fungsi ke dalam sel dan anda akan melihat fungsi tersuai anda dalam senarai juntai bawah fungsi untuk dipilih.

    Kemudian panggil Function Wizard dengan butang Fx.

    Petua. Anda juga boleh menggunakan kombinasi kekunci CRTL + A untuk membuka Wizard Fungsi.

    Dalam tetingkap Function Wizard anda akan melihat perihalan fungsi anda, serta pembayang untuk hujah pertama. Jika anda meletakkan kursor anda di atasargumen kedua atau ketiga, anda juga akan melihat pembayang untuk mereka.

    Jika anda ingin menukar teks pembayang ini, tukar nilai strDescr dan strArgs pembolehubah dalam kod RegisterUDF () . Kemudian jalankan perintah RegisterUDF () sekali lagi.

    Jika anda ingin membuat asal semua tetapan yang dibuat dan mengosongkan perihalan fungsi, jalankan kod ini:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Penerangan: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Ada satu lagi cara untuk mendapatkan petunjuk apabila anda memasukkan fungsi tersuai. Masukkan nama fungsi dan kemudian tekan Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Anda akan melihat senarai semua argumen fungsi:

    Malangnya, di sini anda tidak akan melihat perihalan fungsi dan hujahnya. Tetapi jika nama hujah itu cukup bermaklumat, jadi ia mungkin membantu juga. Namun, ia lebih baik daripada tiada apa-apa :)

    Ia akan mengambil sedikit usaha lagi untuk mencipta intellisense untuk UDF yang berfungsi seperti fungsi Excel standard. Malangnya, Microsoft tidak menyediakan sebarang pilihan. Satu-satunya penyelesaian yang tersedia pada masa ini ialah sambungan Excel-DNA IntelliSense. Anda boleh mendapatkan maklumat lanjut di tapak web pembangun.

    Diharap, garis panduan ini akan membantu anda menyelesaikan masalah apabila fungsi tersuai anda tidak berfungsi atau tidakbekerja seperti yang anda mahu. Walau bagaimanapun, jika UDF anda masih gagal berfungsi, sila huraikan isu anda dengan tepat dalam bahagian Komen. Kami akan cuba memikirkannya dan mencari penyelesaian untuk anda ;)

    Michael Brown ialah peminat teknologi yang berdedikasi dengan semangat untuk memudahkan proses kompleks menggunakan alat perisian. Dengan lebih sedekad pengalaman dalam industri teknologi, beliau telah mengasah kemahirannya dalam Microsoft Excel dan Outlook, serta Helaian Google dan Dokumen. Blog Michael berdedikasi untuk berkongsi pengetahuan dan kepakarannya dengan orang lain, menyediakan petua dan tutorial yang mudah diikuti untuk meningkatkan produktiviti dan kecekapan. Sama ada anda seorang profesional berpengalaman atau pemula, blog Michael menawarkan pandangan berharga dan nasihat praktikal untuk memanfaatkan sepenuhnya alatan perisian penting ini.