Macro a la que pasar un rango

14/02/2008 - 00:18 por Tio | Informe spam
hola!

quiero hacer una macro, que le pase un rango de celdas, por ejemplo A1:c5

¿como defino esa variable en function?.

function MiFuncion ( MiRango as ______ ) as double



Otra cosa mas, como recorro las celdas del rango?.

gracias!

Preguntas similare

Leer las respuestas

#1 Ivan
14/02/2008 - 00:35 | Informe spam
hola


... una macro, que le pase un rango de celdas, por ejemplo A1:c5





¿como defino esa variable en function?.<<<<




function MiFuncion ( MiRango as Range) as double


Otra cosa mas, como recorro las celdas del rango?.<<<







depende lo que busques, pero un par de posibilidades podrian ser
estas=>

opc.1 => con un bucle For Each +/- asi =>

function MiFuncion ( MiRango as Range) as double
dim celda as range
for each celda in MiRango
' aqui tus instrucciones tipo =>
mifuncion = celda * 2
next

opc.2 => con un bucle For Next +/- asi

function MiFuncion ( MiRango as Range) as double
dim n as long
for n = 1 to MiRango.cells.count
' aqui tus instrucciones tipo =>
mifuncion = mirango.cells(n) * 2
next

son solo dos posibilidades (OJO recorren TODAS las celdas del rango)

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Tio
14/02/2008 - 07:59 | Informe spam
muchas gracias!, creop que es lo que quiero.

voy a probar.

un saludo!
Respuesta Responder a este mensaje
#3 Ivan
14/02/2008 - 14:48 | Informe spam
hola,

solo un comentario/aclaracion:

el ej. que te pongo de uso dentro de los bucles es solo para que
vieras la forma de hacer referencia al elemento correspondiente a cada
iteracion del bucle.

pero tal y como esta planteado en mi ejemplo no tendria sentido, pues
realmente siempre asignaria el ultimo valor del bucle, con lo que
podrias ahorrarte el bucle y asignar directamente el valor del ultimo
elemento

otra cosa seria que fueras añadiendo o buscando algo por todas las
iteraciones hasta encontrarlo o completarlo

bueno, disculpa el ej. un poco 'incorrecto'

un saludo
Ivan
Respuesta Responder a este mensaje
#4 Tio
14/02/2008 - 18:44 | Informe spam
gracias, estoy revisando y no encuentro mi error si quiero sumar todos
los valores numéricos del rango seleccionado¿porque no me funciona este
código?.

Function miFuncion(Rango As range) As Double

Dim n As Long
Dim resultado As Double
resultado = 0


For n = 1 To Rango.Cells.Count
resultado = resultado + range.Cells(n).Value
Next

miFuncion = resultado
End Function
Respuesta Responder a este mensaje
#5 Ivan
14/02/2008 - 21:30 | Informe spam
hola

..., estoy revisando y no encuentro mi error si quiero sumar todos




los valores numéricos del rango seleccionado¿porque no me funciona este
código?.<<<<



si el codigo es exactamente igual al expuesto, una respuesta podria
ser (entre a lo mejor otras) =>

For n = 1 To Rango.Cells.Count
resultado = resultado + range.Cells(n).Value
Next




.->porque donde deberias recorrer el rango pasado a la funcion (RANGO)
estas recorriendo un RANGE que no se corresponde con nada, pues en si
mismo el uso de Range que haces no tienes sentido. cambialo por Rango
(con 'o' al final), que es de donde estas intentando obtener el valor
de la celda n =>

For n = 1 To Rango.Cells.Count
resultado = resultado + Rango.Cells(n).Value
Next

.-> de todas formas si el ej. expuesto es solo para probar esta bien,
pero si es el fin que buscas creo que hay formas bastante mas
eficientes, o como poco mas seguras. Te comento =>

a) por un lado, y aunque como despues te comento hay formas mucho mas
eficientes y sencillas de sumar un rango,

al menos deberias tener en cuenta, que, en caso de que en el rango
pasado como argumento hubiese alguna celda con texto, te devolveria un
error. Lo cual, si lo usas como formula de hoja, puede que incluso sea
lo que quieres, para evitar el meter datos no numericos (te
devolveria, si no me equivoco, #VALOR#), pero usado por codigo te
saltaria un error que detendria la ejecucion.

para evitarlo una posibilidad seria, dentro del bucle y antes de la
suma, omitir el contror de errores Y restiuirlo inmediatamente
despues, en la misma iteracion. De esta manera evitaria que te saltase
el error en caso de dato incorrecto, pero el bucle continuaria y te
sumaria solo los correctos. +/- asi (sin tocar apenas tu funcion)=>

Function miFuncion(Rango As Range) As Double
Dim n As Long
Dim resultado As Double
resultado = 0
For n = 1 To Rango.Cells.Count
On Error Resume Next
resultado = resultado + Rango.Cells(n).Value
On Error GoTo 0
Next
miFuncion = resultado
End Function

b) de todas formas, como te comentaba, esta accion en concreto (sumar
las celdas de un rango), para hacerlo bastante mas sencillo y rapido
podrias,

.-> si es en hoja usar directamente la funcion 'Suma' de excel (suelen
ser infinitamente mas rapidas las funciones integradas que las
personalizadas)

.-> si lo quieres por codigo, prueba algo asi =>

Function Mi_Funcion(Rango As Range) As Double
Mi_Funcion = Application.Sum(Rango)
End Function

espero te ayude

un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida