Detectar valor numérico en un rango de datos

Quisiera preguntaros lo siguiente:
He programado una macro haciendo que el Excel detecte si el contenido de la celda es numérico o no, y en función de este, continuar con la macro o pararse en ese punto.
El código es el siguiente:
----------------------------------------------------------------------------
If Not IsNumeric(ActiveSheet.Range("A1")) Then
MsgBox Prompt:="En la casilla A1 no hay ningún valor numérico", Title:="ERROR"
Continuar= False
End If
-----------------------------------------------------------------
Funciona bien para la celda A1, lo que pasa es que a mi me interesa que lo que analice si es numérico o no sea un rango de datos, concretamente el Range("B2:C2"). El problema es que si en la primera linea donde pone A1, lo modifico por B2:C2, la macro no funciona.
Tiene que ser ese rango exactamente, no me sirve ninguna celda.
¿Cómo podría hacer para que me detectara si en ese rango hay algún contenido numérico o no?

1 respuesta

Respuesta
1
Debes hacer un bucle que recorra cada celda del rango que quieres, checa
For Each c In Range("B2:C2")
    If Not IsNumeric(c) Then
        MsgBox "No es numerico"
        c.Select
    End If
Next
O como en tu caso son solo dos celdas, puedes modificar un poco tu macro asi:
If Not IsNumeric(Range("B2")) OR Not IsNumeric(Range("C2")) Then
MsgBox Prompt:="En la casilla A1 no hay ningún valor numérico", Title:="ERROR"
Continuar= False
End If
Omití el "ActiveSheet" porque si el código afecta a la hoja activa, no es necesario hacer referencia a la misma.
Muchas gracias. Lo he estado revisando y me he dejado una cosa. Inicialmente el código es el siguiente:
-----------------------------------------------
Range("B2:C2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
--------------------------------------------------
A partir de aquí tenemos una selección hasta el final del todo de las columnas B i C. La duda es que necesito detectar si contiene algún carácter numérico o no. En caso que la selección esté vacía, que pare la macro, y si contiene algún valor numérico, que continué.
Muchas gracias
Ok, solo hay que hacer una pequeña modificación:
Range("B2:C2").Select
Range(Selection, Selection.End(xlDown)).Select
For Each c In Selection.Cells
    If Not IsNumeric(c) or c.value = "" Then
        MsgBox "No es numerico ó está Vacía"
        c.Select
    End If
Next
Hola, soy el mismo usuario que antes, he ejecutado tu código, pero he visto que analiza una por una las celdas y se tiene que ir aceptando para cada celda que sea vacía o sin valor numérico. Lo que pasa es que estamos hablando de más de 2000 celdas, y no es factible. He pensado detenidamente, y creo que mi petición de reconocer la selección es muy liosa, y para lograr el mismo objetivo, he planteado la idea de otra forma, mucho más fácil, creo. Aquí añado la idea:
Tengo un libro de excel con 2 hojas, la Hoja1, aparecen 5 botones:                                      
                                                        ----mesa1----
                                                        ----mesa2----
                                                        ----mesa3----
                                                        ----mesa4----
                                           ----Imprime todas las mesas----
Y en la Hoja2 tengo muchos valores asociados a cada mesa, aunque no siempre de todas las mesas: por ejemplo, puede ser que un día haya valores de la mesa 1 y 2 solamente, como otro día puede haber valores de las cuatro mesas.
Los cuatro primeros botones de la Hoja1 tienen asociada una macro propia, la cual indica que filtre los valores de la segunda hoja en función de la mesa, y los imprima en una plantilla.
El botón "imprime todas las mesas" ejecuta las 4 macros de los otros botones automáticamente.
Al hacer click en el botón de "imprime todas las lineas" siempre se imprimen las 4 plantillas con los valores de las 4 mesas, independientemente que existan datos de esa mesa o no. Cuando no existen, la macro se ejecuta igualmente e imprime la plantilla en blanco.
Me gustaría evitar que se impriman las plantillas en blanco, añadiendo una macro o añadiendo un código a las macros que tienen asignadas los botones "mesa1", "mesa2", "mesa3" y "mesa4", y que de esta forma, cuando se haga click en el botón "imprime todas las lineas", ignore las mesas que no aparecen en la hoja2, y sólo filtre con el autofiltro e imprima las que sí tienen datos.
=========================Esquema===============================
Hacemos click al botón "Imprime todas las líneas"
--Se ejecuta la macro del botón mesa1
----¿Existe algún valor de la mesa1 en la hoja2?
-- Sí---entonces filtralos por mesa2, imprime, luego pasa al macro del botón mesa2
-- No----- entonces pasa al macro del botón mesa2
--Se ejecuta la macro del botón mesa2
----¿Existe algún valor de la mesa2 en la hoja2?
-- Sí---entonces filtralos por mesa2, imprime, luego pasa al macro del botón mesa3
-- No----- entonces pasa al macro del botón mesa3
--Se ejecuta la macro del botón mesa3
----¿Existe algún valor de la mesa3 en la hoja2?
-- Sí---entonces filtralos por mesa3, imprime, luego pasa al macro del botón mesa4
-- No----- entonces pasa al macro del botón mesa4
--Se ejecuta la macro del botón mesa4
----¿Existe algún valor de la mesa4 en la hoja2?
-- Sí---entonces filtralos por mesa4, imprime, luego acaba ejecución de la macro
-- No----- entonces acaba la ejecución de la macro
=============================================================
El código del filtro y la impresión ya están implementados, lo que necesito es saber cómo se hace para que reconozca de qué mesa o mesas son los datos de la hoja2, para poder seguir el esquema anterior
Por ejemplo, se podría implementar una búsqueda justo al principio del código asignado para cada botón, en la cual se busque si existe el nombre de la mesa a tratar (mesa1, mesa2, mesa3 o mesa4), y si existe, que siga ejecutando, y sino, que pase a la siguiente mesa. De la forma que alguna variable sea true, que haga la búsqueda, y si no encuentra la mesa correspondiente en la hoja2, que la variable sea false, y si es false que pase a la siguiente, o algo parecido
No sabría como escribir este código. ¿Tendrías alguna otra idea?
Muchas gracias por tu ayuda
Creo que seria mejor si m envías tu arechivo para analizarlo
[email protected]
Hola! He indagado en las ayudas y en manuales de visual basic, y he podido seguir adelante gestionando los errores que aparezcan, de tal manera que si encuentra un error, que ejecute una macro, y con un poco de esfuerzo y probando me ha funcionado.
Siento si he sido lioso al explicarme, lo he intentado hacer de la mejor manera.
De todas formas, muchísimas gracias por tu ayuda!
Saludos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas