Excel UDF ei toimi: ongelmat ja ratkaisut

  • Jaa Tämä
Michael Brown

Tässä artikkelissa tarkastelemme ongelmia, joita saatat kohdata käyttäessäsi mukautettuja funktioita työkirjoissasi. Yritän näyttää, mistä ne johtuvat ja miten helposti ne voidaan ratkaista.

Puhumme seuraavista asioista:

    Aiemmin puhuimme siitä, mikä mukautettu funktio on, miten se luodaan ja miten sitä käytetään. Jos sinusta tuntuu siltä, että sinun täytyy päivittää perustiedot UDF:istä etukäteen, pidä tauko ja käy läpi edellinen artikkelini.

    Miksi Excel UDF ei laske uudelleen?

    Kun teet muutoksia työkirjaan, Excel ei laske uudelleen jokaista siellä olevaa kaavaa, vaan päivittää tulokset vain niiden kaavojen osalta, jotka liittyvät muutettuihin soluihin.

    Tämä koskee kuitenkin Excelin vakiofunktioita. Mitä tulee mukautettuihin funktioihin, Excel ei pysty validoimaan VBA-koodia eikä tunnistamaan muita soluja, jotka voisivat vaikuttaa mukautetun funktion tulokseen. Siksi mukautettu kaava ei välttämättä muutu, kun teet muutoksia työkirjaan.

    Korjataksesi ongelman, sinun täytyy vain käyttää komentoa Application.Volatile selvitys. Tutustu seuraavassa luvussa vaihe vaiheelta annettaviin ohjeisiin sen soveltamisesta.

    Haihtuvat ja ei-haihtuvat mukautetut toiminnot

    Excelin mukautetut funktiot eivät oletusarvoisesti ole haihtuvia. Tämä tarkoittaa sitä, että UDF lasketaan uudelleen vain, jos sen viittaamien solujen arvo muuttuu. Mutta jos solujen muoto, laskentataulukon nimi tai tiedoston nimi muuttuu, UDF ei muutu.

    Vaihdetaan sanoista esimerkkeihin. Esimerkiksi sinun on kirjoitettava työkirjasi nimi soluun. Tätä varten luot mukautetun funktion:

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

    Kuvittele nyt seuraava tapaus. Kirjoitit mukautetun kaavan nimellä =WorkbookName() soluun ja sait tiedoston nimen sinne. Jonkin ajan kuluttua päätit nimetä tiedoston uudelleen ja tallensit sen eri nimellä. Katsot kuitenkin solussa olevaa arvoa ja huomaat, että se ei ole muuttunut. Siellä on edelleen vanha tiedostonimi, joka ei ole enää oikea.

    Koska tässä funktiossa ei ole argumentteja, funktiota ei lasketa uudelleen (vaikka muuttaisit työkirjan nimeä, sulkisit sen ja avaisit sen sitten uudelleen).

    Huomautus: Voit laskea kaikki tiedostosi funktiot uudelleen Ctrl + Alt + F9 -pikanäppäimillä.

    Onko olemassa helpompaa tapaa? Jotta kaava laskettaisiin uudelleen aina, kun laskentataulukko muuttuu, tarvitset ylimääräisen koodirivin. Liitä seuraava koodinpätkä funktiosi alkuun:

    Application.Volatile

    Koodisi näyttää siis tältä:

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

    Nyt UDF-ohjelmasi on haihtuva, joten se lasketaan automaattisesti uudelleen, jos jokin laskentataulukon solu on laskettu uudelleen tai jos työkirjassa on tapahtunut muutoksia. Heti kun muutat tiedoston nimeä, näet päivityksen välittömästi.

    Huomautus. Muista, että liian monet haihtuvat funktiot voivat hidastaa Exceliä. Onhan liian paljon mukautettuja funktioita, jotka suorittavat monimutkaisia laskutoimituksia ja toimivat jatkuvasti suurilla data-alueilla.

    Siksi suosittelen käyttämään volatiliteettia vain silloin, kun sitä todella tarvitaan.

    Miksi mukautetut toiminnot eivät ole käytettävissä

    Kun kirjoitat mukautetun funktion nimen ensimmäiset kirjaimet, se näkyy syöttösolun vieressä olevassa avattavassa luettelossa aivan kuten tavalliset Excel-funktiot.

    Näin ei kuitenkaan aina tapahdu. Mitkä virheet voivat aiheuttaa tämän tilanteen?

    Jos sinulla on Excel 2003-2007, UDF ei koskaan näy pudotusvalikossa. Siellä näet vain vakiofunktiot.

    Mutta vaikka käyttäisitkin uudempaa Excel-versiota, voit vahingossa tehdä toisen virheen.

    Mukautetun toiminnon on nimittäin oltava VBA:n vakiomoduulissa nimeltä Moduulit. Kun lisäät uuden moduulin funktiokoodin kirjoittamista varten, luodaan automaattisesti Moduulit-kansio, johon kaikki moduulit kirjoitetaan.

    Joskus käy kuitenkin niin, että uutta moduulia ei luoda. Seuraavassa kuvakaappauksessa näet, että mukautetun toiminnon koodi on "Microsoft Excel Objects" -moduulissa yhdessä ThisWorkbookin kanssa.

    Kyse on siitä, että mukautettua funktiota ei voi sijoittaa työarkin tai työkirjan koodialueelle. Tällöin funktio ei toimi. Se ei myöskään näy funktioiden pudotusvalikossa. Siksi koodin pitäisi aina olla kansiossa Moduulit .

    Excelin mukautetun toiminnon ohjetekstiä ei näytetä

    Toinen ongelma voi olla vihje, jonka näet, kun liität mukautetun funktion. Jos käytät vakiofunktiota, näet aina työkaluvihjeen funktiolle ja sen argumenteille. Mutta entä UDF:t?

    Jos sinulla on paljon mukautettuja funktioita, sinun on erittäin vaikea muistaa, mitä laskutoimituksia kukin niistä tekee. Vielä vaikeampaa on muistaa, mitä argumentteja käyttää. Mielestäni on hyvä idea pitää kuvaus mukautetuista funktioista muistutuksena.

    Tätä varten suosittelen käyttämään Application.MacroOptions metodia. Sen avulla voit näyttää funktion lisäksi myös jokaisen sen argumentin kuvauksen Ohjattu funktio -ikkunassa. Tämä ikkuna tulee näkyviin, kun napsautat kaavarivin Fx-painiketta.

    Katsotaanpa, miten tällainen vihje voidaan lisätä UDF:iin. Edellisessä artikkelissa tarkastelimme mukautettua GetMaxBetween-funktiota. Se etsii suurimman luvun määritetyltä alueelta, ja se ottaa kolme argumenttia: numeeristen arvojen alueen sekä suurimman ja pienimmän haettavan arvon.

    Nyt lisätään kuvaus tälle mukautetulle funktiolle. Tätä varten luodaan ja ajetaan komento Application.MacroOptions komento. GetMaxBetween toimintoa, voit suorittaa seuraavan komennon:

    Sub RegisterUDF () Dim strFuncName As String 'rekisteröitävän funktion nimi Dim strDescr As String ' itse funktion kuvaus Dim strArgs () As String 'funktion argumenttien kuvaus ' Rekisteröi GetMaxBetween-funktio ReDim strArgs (1 To 3) 'Funktiosi argumenttien lukumäärä strFuncName = "GetMaxBetween" strDescr = "Maksimiluku määritetyllä alueella" strArgs (1) ="Numeeristen arvojen alue" strArgs (2) = "Alempi väliraja " strArgs (3) = "Ylempi väliraja " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Omat mukautetut funktiot " End Sub

    tai

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Suurin luku määritetyllä alueella" , _ Category: = "Omat mukautetut funktiot" , _ ArgumentDescriptions: = Array (_ "Numeeristen arvojen alue" , _ "Alempi väliraja" , _ "Ylempi väliraja" ) End Sub

    Muuttuva str FuncName on funktion nimi. strDescr - Toiminnon kuvaus. strArgs muuttujat sisältävät vihjeitä kutakin argumenttia varten.

    Saatat ihmetellä, mikä on Application.MacroOptionsin neljäs argumentti. Tämän valinnaisen argumentin nimi on Luokka ja osoittaa Excel-funktioiden luokan, jonka mukautettu GetMaxBetween () Voit nimetä sen minkä tahansa olemassa olevan luokan mukaan: Math & Trig, Statistical, Logical, jne. Voit määrittää uuden luokan nimen, johon sijoitat luomasi funktiot. Jos et käytä Category-argumenttia, mukautettu funktio sijoitetaan automaattisesti "User Defined" -luokkaan.

    Liitä toimintokoodi moduuliikkunaan:

    Napsauta sitten "Suorita"-painiketta. Komento suorittaa kaikki asetukset, jotka tarvitaan, jotta voidaan käyttää Fx painiketta GetMaxBetween() toiminto.

    Jos yrität lisätä funktiota soluun käyttämällä komentoa Lisää toiminto työkalussa näet, että siellä on sinun GetMaxBetween toiminto on kategoriassa "Omat mukautetut toiminnot":

    Voit yksinkertaisesti alkaa kirjoittaa funktion nimeä soluun, ja näet mukautetun funktiosi avattavassa luettelossa, josta voit valita haluamasi funktiot.

    Kutsu sitten Ohjattu toiminto Fx-painikkeella.

    Vihje. Voit avata ohjatun toiminnon myös näppäinyhdistelmällä CRTL + A.

    Vuonna Ohjattu toiminto ikkunassa näet funktiosi kuvauksen sekä vihjeen ensimmäistä argumenttia varten. Jos asetat kursorin toisen tai kolmannen argumentin päälle, näet myös niitä koskevat vihjeet.

    Jos haluat muuttaa näiden vihjeiden tekstiä, vaihda arvoja kentissä strDescr ja strArgs muuttujat RegisterUDF () Suorita sitten RegisterUDF () komento uudelleen.

    Jos haluat peruuttaa kaikki tehdyt asetukset ja tyhjentää toiminnon kuvauksen, suorita tämä koodi:

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

    On vielä yksi tapa saada vihje, kun syötät mukautetun funktion. Kirjoita funktion nimi ja paina sitten Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Näet luettelon kaikista funktion argumenteista:

    Valitettavasti tässä ei näy funktion ja sen argumenttien kuvausta. Mutta jos argumenttien nimet ovat melko informatiivisia, niin niistäkin voi olla apua. Silti, parempi kuin ei mitään :)

    Vaatii hieman enemmän työtä luoda intellisense UDF:ille, jotka toimivat kuten tavalliset Excel-funktiot. Valitettavasti Microsoft ei tarjoa mitään vaihtoehtoja. Ainoa saatavilla oleva ratkaisu on tällä hetkellä Excel-DNA IntelliSense -laajennus. Lisätietoja löydät kehittäjän verkkosivustolta.

    Toivottavasti nämä ohjeet auttavat sinua ratkaisemaan ongelmia, kun mukautettu funktio ei toimi tai ei toimi haluamallasi tavalla. Jos UDF-ohjelmasi ei silti toimi, kuvaile ongelmasi tarkasti Kommentit-osiossa. Yritämme selvittää asian ja löytää ratkaisun puolestasi ;)

    Michael Brown on omistautunut teknologian harrastaja, jolla on intohimo yksinkertaistaa monimutkaisia ​​prosesseja ohjelmistotyökalujen avulla. Yli vuosikymmenen kokemuksella teknologia-alalta hän on hionut taitojaan Microsoft Excelissä ja Outlookissa sekä Google Sheetsissä ja Docsissa. Michaelin blogi on omistettu jakamaan tietojaan ja asiantuntemustaan ​​muiden kanssa, ja se tarjoaa helposti seurattavia vinkkejä ja opetusohjelmia tuottavuuden ja tehokkuuden parantamiseksi. Olitpa kokenut ammattilainen tai aloittelija, Michaelin blogi tarjoaa arvokkaita oivalluksia ja käytännön neuvoja, joiden avulla saat kaiken irti näistä tärkeistä ohjelmistotyökaluista.