Macros en Excel
Estoy haciendo unas macros y tengo en este momento una restricción de conocimiento puesto que debo hacer para un rango de valores que se encuentran almacenados en unas celdas de una hoja en excel, una búsqueda repetitiva de un valor, es decir, por ejemplo buscar "0" en todos los valores de entrada y asignarles a los encontrados una calificación.
No sé como hacerlo, por favor me pueden colaborar!
Gracias!
No sé como hacerlo, por favor me pueden colaborar!
Gracias!
1 respuesta
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
El problema, casualmente, fue lo primero que te sugerí que tuvieras en cuenta:
"... Coloques en la variable "ValorBusq" el número decimal, utilizando el mismo separador de decimales que usas en la hoja (si usas punto decimal en la hoja, en esta variable coloca 3.5) "
Pero, bueno, en definitiva tiens resuelto el problema que es lo único importante.
Recuerda que tienes que finalizar esta pregunta para que otros usuarios (o tu) puedan plantearme otras consultas.
Ten en cuenta que la valoración que figura predeterminada es 3/5. Tal vez quieras cambiarla... :)
Un abrazo!
Fernando
"... Coloques en la variable "ValorBusq" el número decimal, utilizando el mismo separador de decimales que usas en la hoja (si usas punto decimal en la hoja, en esta variable coloca 3.5) "
Pero, bueno, en definitiva tiens resuelto el problema que es lo único importante.
Recuerda que tienes que finalizar esta pregunta para que otros usuarios (o tu) puedan plantearme otras consultas.
Ten en cuenta que la valoración que figura predeterminada es 3/5. Tal vez quieras cambiarla... :)
Un abrazo!
Fernando
Fernando ya encontré la razón por la cual se presentaba el inconveniente de los decimales. Yo tenía en la configuración regional los decimales separados con, y los pase a . y funcionó.
No Fernando, te equivocas porque tuve en cuenta lo que me dijiste y efectivamente los valores en ValosBusq y el de la hoja son idénticos. El problema lo solucioné dejando en la configuración regional como símbolo decimal el "." y como separador de mile la "," (nada que ver con los datos de prueba!).
La siguiente macro hace una búsqueda de todos los valores que le indiques dentro de un rango determinado y, como no sé cómo prevés asignarle la calificación, el procedimiento simplemente pinta las celdas coincidentes de un color. Desde luego, puedes reemplazar este comando por el que haga lo que quieres.
Este es tal código:
Sub BuscaTodos()
'Ingresa aquí las variables propias de tu archivo:
HojaBusq = "Hoja1"
RangoBusq = "B4:F800"
ValorBusq = 0
With Sheets(HojaBusq).Range(RangoBusq)
Set SiEsta = .Find(ValorBusq, LookIn:=xlFormulas, Lookat:=xlWhole)
If Not SiEsta Is Nothing Then
Acierto1 = SiEsta.Address
Do
SiEsta.Interior.ColorIndex = 28
'reemplaza la linea anterior por el set de comandos
'que ejcuten lo que deseas hacer con lo encontrado
Set SiEsta = .FindNext(SiEsta)
Loop While Not SiEsta Is Nothing And SiEsta.Address <> Acierto1
End If
End With
End Sub
Al principio de la macro tienes unas variables que te permitirán parametrizar tu aplicación.
Ten presente si lo que buscas debe estar exactamente como lo indicas o puede estar incluido dentro de otros caracteres.
Por ejemplo, si buscas una celda con 0, ¿una qué tenga 1088 calificaría?
La macro, así como está, no consideraría esa celda. Marcará aquellas que tenga solo un cero en ella.
Este es tal código:
Sub BuscaTodos()
'Ingresa aquí las variables propias de tu archivo:
HojaBusq = "Hoja1"
RangoBusq = "B4:F800"
ValorBusq = 0
With Sheets(HojaBusq).Range(RangoBusq)
Set SiEsta = .Find(ValorBusq, LookIn:=xlFormulas, Lookat:=xlWhole)
If Not SiEsta Is Nothing Then
Acierto1 = SiEsta.Address
Do
SiEsta.Interior.ColorIndex = 28
'reemplaza la linea anterior por el set de comandos
'que ejcuten lo que deseas hacer con lo encontrado
Set SiEsta = .FindNext(SiEsta)
Loop While Not SiEsta Is Nothing And SiEsta.Address <> Acierto1
End If
End With
End Sub
Al principio de la macro tienes unas variables que te permitirán parametrizar tu aplicación.
Ten presente si lo que buscas debe estar exactamente como lo indicas o puede estar incluido dentro de otros caracteres.
Por ejemplo, si buscas una celda con 0, ¿una qué tenga 1088 calificaría?
La macro, así como está, no consideraría esa celda. Marcará aquellas que tenga solo un cero en ella.
Fernando,
tengo dos inquietudes, la primera es de que tipo son las variables SiEsta y Acierto1.
La segunda es precisamente una de las aclaraciones que me haces, como puedo hacer para que busque el valor completo. Es decir, si busco 0, que no considere 100, sino solo el valor 0.
Gracias!
tengo dos inquietudes, la primera es de que tipo son las variables SiEsta y Acierto1.
La segunda es precisamente una de las aclaraciones que me haces, como puedo hacer para que busque el valor completo. Es decir, si busco 0, que no considere 100, sino solo el valor 0.
Gracias!
Veamos, la variable SiEsta puede definirse como Range ya que guarda el rango donde se produce una coincidencia entre lo buscasdo y el contenido de tal celda.
La variable Acierto1 es String (texto) que contiene la dirección de la primera celda donde se encontró lo que busca. Se usa para el caso en que haya un solo caso positivo, porque la función buscar arrojarái siempre esa celda y la macro no terminaría nunca.
---
En cuanto a lo de buscar valor completo, transcribo lo que te acleré al final de la respuesta anterior:
"... La macro, así como está, no consideraría esa celda. Marcará aquellas que tenga solo un cero en ella."
Es decir que no tienes que modificar nada en ella para que lo haga como solicitas.
De todos modos, te comento que esto se maneja con el argumento:
Lookat:=xlWhole
Ojala haya sido suficientemente claro.
Un abrazo!
Fernando
La variable Acierto1 es String (texto) que contiene la dirección de la primera celda donde se encontró lo que busca. Se usa para el caso en que haya un solo caso positivo, porque la función buscar arrojarái siempre esa celda y la macro no terminaría nunca.
---
En cuanto a lo de buscar valor completo, transcribo lo que te acleré al final de la respuesta anterior:
"... La macro, así como está, no consideraría esa celda. Marcará aquellas que tenga solo un cero en ella."
Es decir que no tienes que modificar nada en ella para que lo haga como solicitas.
De todos modos, te comento que esto se maneja con el argumento:
Lookat:=xlWhole
Ojala haya sido suficientemente claro.
Un abrazo!
Fernando
Muchas gracias por tu ayuda, me ha sido muy útil. Pero tengo un inconveniente, cuando debe buscar un valor con decimales no lo encuentra. Por ejemplo 3.5.
Me puedes indicar lo que debo hacer para que lo haga, puesto que debe detectar los valores completos tal y como hablamos pero el dato puede estar con valores decimales.
PD: ¿Qué debo hacer para finalizar la consulta?
Me puedes indicar lo que debo hacer para que lo haga, puesto que debe detectar los valores completos tal y como hablamos pero el dato puede estar con valores decimales.
PD: ¿Qué debo hacer para finalizar la consulta?
La macro que te sugerí, está preparada (así como la vez) para encontrar y operar sobre números decimales.
En tanto coloques en la variable "ValorBusq" el número decimal, utilizando el mismo separador de decimales que usas en la hoja (si usas punto decimal en la hoja, en esta variable coloca 3.5)
Ahora bien, así como está buscara todas aquellas celdas que contengan *exactamente* 3.5; pero puede ocurrir que en tu hoja tengas un número que *parece* 3.5 pero en realidad la celda aloja internamente un valor como por ejemplo 3.5124 que, formateado para mostrar 1 sólo decimal, se vera como 3.5
(Para comprobar esta situación, bastará que incrementes la cantidad de decimales a mostrar para ver cuál es el número real incluido. Luego puedes volver a la cantidad de decimales originales que mostraba la celda).
Para la macro, tal celda no tiene 3.5 y, por lo tanto, no lo considera como encontrado.
Frente a esta situación, si realmente necesita que encuentre aquellos casos que se ven como 3.5 aunque la celda tenga otro número, puedes cambiar el argumento
LookIn:=xlFormulas
por
LookIn:=xlValues
La sentencia completa donde está este argumento quedaría:
Set SiEsta = .Find(ValorBusq, LookIn:=xlValues, Lookat:=xlWhole)
Así, 3.498 será considerado como 3.5 si tal celda estuviera con formato de 1 decimal.
Pero, como contrapartida, si en la celda hubiera un 3.5 y tuviera formato de dos decimales (que se vería como 3.50), ésta celda NO será considerada como igual a 3.5
Ten presente esta situación y asigna el formato a las celdas de acuerdo a lo que necesites buscar.
---
Respecto a finalizar la pregunta, no es para nada complicado.
Una ez que estés satisfecho con la respuesta, vé al pie de la misma y encontrarás una zona donde podrás elegir la puntuación a asignar a la respuesta (Ojo, la predeterminada es de 3 estrellas. Tal vez quieras cambiarla ;). También hay una caja de texto para que ingreses tu comentario respecto a la respuesta/experto.
Luego, presiona el botón de finalizar (seguramente debe estar cerca del que usaste para re-preguntar)
Ten en cuenta que una vez cerrada la pregunta no se puede continuar con ella, aunque -por supuesto- siempre podrás abrir una nueva pregunta, tal como lo hiciste con esta.
En tanto coloques en la variable "ValorBusq" el número decimal, utilizando el mismo separador de decimales que usas en la hoja (si usas punto decimal en la hoja, en esta variable coloca 3.5)
Ahora bien, así como está buscara todas aquellas celdas que contengan *exactamente* 3.5; pero puede ocurrir que en tu hoja tengas un número que *parece* 3.5 pero en realidad la celda aloja internamente un valor como por ejemplo 3.5124 que, formateado para mostrar 1 sólo decimal, se vera como 3.5
(Para comprobar esta situación, bastará que incrementes la cantidad de decimales a mostrar para ver cuál es el número real incluido. Luego puedes volver a la cantidad de decimales originales que mostraba la celda).
Para la macro, tal celda no tiene 3.5 y, por lo tanto, no lo considera como encontrado.
Frente a esta situación, si realmente necesita que encuentre aquellos casos que se ven como 3.5 aunque la celda tenga otro número, puedes cambiar el argumento
LookIn:=xlFormulas
por
LookIn:=xlValues
La sentencia completa donde está este argumento quedaría:
Set SiEsta = .Find(ValorBusq, LookIn:=xlValues, Lookat:=xlWhole)
Así, 3.498 será considerado como 3.5 si tal celda estuviera con formato de 1 decimal.
Pero, como contrapartida, si en la celda hubiera un 3.5 y tuviera formato de dos decimales (que se vería como 3.50), ésta celda NO será considerada como igual a 3.5
Ten presente esta situación y asigna el formato a las celdas de acuerdo a lo que necesites buscar.
---
Respecto a finalizar la pregunta, no es para nada complicado.
Una ez que estés satisfecho con la respuesta, vé al pie de la misma y encontrarás una zona donde podrás elegir la puntuación a asignar a la respuesta (Ojo, la predeterminada es de 3 estrellas. Tal vez quieras cambiarla ;). También hay una caja de texto para que ingreses tu comentario respecto a la respuesta/experto.
Luego, presiona el botón de finalizar (seguramente debe estar cerca del que usaste para re-preguntar)
Ten en cuenta que una vez cerrada la pregunta no se puede continuar con ella, aunque -por supuesto- siempre podrás abrir una nueva pregunta, tal como lo hiciste con esta.
- Compartir respuesta
- Anónimo
ahora mismo