Problemas creando mi primera función

mcalde

New Member
Joined
Mar 24, 2008
Messages
14
Hola:

Tengo problemas para crear una función. :(:(
Para aprender cómo crear una función, deseo crear la función SUMAR, la cual sumará 2 valores.

Creo dicha función en la carpeta Modulo1 (que se halla dentro de módulos de VBA).

La estructura de la función es:
Option Explicit
Function Sumar(numero1, numero2) As Integer
Dim numero1 As Integer
Dim numero2 As Integer
Add = numero1 + numero2
End Function

Luego al escribir la función en la hoja me sale un error: ¿NOMBRE? :rofl::rofl:

Lo que he tecleado en la celda B1 de la hoja excel ha sido =Sumar(A1;A2).

¿qué es lo que hago mal?

Un saludo

mcalde
 

Excel Facts

Add Bullets to Range
Select range. Press Ctrl+1. On Number tab, choose Custom. Type Alt+7 then space then @ sign (using 7 on numeric keypad)
Code:
Option Explicit

Function Sumar(numero1 As Integer, numero2 As Integer) As Integer
    Add = numero1 + numero2
End Function

No sé si SUMAR es el nombre de la funcion SUM en los versiones espanoles. (Tengo una version aleman.) Quiza si cambias el nombre de tu funcion se marche...
 
Upvote 0
Disculpa, el problema es que no refieres el resultado de la calculacion a la funcion. deberia funcionar como eso:

Code:
Function Sumar(numero1 As Integer, numero2 As Integer) As Integer
    [COLOR=Red]Sumar[/COLOR] = numero1 + numero2
End Function
 
Upvote 0
Muchas gracias por tus comentarios.
He sustituido Add por Sumar y sigo teniendo el mismo problema. El ejemplo de la función SUMAR solamente es un ejemplo. Lo que quiero es aprender a crear funciones personalizadas, pero no lo consigo.

No sé que es lo que hago mal.:(

Aquí te dejo una copia de la función:

Function Sumar(numero1 As Integer, numero2 As Integer) As Integer
Sumar = numero1 + numero2
End Function

Por cierto, en el anterior post se me olvidó comentar que estoy trabajando con EXCEL 2007, por si sirve de algo.:confused:

¿debo hacer algo más en la carpeta Módulo1 de VBA?
¿en que afecta lo de Option Explicit que aparece al inicio del Módulo1?

Muchas gracias, por tu colaboración.:nya:

mcalde
 
Upvote 0
Hola mcalde y bienvenido a MrExcel.

En Excel 2007 usted va a tener que salvar el archivo como un XLSM. Si no hizo eso, Excel va a suprimir todos los módulos de VBA y usted perderá todo.
Además usted va a tener que habilitar macros con sus opciones de seguridad. Si macros están descapacitados, usted siempre verá un error #NAME?
Si usted no sabe como ajustar seguridad con Excel 2007, háganos saber.

Ahora, un par de pensamientos s/ su función. Sé que usted está apenas tratando de descubrir como hacer una que trabaja. Sin embargo...

Así como la tiene va a devolver un INTEGER. O sea: =sumar(0.25,0.2) devolverá 0.
Primer mejoramiento:
Code:
Function Sumar2(numero1, numero2) As Double
    Let Sumar2 = numero1 + numero2
End Function
Ahora, ¿qué pasa si pasamos texto? Así como la tenemos devolverá un #VALUE!
Segundo mejoramiento:
Code:
Function Sumar3(varN1, varN2) As Double
    Dim dblN1#, dblN2#
    On Error Resume Next
    Let dblN1 = CDbl(varN1)
    Let dblN2 = CDbl(varN2)
    Let Sumar3 = dblN1 + dblN2
End Function
Ahora, ¿qué pasa si queremos sumar más de dos cosas?
Tercer mejoramiento:
Code:
Function Sumar4(ParamArray varArray()) As Double
    Dim varItem As Variant, dblN As Double
    On Error Resume Next
    For Each varItem In varArray
        Let dblN = CDbl(varItem)
        Let Sumar4 = Sumar4 + dblN
        Let dblN = 0
    Next varItem
End Function
Ahora ¿Qué pasa si queremos pasar rangos de más de una celda?
Cuarto mejoramiento:
Code:
Function Sumar5(ParamArray varArray()) As Double
    Dim varItem As Variant, dblN As Double, rngCell As Excel.Range
    On Error Resume Next
    For Each varItem In varArray
        If TypeName(varItem) = "Range" Then
            If varItem.Count > 1 Then
                For Each rngCell In varItem.Cells
                    Let dblN = CDbl(rngCell)
                    Let Sumar5 = Sumar5 + dblN
                    Let dblN = 0
                Next rngCell
            Else
                Let dblN = CDbl(varItem)
                Let Sumar5 = Sumar5 + dblN
                Let dblN = 0
            End If
        End If
    Next varItem
End Function
 
Upvote 0
Hola Greg:

Muchísimas gracias.:)

Te cuento dónde tenía el fallo: en el tema de seguridades de macro.

Me ha gustado mucho las diversas soluciones que me has presentado para distintas situaciones. Veo que eres un ARTISTA en esto del VBA.

Yo tengo experiencia con diversos lenguajes de programación y siempre se me ha dado muy bien lo de programar. Pero.... lo del VBA, lo tengo atravesado.:mad:

Tengo miedo a programar en VBA. :rofl:
Cada vez que cae en mis manos una función o subrutina creada en VBA por otros (por ejemplo, las que me has enviado en tu anterior post) intento fijarme y aprender de las "palabras" (comandos) de utilizan. Pero veo que hay una gran diversidad de comandos.

Te pediría un último favor, me podrías sugerir un libro (preferiblemente en castellano, aunque tampoco me importa que fuera en inglés) para iniciarme en el mundo de VBA: en el cual ofrezca una visión general de cada comando.

Tengo varios libros y no me han ayudado de gran cosa. Se limitan a poner varias funciones o subrutinas creadas por un grupo de expertos y a describir el resultado final más que analizar la influencia de cada comando.

Por ejemplo, me ha gustado mucho cómo has tratado el tema de mi función SUMAR, primero para el caso de número enteros, luego para números racionales, posteriormente, si en vez de números lee texto,... Esto me ha permitido ver los comandos que utilizas para cada caso.

Un saludo;)

mcalde
 
Upvote 0
Acotación, simplemente complementaria:
Porque he tendido problemas con Udf, alerto que cuando el Nombre dado a la Function, como en este caso, equivale a los primeros caracteres de una Función de la Biblioteca de Excel, puede surgir un conflicto. No recuerdo exactamente con cual de ellas, pero usando el ejemplo:
SUMAR, podria entrar en con flicto con SUMA, propia de Excel.....
Segun parece, no se ha producido el conflicto, pero bueno crei conveniente el aporte....
 
Upvote 0
En cuanto a libros a nivel introductario usaría algo como Microsoft Office Excel 2007 Visual Basic for Applications Step by Step by Reed Jacobson.

Para nivel mediano algo como Excel 2007 VBA Programmer´s Reference por Green, Bullen, Bovey y Alexander. O uno de los Power Programming de Walkenbach.

Para nivel alto - muy avanzando - el mejor libro que conozco es Professional Excel Development por Bullen, Bovey y Green.

Sobre lo que dice Gali y nombrar funciones ya tengo la maña de usar nombres con "udf" para las que voy a usar como funciones utilizados en celdas. Y para funciones que no son para llamar de celdas sino uso por rutinas de VBA, uso "fn". Asi con solo verlos sé que son míos y no "built-in". Ejemplo: udfWorkbookName(), udfWorkbookPath(), fnIsWorkbookOpen(), fnIsPathValid().
 
Upvote 0
Hola:

Muchas gracias, ahora ya sé por dónde empezar en el mundo de VBA.:)

hasta pronto:biggrin::biggrin:

mcalde
 
Upvote 0

Forum statistics

Threads
1,223,969
Messages
6,175,680
Members
452,667
Latest member
vanessavalentino83

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top