Error al enviar rango de celdas a UDF en EXCEL!

Hola.-
Intento, a través de una UDF creada por mi, revisar un rango de celdas en EXCEL.
El caso es que la UDF recibe como parámetro un rango de celdas seleccionado en la hoja de cálculo, pero al ejecutarse obtengo "#¡VALOR!".
Hasta donde he podido observar, el error se presenta cuando intento hacer referencia a algún elemento de la matriz en cuestión; por ejemplo, al utilizar funciones como LBound o UBound, o cuando utilizo el índice para referirme a un elemento en particular; supongamos aMatriz(3).
Les envío un ejemplo de lo que pretendo hacer, a ver si pueden orientarme y decir cuál es el error que estoy cometiendo.
De antemano, muchas gracias!
Ejemplo:
En la hoja de Cálculo tenemos Nombres de Ciudades en la columna A, desde A1 hasta A50 (y esto puede variar; no es fijo el tamaño de la matriz); y en la celda C1 escribo "=ElDatoX(A1:A50)"
En el editor de Visual Basic, en el Módulo correspondiente, el siguiente código:
==========================================================
Function ElDatoX(aMatriz as Variant) as Variant
   If Not IsArray(aMatriz) Then
      ElDatoX = "<<¡¡Debe ser una Matriz>>"
      Exit Function
   Endif
   Dim nI as Integer
   For nI = 1 To Ubound(aMatriz)
      x = MsgBox(aMatriz(nI), vbCritical, nI)
   Next
End Function
===========================================================
NOTA: Estoy usando EXCEL 2003 y la Version de VB es 6.3.-

1 Respuesta

Respuesta
1
Si lo que buscas es tener una función personal, esta debería devolverte un valor, de otro lado, cuando le ingresas parámetros a una función, estos deberían ingresar a la función a manera de rangos para que puedas operar más fácilmente con ellos.
No sé si quizás estoy mal interpretando tu pregunta, pero quisiera que revises si se trata de esto.
Estimado Tavopz.-
Antes de todo, quiero agradecerte el tiempo que te tomaste para atender mi inquietud. En verdad me parece que lo que tú y tus demás compañeros en TODOEXPERTOS hacen es sencillamente excepcional. Por favor, continúen haciéndolo!
Por otro lado, debo comentarte que tu respuesta me ha dejado en el mismo punto. Coincido contigo en que mi UDF debe regresar un valor; de hecho, para eso es que la creé. La porción de código que te envié era solo un ejemplo que recoge la esencia del error con el que me encuentro.
Así mismo, sugieres que ingrese parámetros a la UDF "a manera de rangos" (¿? ); podrías, por favor, ¿Darme un ejemplo concreto?
Finalmente, no creo que hayas interpretado mal mi pregunta; más bien, pienso que yo no le he planteado de manera correcta.
El hecho es que yo deseo crear una función que reciba como parámetro un rango de celdas (el cual puede variar según el caso), revise cada elemento de dicho rango para evaluar ciertas condiciones que me interesan y devuelva un valor en particular.
Hice el código correspondiente y, en teoría, su lógica funciona; pero cuando lo implemento en VB (en la macro de EXCEL) me encuentro con la limitante de que la evaluación por parte de este lenguaje, al parecer requiere de algo que desconozco para que funcione.
En concreto, si envío un rango de celdas como parámetro a una UDF, cómo puedo referirme dentro de esta función (a nivel de código) a un elemento de dicho rango si que se produzca el error que te comenté; o bien, ¿cómo puedo pasar este rango de celdas a la función para que esta pueda manipularlo correctamente?
Si no es mucho pedir, apreciaría que hicieras lo siguiente: copia el trocito de código que te envié y pégalo en el módulo de VB correspondiente a una hoja de cálculo, luego invoca la función desde alguna celda de esa hoja de cálculo, ingresandole entre los paréntesis un rango cualquiera de celdas. Como resultado obtendrás el error al que ya te he hecho referencia. Creo que es la manera más sencilla en la que puedo intentar expresar mi planteamiento.
Pase lo que pase, siempre estaré agradecido por tu interés. Hasta siempre!
Fíjate en esta función personal, y te explicaré más o menos cómo funciona. No digo que sea la única forma de hacerlo, es la que pienso funciona más adecuadamente:
Public Function MiFuncion(a As Range, Minimo As Range, Maximo As Range) As String
Dim x As Range
For Each x In a
    If x > Minimo And x < Maximo Then
             z = z & "," & x.Address
    End If
Next x
MiFuncion = z
End Function

Verás que la función "MiFuncion" (esta función a lo mejor no tiene mucho sentido pero quise hacer algo con lo que pudiera explicarlo), tiene tres argumentos a, Mínimo, Máximo.
Supón que tienes un gran listado de números y quisieras saber en cuáles celdas se encuentran números que estén entre un rango determinado (mínimo y máximo). Pues bien, la función lo que hace es tomar todas las celdas del rango "a", y compara estos valores con el valor mínimo y máximo, finalmente, la función devuelve un String que contiene las direcciones de cada una de las celdas que coinciden.
Entonces sería algo como esto:
http://es.geocities.com/webtavopz/Files/ejemplo_funcionpersonal.xls
Espero que con esto te quede un poco más claro. Sino, no dudes en preguntar otra vez.
Estimado Tavopz.-
EXCELente!
Muchísimas gracias por tu atención a mi pregunta. Implementé la idea que sugeriste y resultó A LA PRIMERA!
Como imagino habrás podido darte cuenta, estoy dando mis primeros pasos en esto de programar en el ambiente VB - EXCEL; por lo que estoy muy agradecido por la atención que has hecho de mi caso.
Debo destacar la rapidez con que contestaste y lo puntual que fuiste al darme un ejemplo concreto de solución.
Nuevamente MUCHAS GRACIAS y, aunque no pretendo volverme una molestia, tal vez me veas de nuevo por estos lados requiriendo de consejos.
Hasta siempre!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas