Táboa de contidos
Neste artigo, analizaremos os problemas que pode enfrontar ao utilizar funcións personalizadas nos seus libros de traballo. Tentarei mostrarche o que os causa e a facilidade con que se poden resolver.
Isto é do que falaremos:
Antes falamos do que é un función personalizada é como creala e usala. Se pensas que necesitas actualizar previamente os coñecementos básicos das UDF, fai unha pausa e mira o meu artigo anterior.
Por que non se recalcula Excel UDF?
Cando fai algún cambio en o teu libro de traballo, Excel non volverá calcular todas e cada unha das fórmulas que teñas alí. Actualizará os resultados para aquelas fórmulas que só estean ligadas ás celas modificadas.
Pero isto refírese ás funcións estándar de Excel. En canto ás personalizadas, Excel non pode validar o código VBA e identificar outras celas que tamén poidan afectar o resultado da función personalizada. Polo tanto, é posible que a túa fórmula personalizada non cambie cando fagas cambios no libro de traballo.
Para solucionar o problema, só terás que utilizar a instrución Application.Volatile . Consulte o seguinte capítulo para coñecer as instrucións paso a paso sobre como aplicalo.
Funcións personalizadas volátiles e non volátiles
Por defecto, as funcións personalizadas en Excel non son volátiles. Isto significa que a UDF só se recalcula se cambia o valor dalgunha das celas ás que fai referencia. Pero se o formato das celas, o nome dofolla de traballo, o nome do ficheiro cambia, entón non se producirán cambios na UDF.
Pasemos de palabras a exemplos. Por exemplo, cómpre escribir o nome do seu libro de traballo nunha cela. Para iso, crea unha función personalizada:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Agora imaxina o seguinte caso. Escribiches a fórmula personalizada =WorkbookName() na cela e obtivo o nome do ficheiro alí. Dentro dun tempo, decidiu cambiar o nome do ficheiro e gardouno cun nome diferente. Pero miras o valor da cela e ves que non cambiou. Aínda hai un nome de ficheiro antigo que xa non é correcto.
Como non hai argumentos nesta función, a función non se recalcula (aínda que cambie o nome do libro de traballo, pechao e despois volve abrir iso).
Nota. Para recalcular todas as funcións do teu ficheiro, podes usar o atallo Ctrl + Alt + F9.
Hai algún xeito máis sinxelo? Para facer que a fórmula se recalcule cada vez que cambie a folla de traballo, necesitas unha liña de código adicional. Pega o seguinte fragmento de código ao comezo da túa función:
Application.Volatile
Entón, o teu código terá o seguinte aspecto:
Función WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Agora a túa UDF é volátil, polo tanto, volverase calcular automaticamente se algunha cela da folla de traballorecalculouse ou se produciu algún cambio no libro de traballo. En canto cambie o nome do ficheiro, verá esa actualización inmediatamente.
Nota. Ten en conta que demasiadas funcións volátiles poden ralentizar o teu Excel. Despois de todo, hai demasiadas funcións personalizadas que realizan cálculos complexos e operan continuamente en grandes intervalos de datos.
Polo tanto, recomendo usar a volatilidade só onde realmente se necesita.
Por que non están dispoñibles as funcións personalizadas
Cando introduce as primeiras letras do nome dunha función personalizada, aparece na lista despregable situada ao carón da cela de entrada, igual que as funcións estándar de Excel.
Non obstante, isto non sempre ocorre. Que erros poden provocar esta situación?
Se tes Excel 2003-2007, a UDF nunca aparecerá na lista despregable. Alí só podes ver funcións estándar.
Pero aínda que esteas a usar unha versión máis recente de Excel, hai outro erro que podes cometer accidentalmente.
Verás, a función personalizada debe estar en un módulo VBA estándar chamado Módulos. Cando engades un novo módulo para escribir o código da función, créase automaticamente un cartafol Módulos no que se escriben todos os módulos.
Pero ás veces ocorre que un módulo novo non está escrito. creándose. Na seguinte captura de pantalla podes ver que o código de función personalizado está no módulo "Obxectos de Microsoft Excel" xunto conEste libro de traballo.
A cuestión é que non pode colocar unha función personalizada na área de código dunha folla de traballo ou libro de traballo. Neste caso, a función non funcionará. Ademais, non aparecerá na lista despregable de funcións. Polo tanto, o código debe estar sempre no cartafol Módulos .
Non se mostra o texto de axuda da función personalizada de Excel
Outro problema que pode ocorrer é a pista que ves ao pegar unha función personalizada. Se usa unha función estándar, sempre verá unha información sobre ferramentas para a función e os seus argumentos. Pero que pasa coas UDF?
Se tes moitas funcións personalizadas, será moi difícil lembrar que cálculos fai cada unha delas. Será aínda máis difícil recordar que argumentos usar. Creo que será unha boa idea ter unha descrición das túas funcións personalizadas como recordatorio.
Para iso, suxeriríame que uses o método Application.MacroOptions . Axudarache a mostrar a descrición non só da función senón tamén de cada un dos seus argumentos na xanela do Asistente de funcións. Ves esta xanela cando fai clic no botón Fx na barra de fórmulas.
Imos ver como engadir unha suxestión deste tipo ás túas UDF. No artigo anterior analizamos a función personalizada GetMaxBetween. Busca o número máximo no intervalo especificado e toma tres argumentos: un intervalo de valores numéricos e un valor máximo e mínimo parabuscar.
Agora engadiremos unha descrición para esta función personalizada. Para iso, cree e execute o comando Application.MacroOptions . Para a función GetMaxBetween , pode executar o seguinte comando:
Sub RegisterUDF () Dim strFuncName As String 'nome da función que quere rexistrar Dim strDescr As String ' descrición da función mesmo Dim strArgs () As String 'descrición dos argumentos da función ' Rexistrar a función GetMaxBetween ReDim strArgs (1 a 3) 'Número de argumentos na túa función strFuncName = "GetMaxBetween" strDescr = "Número máximo no intervalo especificado" strArgs (1) = "Rango de valores numéricos" strArgs (2) = "Borde de intervalo inferior " strArgs (3) = " Borde de intervalo superior " Macro de aplicación.MacroOptions: = strFuncName, _ Descrición: = strDescr, _ ArgumentDescriptions: = strArgs, _ Categoría: = " As miñas funcións personalizadas " End Sub
ou
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Número máximo no intervalo especificado", _ Categoría: = "O meu Funcións personalizadas" , _ ArgumentDescriptions: = Matriz (_ "Rango de valores numéricos" , _ "Intervalo inferior bor der" , _ "Borde do intervalo superior" ) End SubVariable str FuncName é o nome da función. strDescr - descrición da función. As variables strArgs conteñen suxestións para cada argumento.
Pode preguntarse cal é o cuarto argumento paraAplicación.MacroOpcións. Este argumento opcional chámase Categoría e indica a clase de funcións de Excel na que se colocará a nosa función personalizada GetMaxBetween () . Podes poñerlle o nome de calquera das categorías existentes: Matemáticas e amp ; Trig, estatística, lóxica, etc. Podes especificar un nome para a nova categoría na que colocarás as funcións que crees. Se non utilizas o argumento Categoría, a función personalizada colocarase automaticamente na categoría "Definido polo usuario".
Pega o código da función na xanela do módulo:
A continuación, fai clic no botón "Executar". O comando realizará todos os axustes para usar o botón Fx coa súa función GetMaxBetween() .
Se tenta inserir unha función nunha cela usando o Inserir función , verá que a súa función GetMaxBetween está na categoría "As miñas funcións personalizadas":
Ti pode simplemente comezar a escribir o nome da función na cela e verá a súa función personalizada na lista despregable de funcións para seleccionar.
A continuación, chame ao Asistente de funcións. co botón Fx.
Consello. Tamén pode usar a combinación de teclas CRTL + A para abrir o asistente de funcións.
Na xanela Asistente de funcións verá unha descrición da súa función, así como unha suxestión para o primeiro argumento. Se coloca o cursor sobre osegundo ou terceiro argumento, tamén verás suxestións para eles.
Se queres cambiar o texto destas suxestións, cambia os valores de strDescr e strArgs variables no código RegisterUDF () . A continuación, executa o comando RegisterUDF () de novo.
Se queres desfacer todos os axustes feitos e borrar a descrición da función, executa este código:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Descrición: = Baleiro , ArgumentDescriptions: = Baleiro , Categoría: = Baleiro End Sub
Hai un xeito máis de obter unha pista cando introduce unha función personalizada. Introduza o nome da función e prema Ctrl + Maiús + A :
=GetMaxBetween(
+ Ctrl + Maiús + A
Verá unha lista de todos os argumentos da función:
Desafortunadamente, aquí non verá a descrición da función e os seus argumentos. Pero se os nomes dos argumentos son bastante informativos, tamén poden ser útiles. Aínda así, é mellor que nada :)
Precisará un pouco máis de traballo crear intelisense para UDF que funcionen como funcións estándar de Excel. Desafortunadamente, Microsoft non ofrece ningunha opción. A única solución dispoñible actualmente é unha extensión Excel-DNA IntelliSense. Podes atopar máis información no sitio web do programador.
Agardamos que estas directrices che axuden a resolver problemas cando a túa función personalizada non funciona ou non funcionatraballa como queiras. Non obstante, se a túa UDF aínda non funciona, describe o teu problema con precisión na sección Comentarios. Tentaremos descubrilo e atopar a solución para ti ;)