miércoles, 11 de abril de 2012

VBA: Macro para un formato condicional en Excel.

Estamos muy acostumbrados a trabajar con las últimas versiones de Excel (2007 o 2010) donde podemos asignar formatos condicionales con más de tres condiciones sobre una celda; sin embargo, no hace mucho esta posibilidad no existía en el estándar, y debíamos cosntruirnos un código o macro que ejecutara y diera los formatos deseados.
Aún hoy siguen quedando usuarios rezagados de versiones un poco 'viejas', y que requieren dar un Formato condicional con más de esas tres condiciones límites. Para dar respuesta a un lector del blog daré un código sencillo pero efectivo que replica dicho formato:

...Por razones profesionales no puedo usar las versiones superiores a la 2000, y a veces me encuentro un poco limitado con las funciones nuevas de los programas más modernos.
La pregunta es: ¿Puedo reducir a UNA sola condición, a través de fórmula, el formato de celda, en función del texto contenido?
Te pongo el ejemplo:
En una sola celda puedo necesitar meter distinto texto: GUARDIA, LIBRA, PERMISO, CONSULTA. Según el contenido le doy formato diferente a la celda. Pero al tener 4 tipos de texto, y el formato condicional disponer de solo 3 condiciones, ... ya no puedo hacerlo de esta forma.
¿Sería posible con una fórmula aplicar un formato diferente según el texto?...

La idea es clara, buscaremos un código que asigne un color de fondo a la celda donde se encuentre algunos de los cuatro textos indicados (GUARDIA, LIBRA, PERMISO y CONSULTA)
Veamos entonces nuestro código completo, que incluiremos en un módulo del Editor de VBA:

Sub formato()
Dim celda As Object
Dim rng As Range
'con INPUTBOX seleccionamos un rango de celdas
Set rng = Application.InputBox("en que rango quieres aplicar el formato??", Type:=8)

'recorremos cada celda del rango seleccionado
For Each celda In rng
valor = celda.Value
    'asignamos colores según el valor de la celda
    If valor = "LIBRA" Then
    celda.Interior.Color = 65535
    ElseIf valor = "PERMISO" Then
    celda.Interior.Color = 15773696
    ElseIf valor = "GUARDIA" Then
    celda.Interior.Color = 255
    ElseIf valor = "CONSULTA" Then
    celda.Interior.Color = 5296274
    End If
Next celda
End Sub



El funcionamiento de la macro 'formato' es sencillo, indicar sobre que rango de celdas queremos aplicar los formatos de colores, y a continuación si detecta el valor indicado cambiará el color de fondo de la celda.
Podemos ver en la imagen el resultado final para el rango A1:A4, donde hemos desplegado los cuatro textos; y como al presionar un Botón al que previamente hemos asignado nuestra macro 'formato', preguntará el rango de celdas y luego asignará los colores:

VBA: Macro para un formato condicional  en Excel.


En la siguiente imagen vemos el resultado final

VBA: Macro para un formato condicional  en Excel.

186 comentarios:

  1. Buen ejemplo, gracias por compartirlo. ¿Y para modificar el color de la fuente?
    Saludos desde México.

    ResponderEliminar
    Respuestas
    1. Hola!
      para aplicar el cambio al color de la fuente, el código sería:
      celda.Font.Color = 65535
      en lugar de
      celda.Interior.Color = 65535

      para cada valor.
      UN saludo!!

      Eliminar
  2. Otra vez yo: tengo esta macro para eliminar lo que esta en una lista desplegable cuando selecciono algo de la lista anterior, anda estupenda:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("Horarioentrada").Address Then
    Target.Offset(0, 1).ClearContents
    End If
    End Sub

    Ahora quiero hacer lo mismo con otra celda en la misma planilla que he llamado "Gerentes" y me da error no me deja agregar otra macro, porque puede ser?

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("Gerentes").Address Then
    Target.Offset(0, 1).ClearContents
    End If
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Nora,
      el código de esta última lo tienes incluido en la hoja correspondient 'Gerentes' en el explorador de proyectos??
      date cuenta que es un evento de hoja!!
      Slds

      Eliminar
  3. Hola.
    puedo consultar por una variante del color:

    Necesito que se pinte las celdas la columna C( desde la fila 1 hasta la 10) si la columna b es mayor al valor numerico 7 y ( en c hay una forumla que divide el valor de A dividido el valor de B y a ese resultado que se obtiene en C que se pinte segun el caso:
    Seria formato condicional con mas de 3 posibilades, tengo excel 2003

    a b c
    1 (datos numericos)


    ** Si b es > = 7 y

    el resultado de la division (a/b) en C es = 0 entonces que se pinte c1 de rojo y el resultado seria siempre 0( ya que A es 0 y en B hay valores mayores a 0).

    o
    el resultado de C es entre 0.01 y 0.99, que se pinte de naranja o canela.

    o
    el resultado de C mayor igual 1 que se pinte el fondo de amarillo.

    **O sino

    que si B es menor a 7

    si el resultado de C no existe porque B es 0 ( y en A es mayor a 0), que sea ponga guion ( - ) y se pinte de violeta.

    o
    si el resultado de C esta entre 0.01 y 0.99 que se ponga azul.

    o si el resultado de C es >=1 que se pinte de celeste.

    Es decir que se ejecute por cada fila desde la 1 hasta la fila 10.

    Se entendio?No soy muy bueno exprando mis dudas.

    Muchas gracias por su tiempo y ayuda.
    Javier

    ResponderEliminar
    Respuestas
    1. Hola Javier,
      cambiando los colores, y como son relativamente pocas condiciones, se podría hacer assí:
      Sub formato()
      For Each celda In Range("C1:C10")
      If celda.Offset(0, -1).Value > 7 And celda.Value = 0 Then
      celda.Interior.Color = vbRed
      ElseIf celda.Offset(0, -1).Value > 7 And celda.Value > 0.01 And celda.Value <= 0.99 Then
      celda.Interior.Color = vbMagenta
      ElseIf celda.Offset(0, -1).Value > 7 And celda.Value > 0.99 Then
      celda.Interior.Color = vbMagenta

      ElseIf celda.Offset(0, -1).Value <= 7 And celda.Value = 0 Then
      celda.Interior.Color = vbCyan
      ElseIf celda.Offset(0, -1).Value <= 7 And celda.Value > 0.01 And celda.Value <= 0.99 Then
      celda.Interior.Color = vbBlue
      ElseIf celda.Offset(0, -1).Value <= 7 And celda.Value > 0.99 Then
      celda.Interior.Color = vbGreen
      End If
      Next celda
      End Sub

      Espero te sirva.
      Slds

      Eliminar
    2. Hola muchas gracias por la rta. No me sirvio, me exprese mal. Intento aclarar mi consulta.

      Si el valor de la columna B es > = 7 ( que suceda en columna C, 3 situaciones de pintar el fondo segun el resultado de C ).
      y si es < 7 el valor en la columna B ( que suceda en la columna C con las mismas condiciones pero con otros colores porque en B el valor es > 7).

      Entonces el resultado de la division de A/B que se ubica en la columna C, a ese valor en C , que se pinte fondo de color segun esas dos situaciones de B y luego esas situaciones en C que detallo:


      Si B = 0 ( entonces la division es imposible a/b) y por lo tanto C no existe, que muestre un guion como resultado (-) fondo violeta en C.

      Si A = 0 y B = 0 entonces que muestre un guion (-) fondo blanco en C.


      Si B es >= 7 entonces
      Si C es =0, Rojo
      Si C es 0.01 y 0.99, naranja
      Si C es >= 1, amarillo



      Si B es < 7 entonces
      Si C es = 0 Violeta
      Si C es 0.01 y 0.99, azul
      Si C es >=1, celeste


      Bueno muchisimas gracias Isma por la rta y el tiempo.
      Saludos
      Javier

      Eliminar
    3. Hola Javier,
      en la fórmula de la columna C, tendrás que indicar las causas de error, por ejemplo, en C1:
      =SI.ERROR(A1/B1;"-")
      Luego ya puedes aplicar la macro anterior, sólo cambia los colores, donde pone
      celda.interior.color = ...

      Slds

      Eliminar
  4. Buensimo.
    Muchas gracias Ismael. Voy a probarlo. Saludos

    ResponderEliminar
  5. Hola Ismael
    He de crear una tabla con cinco columnas y la 5ª ha de dar el valor automáticamente dependiendo de los valores de las otras 4 columnas (todas basadas en NO/SI)

    Q&RI? IVD? critical prod/service? high control? classificat.
    no 4
    sí sí 1
    sí no sí no 2
    sí no sí sí 3
    sí no no no 3
    sí no no sí 4

    Y no sé cómo empezar

    ¿Me puedes echar una mano?

    Muchas gracias

    ResponderEliminar
  6. En la primera, dado que el valor es no, el resultado siempre es 4
    en la segunda, dado que las dos primeras columnas son sí, el resultado es siempre 1

    ResponderEliminar
    Respuestas
    1. Hola Josefa,
      lo primero que deberás tener claro es qué regla es la que aplica... sin tener esto claro no podremos construir fórmula alguna.
      En todo caso tendrás que emplear una función SI en la quinta columna, donde se calculará el valor 1,2,3 ó 4.
      Sería algo así:
      =SI(Y(A2="no";B2="";C2="";D2="");4;SI(Y(A2="sí";B2="sí";C2="";D2="");1; etc, etc...

      el problema de hacerlo así, es que deberemos construir un criterio para cada caso, y las combinaciones de dos elementos tomados de cuatro en cuatro son bastantes... por eso lo primero sería tener claro por que es 1, 2, 3, o 4.

      Espero haberte orientado.
      Sdls

      Eliminar
  7. Hola Ismael, tengo unas columnas que quiero cuando la columna undels la columna ruta cambie a color blanco, se puede hacer eso en VBA?


    RUTA UNDELS
    ACM1 3
    ACX8 4
    AC79 15
    AC1A 27
    AC3C 33
    AC2D 39
    AC1X 48
    AC1B 51
    AC2B 62
    AC2A 64
    AC2E 69
    AC2C 72
    AC3A 94
    AC3B 186
    (BLANK)
    (BLANK)
    (BLANK)
    (BLANK)
    (BLANK)
    (BLANK)
    (BLANK)
    AC5X
    (BLANK)
    ACS2A
    AC5A
    (BLANK)
    AC3D
    ACS1A
    (BLANK)
    (BLANK)
    (BLANK)
    AC3X
    AC5C
    (BLANK)
    (BLANK)

    ResponderEliminar
    Respuestas
    1. Hola Carmen,
      parece se ha cortado tu pregunta.
      Supongo quieres que cuando el dato de la columna UNDELS esté vacío la celda correspondiente de la columna ruta cambie a color blanco.
      Si es así no haría falta aplicar macros, bastaría aplicar un sencillo Formato condicional con fórmula.
      Tendrías que seleccionar los datos del campo RUTA (por ejemplo en A2:A50, con la celda A2 activa) e introducir la fórmula:
      =$B2=""
      y asignarle el formato de color que quieras...
      Espero te sirva
      Slds

      Eliminar
  8. Felicidades por este buen Foro.
    Tengo una duda:
    If VALOR = "COLOR" Then
    celda.Interior.Color = 255
    'Si de esta forma la celda que tiene la palabra exacta "Color" es la que cambiara de color. Para cambiar de color la celda solo que la palabra Color esta dentro de una frase y/o conjunto de otras palabras.
    Gracias :)

    ResponderEliminar
    Respuestas
    1. Muchas gracias Alexander,
      Para verificar que contiene el texto 'COLOR' deberemos emplear comodines (*,?...) y el operador Like en lugar del =
      Quedaría entonces así:
      ...
      If VALOR Like "*COLOR*" Then celda.Interior.Color = 255
      ...

      Espero te sirva.
      Slds cordiales

      Eliminar
    2. Funciona perfectamente :) Gracias

      Eliminar
    3. ;-)
      Escribiré un post explicando algo más sobre el tema.
      Slds cordiales

      Eliminar
  9. Usar Formato Condicional para que se "pinte" la celda donde ocurre el cruce entre el Curso y Docente seleccionado de una tabla matriz

    ResponderEliminar
    Respuestas
    1. Hola, que tal estás?
      Espero te encuentres bien.
      Tendrías que usar el formato condicional tipo fórmula, y en la fórmula emplear la función lógica Y.
      Saludos cordiales

      Eliminar
  10. HOLA :
    Felicitaciones por el foro, solicito su ayuda, tengo un cuadro en el cual en la celda G21 que es resultado de una busqueda (vloockup) quiero que cada vez que su resultado sea NO me arroje una alerta que me diga NO ES GGAP, esto se repetira para toda la clumna cada vez que ingrese un dato y se genere la busqueda para esta celda G21.
    De antemano gracias por la colaboracion

    ResponderEliminar
    Respuestas
    1. Hola,
      si entiendo correctamente podrías en G21 incluir ua fórmula condicionada:
      =SI(VLOOKUP(...)="NO";"No es GCAP";VLOOKUP(..))

      Saludos

      Eliminar
  11. hola que tal muy buenas tardes, perdon que moleste con mi consulta pero tengo una problematica, se que para realizar una condicionante respecto a una celda con un valor especifico basta con crear un if y poner la condicion que nosotros queramos por ejemplo:

    If range("A1").value = hola then

    Entonces podriamos condicionar lo que se requiriera pero mi problematica es la siguiente:

    A1 tiene el nombre de la siguiente manera: MM- APC- LCU- SX

    Yo necesito condicionar el valor de A1 a que si en su nombre esta escrita la palabra "APC" entonces proceda con una macro, y si no contiene la palabra "APC" entonces no haga nada:
    ejemplor: MM-LCU-LCU-SX

    en este caso la condicion no aplica y no haria nada.

    MM- APC- LCU- SX

    en este caso la condicion aplicaria y por ejemplo, borraria la hoja activa.

    Espero me puedan asesorar, gracias de ante mano. Saludos

    ResponderEliminar
    Respuestas
    1. Hola Agustín,
      prueba con la función InStr, algo así:
      Sub prueba()

      If InStr(1, Range("B2"), "APC") >= 1 Then MsgBox "adelante"

      End Sub

      Un saludo

      Eliminar
    2. Muchísimas gracias, era precisamente lo que buscaba, de ante mano muchas gracias, te debo las chelas Ismael.

      Eliminar
  12. Hola Ismael. Se me hace excelente este foro y todo tu apoyo a todo mundo. de antemano muchas gracias. creo que ahora yo tengo una muy dificil que no veo que alguien preguntara antes, bueno divicil para mi, para ti seguramente será muy fácil.

    Realize una Macro para un Formulario de introducción de datos Codigo-Nombre-Dirección-Telefono-Email y 5 hojas con los mismos campos.
    el código se refiere a nombre de la calle de la dirección(BO-VE-FE-FR-BE) ese yo lo introduzco en el campo CODIGO, tengo 5 hojas con diferente nombre de calle (BONELLI-VENERE-FERRATO-FERRARI-BENEDETTI) y una con el nombre FORMULARIO donde se ingresan los datos, Necesito que al introducir los datos en este formulario se transfieran a la hoja correspondiente de acuerdo al código. Alguna forma de hacer esto?

    ResponderEliminar
  13. Por cierto la estoy Armando en Excel 2011 para MAC

    ResponderEliminar
    Respuestas
    1. Hola Fernando,
      lo primero muchas gracias por tus palabras ;-)

      Respecto a tu cuestión, se trataría de construir una variable que identifique la hoja destino según la dirección seleccionada en tu ComboBox (supongo) o tu TextBox: BO-VE-FE-FR-BE
      incluso quizá (ya que son sólo 5) con un select case...
      así bastarái indicar la dirección, con el código, para que el select case te dirigiera el pegado de datos a una u otra hoja...

      Espero haberte dado la pista.
      Un cordial saludo

      Eliminar
    2. UPPPPS. Muchas gracias Ismael, la verdad es que soy primerizo en esto de las macros y la verdad no te entendí, pero con la pista que me das me pondré a picarle y buscar, ojala exista un modo mas sencillo de explicarlo.

      Mil gracias. Saludos.

      Eliminar
    3. Ismael. Te agradecere me pudieras dar un ejemplo para poder entenderlo mejor.
      Saludos.

      Eliminar
    4. Hola Fernando,
      subiré un post al blog con la explicación a tu problema...

      Un saludo

      Eliminar
    5. SERA QUE TE MANDE MI ARCHIVO PARA QUE VEAS LO QUE HIZE?

      Eliminar
    6. Hola,
      claro, puedes enviarme lo que tengas a
      excelforo@gmail.com

      En todo caso, subiré el desarrollo al blog.

      Saludos cordiales

      Eliminar
    7. Hola Ismael. Subiste el desarrollo en el blog?

      Agradezco tu buena onda con nosotros los mortales en el excel.

      Saludos?

      Eliminar
    8. Aún no..en unas semanas.
      Saludos

      Eliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Buen foro amigo Ismael pero una consulta, estoy creando una hoja de calculo con condiciones por decir una clasificación, por decir es un Peruano si cumple con las condiciones tales como : vive en peru, tiene menos de 60 años y mayor a 18.
    es algo parecido con la formula del excel "SI" pero yo quiero en macros :) no se si me dejo entender. de ante mano Gracias .

    ResponderEliminar
    Respuestas
    1. Hola Gary,
      si necesitas aplicar varias condiciones, lo hagas sin macros o con macros, el funcionamiento es similar.
      Aquí te dejo algunos link te puedes ayudar y dar respuesta:
      http://excelforo.blogspot.com.es/2009/11/vba-en-excel-if-thenelse.html
      http://excelforo.blogspot.com.es/2010/04/if-then-multiple-condicional.html
      y otro más
      http://excelforo.blogspot.com.es/2009/11/solucion-un-problema-con-vba-selectcase.html

      Seguro alguno de los ejemplos te sirve.
      Saludos

      Eliminar
    2. si me sirve para crear una formula y si yo quiero que funcione con un botón??? como seria????

      Eliminar
    3. Hola Gary,
      básicamente un procedimiento Function y uno Sub se distingue en muy pocas cosas. En esencia una Function lleva las variables como argumentos de la función, y un procedimiento Sub hay que indicárselas en el código.

      Saludos cordiales

      Eliminar
  16. amigo ismael tengo esta macro
    Public Function Clasificacion1(Proceso, Monto)
    'Macro creado por Gary Bernabe Saavedra
    Select Case Proceso
    Case Is = "Bien"
    Select Case Monto
    Case 0 To 11400: Clasificacion1 = "CONTRATACION DIRECTA"
    Case 11400 To 40000: Clasificacion1 = "ADJUDICACION DE MENOR CUANTIA"
    Case 40000 To 200000: Clasificacion1 = "ADJUDICACION DIRECTA SELECTIVA"
    Case 200001 To 399999: Clasificacion1 = "ADJUDICACION DIRECTA PUBLICA"
    Case Is >= 400000: Clasificacion1 = "LICITACION PUBLICA"
    End Select
    Case Is = "Servicio"
    Select Case Monto
    Case 0 To 11400: Clasificacion1 = "CONTRATACION DIRECTA"
    Case 11400 To 40000: Clasificacion1 = "ADJUDICACION DE MENOR CUANTIA"
    Case 40000 To 200000: Clasificacion1 = "ADJUDICACION DIRECTA SELECTIVA"
    Case 200001 To 399999: Clasificacion1 = "ADJUDICACION DIRECTA PUBLICA"
    Case Is >= 400000: Clasificacion1 = "CONCURSO PUBLICO"
    End Select
    Case Is = "Obra"
    Select Case Monto
    Case 0 To 11400: Clasificacion1 = "CONTRATACION DIRECTA"
    Case 11400 To 180000: Clasificacion1 = "ADJUDICACION DE MENOR CUANTIA"
    Case 180000 To 900000: Clasificacion1 = "ADJUDICACION DIRECTA SELECTIVA"
    Case 900001 To 1800000: Clasificacion1 = "ADJUDICACION DIRECTA PUBLICA"
    Case Is >= 1800000: Clasificacion1 = "LICITACION PUBLICA"
    End Select
    End Select
    End Function
    pero quiero por decir si es un bien de 40000 es un Adjudicacion Directa Selectiva, pero me sale Adjudicacion de menor cuantia como haria???? como seria ???
    De ante mano Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Gary,
      cuando empleamos SELECT CASE para un intervalo de valores, debes completar en intervalos cerrados, quiero decir, y par el ejemplo que pones( solo la primera parte):
      Public Function Clasificacion1(Proceso, Monto)
      'Macro creado por Gary Bernabe Saavedra
      Select Case Proceso
      Case Is = "Bien"
      Select Case Monto
      Case 0 To 11399: Clasificacion1 = "CONTRATACION DIRECTA"
      Case 11400 To 39999: Clasificacion1 = "ADJUDICACION DE MENOR CUANTIA"
      Case 40000 To 200000: Clasificacion1 = "ADJUDICACION DIRECTA SELECTIVA"
      Case 200001 To 399999: Clasificacion1 = "ADJUDICACION DIRECTA PUBLICA"
      Case Is >= 400000: Clasificacion1 = "LICITACION PUBLICA"
      End Select
      ....

      Es decir, no se pueden solapar los puntos de los intervalos en los diferentes casos!!

      Saludos

      Eliminar
  17. Hola Ismael como puedo hacer una macro para comparar entre dos columnas con numeros, es decir, si columna "A" es mayor que columna "B" entonces que se pinte de un color y si columna "A" es menor que columna "B" entonces que se pinte de otro color. Esto dentro de todas las celdas que contenga la columna "A"

    ResponderEliminar
    Respuestas
    1. Hola Omar,
      no hace falta una macro para tal cosa..
      Lee esta entrada del blog
      http://excelforo.blogspot.com.es/2014/03/iconos-de-formato-condicional-para.html

      Te dará los pasos a seguir, con una mínima modificación del formato a aplicar..

      Un cordial saludo

      Eliminar
    2. Muchas gracias Ismael realmente me ayudo, este Blog es excelente te felicito.

      Eliminar
  18. Hola Ismael
    Tengo un caso especial que no se si de mucho problema o no?
    Necesito cambiar el formato de los valores mostrados por algunas gráficas, dependiendo de lo que se trate, todo esto me lo condiciona una (Data List), para ser mas especifico necesito que el gráfico muestre los valores con formato de numero si en la lista tengo el texto "AHT", pero sino lo es que no haga nada. Ya que el resto de las variables necesito que se muestren como porcentaje. este ultimo es el formato que se muestra en todas las gráficas.

    pero los valores de AHT deben mostrarse en la gráfica con formato de numero.

    Espero me puedas ayudar con una Macros para unirla a otra que tengo la cual me ajusta los axis de las gráficas. Para hacer todo en un solo botón.

    de antemano muchas gracias y Saludos,

    ResponderEliminar
    Respuestas
    1. Hola Jonathan,
      entiendo te refieres a las etiquetas de datos, que cuando su punto en el eje contenga 'AHT'...
      Para ello tendrás que recorrer todos los puntos de la serie, evaluando con un IF... THEN si el texto contiene AHT.. para esto podrías usar la función InStr
      en caso afirmativo, simplemente formateas esa etiqueta de datos de ese punto como número.

      Un ejemplo de cómo recorrer los puntos y modificar la etiqueta de datos en:
      http://excelforo.blogspot.com.es/2012/02/vba-modificar-etiquetas-de-datos-en-un.html

      Espero te oriente
      Un saludo

      Eliminar
  19. Hola! Queria saber si me podrías ayudar: no se programar con lenguaje de VBA, por lo que no se como hacer una macro..
    Lo que tengo qe hacer es relacionar todas las hojas de excel, Segun la base de datos (que contiene el código, modelo, precio, etc..) Entonces, por ejemplo, si escribo el código X.. Se autorrellenan las otras celdas con sus características (modelo, precio, color..) .. A su vez, al agregar un código a la hoja "ventas" que este mismo disminuya o se borre del inventario (en el caso que sea compra, que aumente el inventario) Es decir, Que cada acción modifique la hoja que afecte, aunqe sean varias.. No se si me explique bien. Y si me podrías ayudar... Por favor!
    Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Trinidad,
      en principio no haría falta programar nada con VBA.. bastaría aplicar una serie de funciones estándar, del tipo BUSCARV para relacionar información entre hojas, y por ejemplo SUMAR.SI para actualizar datos de unidades para el inventario...
      Un saludo y espero haberte orientado.

      Eliminar
    2. Muchas Gracias!
      Me ayudo mucho utilizar la funcion BUSCARV, sin embargo no entiendo mucho como usar la funcion SUMAR.SI para actualizar el inventario. No se qué rellenar en rango y criterio, por ejemplo.
      Muchas gracias por tu ayuda

      Saludos!

      Eliminar
    3. Hola Trinidad,
      se da por entendido que un inventario es la suma de entradas y salidas de un producto, por tanto, con el SUMAR.SI acumularas todas las entradas y le restaras el acumulado de todas las salidas de cada producto...

      En el rango estaría la columna de los productos donde hayas registrado todas las compras/entradas, el criterio sería cada producto individual...
      de manera similar con las ventas/salidas...

      Espero lo veas ahora algo más claro.

      Saludos

      Eliminar
  20. Hola Ismael
    tengo una pregunta, quiero saber si se puede condicionar diferentes celdas dependientes de otra
    p.j.

    si A1 =10 ent. B1=10,C1=10

    de manera automática y que permanezcan fijas las celdas B1 y C1
    y ¿Dónde colocaría la macros, en caso de serlo? ¿es en un modulo ?

    ResponderEliminar
    Respuestas
    1. Hola,
      no entiendo a qué te refieres con que 'permanezcan fijas', pero para que B1 y C1 muestre un 10 cuando en A1 introduzcas el valor 10, podrías incluir en B1 y C1 la misma fórmula:
      =SI(A1=10;10;"")

      Con eso sería suficiente... en principio.
      Espero te sirva.
      Saludos

      Eliminar
    2. hola de nuevo,
      lo que me refería con 'permanezcan fijas' es que si A1=10 ent B1=10 y no se podrá cambiar, pero si no lo es B1= "cualquier valor".
      Tu propuesta es valida pero B1 solo puede tomar 2 valores (" " y 10) y lo que se espera es que en B1 tome cualquier valor.

      saludos

      Eliminar
    3. Entiendo entonces que sólo cuando A1 = 10, B1 y C1 deben ser igual a 10, en el resto de casos, por ejemplo, A1=9 entonces B1 y C1 pueden ser cualquier valor (8 y 3, por ejemplo...), de manera totalmente independiente a A1.

      Entonces incluiremos una macro en la ventana de código de la hoja en cuestión, con el siguiente evento _Change:
      Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Intersect(Target, Range("A1")) Is Nothing Then
      If Target.Value = "10" Then
      Range("B1,C1").Value = 10
      End If
      End If
      End Sub

      Saludos

      Eliminar
    4. No agradeci tu pronta atención, muchas gracias me sirvió mucho tu respuesta.
      Éxito en tu Blog, me encanta

      Eliminar
    5. ;-)
      muchas gracias!
      me alegro te funcionara

      Slds cordiales

      Eliminar
  21. Hola Ismael

    tengo un cuadro donde se teine que pintar segun la caregoria y el impacto
    el calculo es lo siguiente:

    si categoria es 1 y impacto es 1 el resultado seria 1 y el color verde,
    si categoria es 2 y impacto es 1 el resultado seria 2 y el color verde,
    si categoria es 3 y impacto es 1 el resultado seria 3 y el color rojo

    como podria hacer un macro sobre esos calculos

    saludos...

    ResponderEliminar
    Respuestas
    1. Hola!
      no hace falta aplicar macros para tal cosa.
      Bastará que configures tres reglas de formato condicional tipo fórmula.
      Entendiendo la categoría se encuentra en, por ejemplo, la celda A1 y el impacto en B1, entonces el resultado en C1 tendríamos:

      =SI(B1=1;SI(A1=1;1;SI(A1=2;2;SI(A1=3;3;""))))

      y la regla de formato condicional:
      =Y(A1=1;B1=1)
      con formato de color verde

      =Y(A1=2;B1=1)
      con formato de color verde

      =Y(A1=3;B1=1)
      con formato de color rojo....

      Espero te ayude
      Slds

      Eliminar
  22. hola muy buen dia exelente foro, yo tengo una duda algo parecida pero sin colores, el problema es el siguuiente yo tengo 4 valores a, b, c y d quiero que al momento de ´ponerle "a" en una celda en la siguiente se me despliegue una lista como a1, a2, a3,...an alguna idea de como puedo hacerle?

    ResponderEliminar
    Respuestas
    1. Hola,
      se trataría de una herramienta diferente, hablaríamos de una Validación de datos anidada.
      Puedes ver un ejemplo de la técnica en:
      http://excelforo.blogspot.com.es/2009/10/ejemplo-de-doble-validacion.html

      Saludos cordiales

      Eliminar
    2. Ismael, ante todo muchas gracias por tu disposición para responder a todas nuestras inquietudes.
      En mi caso intento colorear las celdas de la columna A (que tienen contenido) con los colores Verde o, Amarillo o Rojo segun correspondan a estas condiciones:
      Colorear de Verde las celdas de la columna A si el contenido de las celdas de la columna A es "En Plazo" y el contenido de las celdas de la columna B es vacio.
      Colorear de Verde las celdas de la columna A si el contenido de las celdas de la columna A es "Vencida" y el contenido de las celdas de la columna C con formato fecha (dd/mm/aaaa) el mes (mm) es igual al actual.
      Colorear de Amarillo las celdas de la columna A si el contenido de las celdas de la columna A es "Vencida" y el contenido de las celdas de la columna B es "Replanificar".
      Colorear de Rojo las celdas de la columna A si el contenido de las celdas de la columna A es "Vencida" y el contenido de las celdas de la columna B es vacio".
      Intente aplicar formula con formato condicional pero no logro el resultado.
      Espero no complicarte demasiado y desde ya muchas gracias.

      Eliminar
    3. Hola Miguel Angel,
      tendrás que aplicar diferentes reglas de formato condicional.
      En primer lugar seleccionamos el rango de celdas a formatear (a dar color), en tu caso la columna A (asegúrate que la celda activa es A1).
      Aplicamos formato condicional de tipo fórmula.
      primera regla:
      fórmula: =Y($A1="En plazo";$B1="")
      luego damos formato de color verde

      segunda regla:
      fórmula: = Y($A1="Vencida";MES($C1)=MES(HOY()))
      color verde

      tercera regla:
      fórmula: = Y($A1="Vencida";$B1="Replanificar")
      color amarillo

      cuarta regla:
      fórmula: =Y($A1="Vencida";$B1="")
      color rojo

      Saludos

      Eliminar
    4. Hola Ismael, perdon por la pregunta, pero como seria en codigo de macro las sentencias de formato condicional que detallas con el ejemplo?
      Espero tus comentarios.
      Nuevamente muchas gracias.
      Saludos

      Eliminar
    5. Hola Miguel Angel,
      tendrías que evaluar las celdas con un IF THEN
      IF celda.value="Vencida" AND celda.offset(0,1).value="Replanificar" THEN...

      Saludos

      Eliminar
  23. Hola Ismael te agradezco toda la colaboracion que nos prestas, he aprendido mucho con tus explicaciones, tengo una consulta resulta que tengo un rango de celdas que va desde B12 hasta B61. donde normalmente ingreso codigos de referencias con la siguiente estructura... 1010120, 2014515, también tengo una macro que me pasa estos datos y otros a una hoja como base de datos... lo que quiero es que antes de ejecutar la macro se recorra el rango B12 al B61 y que todos los codigos de referencia tengan los 3 digitos medios iguales es decir si se ingresan en B12 el 1010120, en B13 EL 1010125 y asi todos deben infdicar 101 en el medio, si no es asi pues detenga la macro de introduccion y de un mensaje de error. y si son iguales seguir la macro.... tener en cuenta que no siembre se rellena todo el rango y que el 101 puede ser otro codigo lo importante es que se tome como referencia la celda B12 si en sus digitos medios es decir 1010120 ... en este caso es 101 se recorra el resto de celdas y tienen que ser iguales de lo contrario dar error... Mil gracias, espero me hayas entendido

    ResponderEliminar
    Respuestas
    1. Hola,
      creo, si he entendido bien, podría ser algo de este estilo:

      Sub check()
      Dim med As String
      med = Mid(Range("B12").Value, 3, 3)

      For Each celda In Range("B12:B61")
      If Mid(celda.Value, 3, 3) <> med Then
      MsgBox "el valor " & celda & " no cumple la condición"
      Exit Sub
      End If
      Next celda
      End Sub

      Un saludo

      Eliminar
  24. Hola Ismael, te consulto para ver si me podés ayudar con el siguiente problema:
    Tengo una matriz que contiene fórmulas que dan como resultado 0, 1 o 2. Quisiera que cada fila se pinte de un color entre los número 1 y 2. Por ejemplo si el 1 está en A5 y el 2 está en F5 entonces que todas las celdas A5, B5, C5, D5, E5 y F5 se pinten. El inconveniente es que tengo office 2003 y no lo puedo hacer con formatos condicionales ni funciones de obtención de color de fondo. ¿Podrías ayudarme con una macro?

    Muchas gracias por la colaboración.
    Saludos
    Fedra

    ResponderEliminar
    Respuestas
    1. Hola Fedra,
      envíame el modelo de la matriz a
      excelforo@gmail.com
      y le echo un vistazo, pero en principio sí se podría hacer con fórmulas y formato condicional.
      Saludos

      Eliminar
  25. Ismael felicidades y gracias por compartir tus conocimientos, tal vez me puedes ayudar.
    tengo este código que aplica un formato a toda la columna C cuando exista la palabra "Total", necesito que las columnas D y E se aplique el mismo formato dependiendo de la columna C

    Columns("C:C").Select
    Selection.FormatConditions.Add Type:=xlTextString, String:="Total", _
    TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
    .Color = -16383844
    .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 13551615
    .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Range("C18").Select

    ResponderEliminar
    Respuestas
    1. Hola Cristobal,
      no me queda claro.. quieres aplicar el color a toda la columna C, D y E cuando exista en alguna parte/celda de la columna C la palabra 'Total'?
      o sólo quieres dar formato/color a la celda que contenga 'Total'??

      Si es lo segundo: dar formato sólo a la celda de la columna C donde aparezca 'Total' y su correspondiente de D y E, puedes hacerlo sin macros, basta seleccionar las columnas C:E y aplicar formato con fórmula:
      =$C1="Total"
      y el formato que quieras.

      Saludos

      Eliminar
    2. Ismael
      gracias por tu atencion, pero ya lo soluciones el tema era por ejemplo en la posicion C4 estaba la palabra total C4,D4 y E4 debian tomar el mismo formato y esto se debia hacer tantas veces existiera la palabra total en la columna C, desde C1 hasta C1048576, esto lo logra con un dos For uno que recorra hacia abajo y otro hacia el lado.
      Muchas gracias

      Eliminar
    3. Hubiera sido más sencillo sin macros, como te indicaba, con formato condicional); pero si ya lo has conseguido, pues perfecto!!
      Un saludo

      Eliminar
  26. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  27. Buenos días Ismael, tengo el siguiente caso con el que te pido el favor de que me colabores.

    Tengo una lista desplegable (en la columna P) con los siguientes estados:

    CANCELADO
    PARA PUBLICAR
    PUBLICADO
    NO CAMBIA
    PARA DEROGAR
    DEROGADO
    EN MODIFICACIÓN

    y quisiera que cada vez que se seleccionaran algunos de los estados PUBLICADO, DEROGADO y NO CAMBIA, automáticamente me devuelva la fecha (en la columna H) del día en que se puso ese estado.

    Intente realizarlo con la formula hoy() pero no me sirvió porque se actualizada automáticamente cada vez que se abría el libro.

    Solicito muy amablemente tu colaboración, mil gracias. Saludos

    ResponderEliminar
    Respuestas
    1. Hola Paola,
      para fijar una dato (en tu caso la fecha) tendrías que emplear algo de programación.
      Por ejemplo un evento Change en la ventana de código de la hoja.. para que al modificar una de esas celdas en la columna P, detecte el cambio e inserte la fecha del sistema (del día en cuestión) en la celda correspondiente de la columna H.

      Podría ser así:
      Private Sub Worksheet_Change(ByVal Target As Range)

      If Not Intersect(Target, Range("C:C")) Is Nothing Then
      If Target.Value = "PUBLICADO" Or Target.Value = "DEROGADO" Or Target.Value = "NO CAMBIA" Then
      Cells(Target.Row, "B").Value = Date
      End If
      End If
      End Sub

      Espero te sirva
      Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  28. Me sirvió mucho el código que me enviaste... Ahora quisiera saber como puedo unir dos códigos; Uno es el que me acabas de enviar y otro es el siguiente:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("C:C")) Is Nothing Then
    Range("E" & Target.Row) = Date
    End If
    End Sub

    Como puedo unir estos dos códigos?

    ResponderEliminar
    Respuestas
    1. Este código no tiene nada que ver en el anterior... pero debe quedar formulado en la misma hoja en la que estoy trabajando.

      Agradezco tu colaboración.

      Eliminar
    2. Hola Paola,
      básicamente quieres que al cambiar algo en la columna C:C ponga fija la fecha en su celda correspondiente de la columna E:E...
      En esencia no serían necesarios ambos códigos, ya que si juntas los dos códigos siempre aplicaría este segundo y siempre pondría la fecha.
      Por tanto yo dejaría únicamente el último.

      De todas formas para unirlos por en un solo evento un if then debajo del otro...

      Saludos

      Eliminar
  29. Hola Ismael, primero felicitarte por tu maravilloso Blog, me ha sido de gran ayuda, tengo un problemita ya que debo pasar unos registros que tengo en la hoja "DATOS" si cumplen con la condición del nombre, pero sólo me funciona con la primera coincidencia, con la siguiente no funciona, son bastantes registros pero por ahora pruebo con dos,dejo lo que hecho y agradezco tu amable colaboración.


    Sub PasarRegistros()
    Dim celda As Object
    Dim rng As Range
    Set rng = Range("B1:GA11")
    Worksheets("DATOS").Select
    Rng.Select

    'recorremos cada celda del rango indicado
    For Each celda In rng
    valor = celda.Value

    If valor Like "*comcon*" Then
    Range("B1:B11").Select
    Selection.Copy
    Sheets("COMCON").Select
    Range("B1").Select
    ActiveSheet.Paste
    ElseIf valor Like "*comgprs*" Then
    Range("C1:AB11").Select
    Selection.Copy
    Sheets("COMGPRS").Select
    Range("B1").Select
    ActiveSheet.Paste
    Next celda
    End If
    Next celda
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Elly,
      te recomendaría si quieres trasladar datos entre hojas, aplicando condiciones, usaras simplemente un Filtro Avanzado, es mucho más rápido y sencillo.

      En todo caso, he probado tu código y ajustado para que copie y pegue el rango completo B1:B11 y C1:AB11 en cada una de las hojas... aunque no veo el sentido de hacer lo que hace:

      Sub PasarRegistros()
      Dim celda As Object
      Dim rng As Range
      Set rng = Worksheets("DATOS").Range("B1:GA11")

      'recorremos cada celda del rango indicado
      For Each celda In rng
      Worksheets("DATOS").Select
      valor = celda.Value
      If valor Like "*comcon*" Then
      Worksheets("DATOS").Range("B1:B11").Select
      Selection.Copy
      Sheets("COMCON").Select
      Range("B1").Select
      ActiveSheet.Paste
      ElseIf valor Like "*comgprs*" Then
      Worksheets("DATOS").Range("C1:AB11").Select
      Selection.Copy
      Sheets("COMGPRS").Select
      Range("B1").Select
      ActiveSheet.Paste
      End If
      Next celda
      End Sub

      El problema es que con ese código vas cambiando la hoja seleccionada y al intentar recuperar el bucle no volvía a la hoja original.
      Espero te oriente

      Eliminar
    2. Ismael, muchísimas gracias tu ayuda me fue muy útil, por eso era que no pasaba los registros, te comento, el propósito de la macro es distribuir esos registros a sus hojas correspondientes ya que la información viene toda en una sola hoja, la revisión de esos datos es un proceso repetitivo, debe hacerse cada día, la idea es automatizarlo de modo que la distribuya, calcular un promedio para que no haya caída de volumen y graficar cada portal. Jejejeje es mucha información. Muchísimas gracias por tu amable ayuda, eres un máster en este tema. ;)

      Eliminar
    3. Me alegra haber podido orientarte.
      Un cordial saludo

      Eliminar
  30. Hola!
    Muy buena tu página y ayudas.
    Soy nuevo en esto de macros y VBA y necesito esta herramienta para aplicarla a una base de datos.
    Tengo la base de datos, y a las columnas les grabo una macro aplicando formato condicional (para los datos que estan bajo el promedio)

    Esto me aparece
    Sub Macro2_prueba2()
    '
    ' Macro2_prueba2 Macro
    '

    '
    Range("D2:D61").Select
    Selection.FormatConditions.AddAboveAverage
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).AboveBelow = xlBelowAverage
    With Selection.FormatConditions(1).Font
    .Color = -16383844
    .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    End Sub

    Y no sé mucho cómo modificarlo en VBA.

    Agradecería vuestra ayuda

    ResponderEliminar
    Respuestas
    1. OLVIDÉ AGREGAR QUE QUIERO HACERLA CORRER PARA TODAS LAS COLUMNAS, OJALÁ CON UN CLICK

      Eliminar
    2. Hola Ale,
      gracias por tu comentario.

      Comenzaré preguntándote si quieres aplicar el formato a tu base de datos (a cada registro/fila) según el valor de uno de los campos (columna D)??
      En segundo lugar qué te aporta tener esta macro cuando el Formato Condicional que estás aplicando es el mismo que sin macro?

      Mi recomendación en este caso es:
      0- Olvídate de macros para este caso.
      1- convierte tu rango de origen (tu base de datos) en Tabla
      2-Selecciona tu origen y conviértelo en Tabla
      3- marca toda tu tabla
      4-fíjate cuál es tu celda activa (supongo es la celda A2)
      5- entra en formato condicional>Nueva regla>Utilice una fórmula que determine...
      6-introduce la siguiente fórmula:
      =$D2>promedio(Tabla1[campo])

      el concepto Tabla1[campo] te debería aparecer al seleccionar el campo de la columna D.

      Y ya no te tendrás que preocupar nunca más de ese formato.. no tendrás que hacer un solo clic
      Saludos

      Eliminar
    3. Gracias por tu pronta respuesta.

      Aún así continúo con algunos problemas.
      Cómo te puedo enviar el excel para que me puedas orientar un poco más?

      Eliminar
    4. Puedes enviarlo a
      excelforo@gmail.com
      Slds

      Eliminar
  31. muy buena tu ayuda, espero puedas ayudarme con mi problema, paso a explicarte:
    tengo una fila con celdes desplegrables de los dias de la semana(lun,mar,mierc,jue,vier,sab,dom) asignados para dias de trabajo a distintas personas, quisiera por empezar (el menor de mi capricho, osea si no se puede no me vuelve loca) es que cuando en la celda desplegable ponga ej. martes, la siguiente me devuelva miercoles y asi consiguientes con todas. repito no me molesta q no se pueda, lo q verdaderamente me gustaria que haga es que, si da domingo ese dia me devuelva en cada celda de empleado en color diferente el texto o me pinte la celda, porfaaaa y desde ya muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Cindy,
      entiendo tienes un listado de personas (en A2:A10, por ejemplo), y en B1:H1 los desplegables de la semana (lun, mar, mie, etc...).
      Si es así el caso (o similar) lo que haríamos sería seleccionar el rango B2:H10 y aplicaríamos un Formato Condicional con fórmula (asegúrate que la celda activa es B2):
      =B$1="dom"
      y aplicas el formato que quieres (fondo de celda, fuente, etc...)

      Espero haber acertado.
      Saludos

      Eliminar
    2. si, muchas gracias y muy buena tu interpretacion, te molesto con otra consulta, tengo un libro y aplique la sigte macro
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

      On Error Resume Next

      Cells.Interior.ColorIndex = 0
      Target.EntireRow.Interior.ColorIndex = 42

      End Sub
      para q me resalte la fila donde este posicionada, pero resulta que selecciono unas celdas para protegerlas y me queda todo seleccionado con el color del macro!!!!

      Eliminar
  32. Hola Ismael,

    Lo primero, decir que estoy sorprendido de la rápida e intensa atención que prestas a través de este foro a tanta gente de distintas partes del mundo. Y lo haces con respuestas claras, bien pensadas y de calidad. Eso lo agradezco mucho.

    Quisiera yo también acercarme y hacerte dos preguntas, que están relacionadas entre sí.

    1) Necesito crear una macro que, en primer lugar, le solicite cierta información al usuario. Luego, en base a la información dada, esta macro debiera ocultar ciertas celdas de una hoja y ocultar el resto de las hojas del libro. ¿Será esto posible?

    2) Si yo compartiera copias de este libro a distintas personas, me gustaría que ellas sólo vieras las celdas y las hojas que esa macro les muestre. Y así luego, poder consolidar en un archivo "matriz" la información que estas personas completen.

    Espero haber sido claro en la descripción de las preguntas. Gracias de antemano por la ayuda y atención... Slds

    ResponderEliminar
    Respuestas
    1. Hola Gonzalo,
      gracias por tus palabras.. de verdad que intento dar respuestas claras a todo el mundo ;-)

      En cuanto a tus preguntas,
      1- Sí, claro, es posible solicitar información al usuario mediante un UserForm construido (con algunos controles - TextBox, comboBox, etc...) o si es una pregunta sencilla directamente con un INPUTBOX.
      Controlando esas variables 'respuesta' podríamos ocultar celdas (OJO, solo podemos ocultar columnas o filas completas!!) con la propiedad .Hidden=True; y por supuesto podemos esconder hojas del Libro con la propiedad de hoja .Visible=False
      2- esto puede ser más problemático, ya que al ir con macros como indicas, requieres la habilitación de las macros por el usuario destinatario... si las habilita, obviamente verán aquellas celdas y hojas que sus respuestas le permitan...

      Espero haberte dado algo de claridad.
      Saludos

      Eliminar
  33. Hola,
    Quiero formatar con colores dieferentes unos puntos en un grafico de dispersión en excel, solo que para esto yo quiero que un determinado grupo tenga un color. Como hacer esto?

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      yo probaría con separar por series cada grupo que quieras de un color, para luego incorporarlos al gráfico de dispersión...
      Un cordial saludo

      Eliminar
  34. Hola Ismael,
    En inicio te felicito por el gran conocimiento que tienes y a raíz de eso el éxito obtenido en la web;
    Me podrías ayudar con algo que me permita validar una dirección de email en un TextBox y que antes de registrarlo sí es incorrecto aparezca un mensaje de error.
    Gracias, Saludos.

    ResponderEliminar
    Respuestas
    1. Hola JES DUE,
      muchas gracias por tus palabras.. realmente sigo aprendiendo, como todos nosotros.

      En cuanto a validar un email , la cosa puede ser complicada, ya que para verficar si existe esa dirección o no habrá que lanzar algún tipo de ping o similar.
      Otra cosa sería comprobar que el texto tiene forma de dirección de correo... lo que se puede hacer con esta función VBA:

      Function ValidarEmail(email As String) As Boolean
      Dim oRegEx As Object
      Set oRegEx = CreateObject("VBScript.RegExp")
      With oRegEx
      .Pattern = "^[\w-\.]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}$"
      ValidarEmail = .Test(email)
      End With
      Set oRegEx = Nothing
      End Function

      Espero te sirva
      Saludos

      Eliminar
    2. Muchas gracias Ismael, en México decimos, "eres chingon" a las personas hábiles.
      Saludos.

      Eliminar
  35. hola buenas Tardes. genio.

    tengo una palabra en A2 "esta palabra es representativa" se extiende varias veces. a igual que otras que son palabras.
    En las columnas B - C - D están sus valores. después saltan a M-N. en el medio de esto tengo cálculos.
    pero necesito darle formato con degradado a las columnas mencionadas. tambien necesito aplicarle borde de cuadro grueso a los conjuntos de palabras .

    Etapas Punzados Tope (m) Base (m)
    Pta R Sup 2 Pzdo 47 3091.1 3091.7
    Pta R Sup 2 Pzdo 46 3106.8 3107.6
    Pta R Sup 2 Pzdo 45 3117.3 3117.9
    Pta R Sup 2 Pzdo 44 3134 3134.6
    Pta R Sup 2 Pzdo 43 3144.3 3144.9
    Pta R Sup 1 Pzdo 42 3166.3 3167.1
    Pta R Sup 1 Pzdo 41 3178.2 3179
    Pta R Sup 1 Pzdo 40 3191.6 3192.4
    Pta R Sup 1 Pzdo 39 3207 3207.8
    Pta RM 7 Pzdo 38 3230.5 3231
    Pta RM 7 Pzdo 37 3252.1 3252.7
    Pta RM 7 Pzdo 36 3258.4 3259

    me podrías dar una ayuda

    ResponderEliminar
    Respuestas
    1. Hola,
      selecciona primero los rangos (columnas) que quieras tenga un formato y aplica el formato de colores y bordes que quieres..
      en su caso si debe estar sujeto a alguna condición, añádele un formato condicional con la regla que le atañe (no me queda claro qué regla es la que se debe aplicar por tu exposición).
      Saludos

      Eliminar
  36. Hola, ismael excelentes tus aoprtes, en mi caso quiero hacer lo siguiente
    tengo codigos de mantenimiento preventivos y correctivo, asi 0101010, 0201010, 0203010,0104010,0204010,0105020,.... la idea es que cuando yo coloque algun codigo de los anteriores me coloque en otra celda si es mtto preventivo- o correctivo

    ResponderEliminar
    Respuestas
    1. Hola Manuel,
      gracias!

      para tu caso habría que saber qué regla cumplen esos códigos para distinguir cuáles son preventivos y cuáles correctivos.

      En general y adelantando una respuesta, me imagino tendrás una tabla de equivalencias, yo emplearía una función BUSCARV para recuperar el dato asociado al código buscado... algo así:
      =BUSCARV(código buscado; TablaEquiv;2;0)

      Espero te oriente
      Saludos

      Eliminar
  37. ismael, son muchos condigos, ademas que me coloque si es preventivo o correctivo quiero que me los segmente por (Rodaje, Motor, chasis, Frenos, Direccion,etc, que sucede la dinamica de los codigos es la siguiente:
    el codigo q contiene los primeros 4 digitos 1010 es rodaje, los que tienen los primeros 4 digitos 2010 es Hidraulico, 2030 es electricico, 1020 motor, 1080 frenos, entonces si es posible cuando yo digite un codigo me aparezca en otra celda si comienza con 1020 me salga "motor"

    con la funcion buscar v puedo hacer eso?

    gracias

    ResponderEliminar
    Respuestas
    1. Hola Manuel,
      deberás tener una tabla de equivalencias con esas correspondencias:
      1010____rodaje
      2010____hidráulico
      2030____eléctrico
      etc
      Entonces sobre la lista de todos los códigos podrías:
      =BUSCARV(VALOR(IZQUIERDA(código BUSCADO));TABLA EQUIV;2;0)

      de forma parecida para distinguir entre preventivo o correctivo.
      Saludos

      Eliminar
  38. Hola Ismael, tengo una cuestion que me tiene dando vueltas hace varios dias y no hallo la solucion.

    Necesito seleccionar celdas adyacentes a la celda activa pero que cumplan con el mismo formato de la misma . . .algo asi como usar CurrentRegion, pero en vez que este limitada por celdas vacias, este limitada por el formato de la celda activa

    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola,
      te diría a priori que para algo así habría que desarrollar un proceso que recorra y seleccione las celdas que cumplan esa condición...
      La dificultad será determinar donde parar el recorrido...

      Lo pensaré

      Eliminar
    2. Gracias por tu atencion a mi asunto, por este lado seguire en la busqueda
      Gracias!

      Eliminar
  39. Como recorrer celdas especificas sin alterar la información, es decir, se pretende realizar un programa de producción en el cual al colocar una OT. Se recorran las horas ya antes planeadas. Por ejemplo en la celda B-G sea 1, de la celda H-M sea 2, sin embargo si se requiere meter un 3 en la celda E-F, los numeros "1" en esas celdas se recorran quedando de la siguiente manera E-F 3 de la G-I 1 que en este caso eran las celdas E-G y de la J-O quede el 2 que anteriormente eran las celdas H-M

    ResponderEliminar
    Respuestas
    1. Hola Nallely,
      cómo estás?, me alegro saludarte.
      Lo siento pero no me queda claro qué necesitas.. ya que comentas que no quieres alterar la información pero por otro lado quieres modificar (celdas E-F) el valor de éstas..???

      En todo caso para recorrer las celdas con macros se suele emplear un bucle-loop tipo for...next, incluyendo alguna condición con IF... THEN que evalue si se desea cambiar o no el valor de esas celdas...

      Un saludo

      Eliminar
  40. Buenas tardes. Tengo un conjunto de normativas especiales para la realización de cuadros específicos en excel para crear indicadores en mi lugar de trabajo y quería saber si alguien me podría ayudar a crear un archivo con macros para que todos mis compañeros de trabajo trabajen con el mismo formato o bajo las mismas normas!

    ResponderEliminar
    Respuestas
    1. Hola Luis,
      Por supuesto cualquier lector puede echarte una mano al respecto.

      Pero debes saber que los desarrollos a medida, según las indicaciones de las Normas de Uso de este blog, se presupuestan.
      Si estás interesado, con gusto te proporciono un presupuesto.
      Saludos cordiales

      Eliminar
  41. hola, ¿como puedo hacer que una celda no tenga fondo de color?, es decir, en codigo pongo vbRed y se pinta en rojo pero si quiero no tenga "sin fondo" en un excel97 que codigo hay que introducir, Gracias, un saludo. Franci

    ResponderEliminar
    Respuestas
    1. Hola Franci,
      en lugar de vbRed, puede poner: xlNone para que vaya sin relleno (sin color).
      Saludos

      Eliminar
  42. hola, como puedo hacer que al ingresar un numero o marca (x o I) en una hoja me pueda pintar la celda de otra hoja,este es el caso que tengo en hoja1 en la celda b1 ingreso un numero o marca y en la hoja2 que me pinte la celda c3 y asi sucesivamente ingesando numeros o marcas de la hoja1 a la hoja 2 y que cada celda solo pinte lo que se le indique . cual seria el codigo en visual basic excel

    ResponderEliminar
    Respuestas
    1. Hola,
      creo sería más sencillo aplicar un formato condicional seleccionando la celda que quieres 'pintar' y aplicando la regla del formato sobre el valor (x o I) de la celda de la Hoja1.

      Saludos

      Eliminar
  43. hola ismael primero felicitarte por tu excelente foro, mi problema es el siguiente quiero habilitar una celda siempre y cuando cumpla con la condicion de que se diligencie primero la anterior. solo necesito textos.

    ejemplo

    tengo 6 celdas

    1. B1 para poder diligenciar esta celda requiero que la celda A1 este diligenciada,, que para la celda C1 debe estar diligenciada la B1,, QUE PARA LA D1 debe estar diligenciada la C1 Y asi sucesivamente como haria??



    ResponderEliminar
    Respuestas
    1. Hola,
      selecciona la primera celda B1, y entra en la validación de datos personalizada:
      =SUMA(A1)>0
      tras Aceptar, podrás arrastrar.(este valdrá si son valores numéricos).

      Para cualquier tipo de valor introducido (texto, número...), la fórmula podría ser:
      =CONTARA(A1)>0

      Saludos

      Eliminar
  44. Hola Ismael..te agradezco tu ayuda y tiempo de antemano.
    No consigo dar con el codigo necesario.
    Tengo un rango de celdas, en el cual quisiera conseguir que al hacer click con el raton en una casilla me marcara 1/2 oh 0.5, sin quitar raton del objetivo, segundo click y marcara 1 y si hiciese click por tercera vez borrase valores oh 0. Es posible? Y añadiendo color?
    Gracias de nuevo. Un saludo.

    ResponderEliminar
    Respuestas
    1. Hola Sergio,
      sinceramente, no creo sea posible tal cosa.. o en su caso extremadamente complejo, ya que habría que localizar la posición del cursor, tener un contador de click sobre esa misma posición, además en el tiempo....

      Saludos

      Eliminar
    2. Hola Ismael, y continuando con este codigo q tengo y que funciona, se le podria añadir una condición para valor 0.5.(Este código marca con ayuda de formato condicional, celda amarilla y valor 1.,si hago click en otra celda y vuelvo a hacer click en la de valor 1 y amarilla, me la vuelve transparente y valor 0)
      codigo:
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not Intersect(Target, Range("D8:L39,P8:X39,AB8:AJ39,D47:L78,P47:X78,AB47:AJ78")) Is Nothing Then
      If Target.Interior.Color = RGB(255, 255, 0) Then
      Target.Interior.ColorIndex = xlNone
      Target.Value = 0
      Else
      Target.Interior.Color = RGB(255, 255, 0)
      Target.Value = 1
      End If
      End If
      End Sub

      Gracias y perdona el tostón, un saludo

      Eliminar
    3. Sergio,
      Ya te quedó contestada en el otro comentario que lo subiste:
      Target.Value=Target.Value-0.5

      Saludos

      Eliminar
  45. Hola Ismael, estoy desarrollando un programa para puder generar horarios, a partir de un horario mensual, generar un horario semanal tengo un problema puesto que deseo agregar condicionales entonces no se como hacer para que:
    Si x= 0 o 1 ó 2 ó 3 ocurra

    tal vez se hace asi?
    If x = 0 or 1 or 2 or 3 Them

    estare atento ,
    Muchas Gracias!

    ResponderEliminar
    Respuestas
    1. Hola,
      muy cerca, más bien:
      If x = 0 or x =1 or x =2 or x =3 Then

      Saludos

      Eliminar
  46. Estimado Ismael, antes que nada felicitarte por el gran conocimiento que tenes, impresionante.
    Tengo una planilla en donde en la columna H, tengo con la funcion SI, indicado que si la fecha de la columna G es menor al dia de hoy, entonces aparece "VENCIDO", sino "". Necesito una macro para que si de H1 a H10 aparece la palabra "VENCIDO", me tire un alerta y un sonido de windows. Desde ya te agradezco y te felicito nuevamente.

    ResponderEliminar
    Respuestas
    1. Muchas gracias!
      podrías incluir esta macro en la ventana de código de la hoja en cuestión:

      Private Sub Worksheet_Change(ByVal Target As Range)
      For Each celda In Range("H1:H10")
      If celda.Value = "VENCIDO" Then
      Beep
      MsgBox "valor VENCIDO en celda " & celda.Address
      End If
      Next celda
      End Sub

      Espero te sirva u oriente.
      Saludos

      Eliminar
    2. No pasa naranja... lo pego en "thisworkbook"? disculpa, no tengo conocimientos en macro

      Eliminar
    3. Ya pude solucionarlo, como cambio para que en vez de que me aparezca la ubicacion de la celda, me aparezca el contenido de la columna A? en vez de H4, que aparezca el contenido de A4. Si es mucho lio puedo sacarlo, solo con que tire un alerta ya es suficiente.
      Otra cosa, como hacer para que se ejecute automaticamente al abrir el excel?

      Millones de Gracias!!! es para un cuartel de Bomberos que me pidio, pero no manejo nada de macros.

      Eliminar
  47. Hola Federico.
    Al abris el editor en la parte iquierda esta el explorador de proyectos ahi podras ver la coleccion de objetos con las que tu libro cuenta, localiza la hoja en donde tienes el formato, das doble clic sobre ella y te mandara una ventana en blaco, en la parte de arriba te aparecen dos lista desplegables, en la primera selecciones WorkSheet y en la seguna lista seleccionas el evento worksheet_change ahi te mandara un bloque donde deberas el codigo que menciona Ismael.

    Solo pegas esta parte del codigo de Ismael dentro del bloque que te aparece:
    For Each celda In Range("H1:H10")
    If celda.Value = "VENCIDO" Then
    Beep
    MsgBox "valor VENCIDO en celda " & celda.Address
    End If
    Next celda
    o simplemente borras todo y pegas todo el codigo de ismael, funcionara de igual forma.

    Espero y me haya explicado bien y sea de tu ayuda.
    Saludos!!!

    ResponderEliminar
  48. Para activar el editor precionas las teclas Alt + F11

    ResponderEliminar
  49. Ya pude solucionarlo, como cambio para que en vez de que me aparezca la ubicacion de la celda, me aparezca el contenido de la columna A? en vez de H4, que aparezca el contenido de A4. Si es mucho lio puedo sacarlo, solo con que tire un alerta ya es suficiente.
    Otra cosa, como hacer para que se ejecute automaticamente al abrir el excel?

    Millones de Gracias!!! es para un cuartel de Bomberos que me pidio, pero no manejo nada de macros.

    ResponderEliminar
    Respuestas
    1. Hola Federico,
      reemplaza
      MsgBox "valor VENCIDO en celda " & celda.Address
      por
      MsgBox "valor VENCIDO en celda " & cells(celda.row,"A").value

      Para que se ejecute al abrir el libro añade el mismo código en
      'ThisWorkbook' dentro del editor de VB, pero empleando el evento _Open:
      Private Sub Workbook_Open()
      ' aquí el código anterior
      End Sub

      Saludos!

      Eliminar
  50. Hola me podrían ayudar con este problema por favor;

    Deberás crear una formula con funciones si anidadas que cumplan con las restricciones y condiciones que a continuación se especifican:

    1.- En la columna de comentarios deberá aparecer la palabra buena o excelente dependiendo de las ventas por producto.

    2.-Para las ventas de lácteos mayores a 6000 se consideran buenas, si las ventas son mayores a 8000 se consideran excelentes.

    3.- Para las ventas de verduras mayores a 4000 se consideran buenas, si las ventas son mayores a 6000 se consideran excelentes.

    4.- La función lógica sí que utilices para generar los comentarios buena o excelente deberá de funcionar sin importar si el producto es lácteo o es verdura, esto es que si se cambia el nombre del producto de lácteo a verdura el comentario deberá cambiar de acuerdo a los puntos 2 y 3
    LA TABLA ES COMO LA SIGUIENTE.


    Producto Año Mes Ventas Unidades Vendedor Región Comentario
    Lacteo 1997 Dic 7686 5563 Davolio Norte
    Verduras 1996 Sep 2956 1242 Buchanan Oeste

    Me ayudan por favor

    ResponderEliminar
  51. HOLA OZIEL.
    SI SUPONEMOS QUE EN LA COLUMNA A TENEMOS LOS NOMBRES DE LAS CATEGORÍAS ES DECIR LÁCTEOS Y VERDURAS.EN LA COLUMNA B LOS IMPORTES DE VENTAS Y EN LA COLUMNA C SERA DONDE SALDRÁN LOS COMENTARIOS QUE SE HARÁN EN BASE A LAS FORMULAS PODEMOS USAR LA SIGUIENTE FORMULA ANIDADA.

    =SI(A2="LACTEOS",SI(B2>8000,"EXCELENTE",SI(Y(B2>6000,B2<8000),"BUENA","")),SI(A2="VERDURAS",SI(B2>6000,"EXCELENTE",SI(Y(B2>4000,B2<6000),"BUENA","")),""))

    ESPERO TE FUNCIONE SALUDOS.


    ResponderEliminar
    Respuestas
    1. YA TU LA ADECUAS A LA ESTRUCTURA DE TU TABLA QUE SE MENCIONA AL FINAL.

      Eliminar
    2. Muchas Gracias Gilberto me sirvió de mucho tu respuesta

      Eliminar
  52. Hola me podrian ayudar, coloco el siguiente codigo y al momento de ingresar un dato, me tira automaticamente la fecha, la pregunta es: al momento de borrar el dato ingresado, la fecha se queda grabada, existe la posibilidad que si la celda este vacia, no se ingrese la fecha.
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("D:D")) Is Nothing Then
    Range("B" & Target.Row) = Date
    End If
    End Sub
    A sus comentarios.
    Muy Agradecido

    ResponderEliminar
    Respuestas
    1. Hola,
      podrías incluir u nuevo condicional
      IF Range("B" & Target.Row).value<>"" then Range("B" & Target.Row) = Date
      dentro del otro condicional...
      Saludos

      Eliminar
    2. Gracias Ismael, por el tiempo que te tomas y por tu pronta respuesta, soy nuevo con estos temas de VB, seria mucha molestia, que me podrias compartir como quedaria agregando el nuevo condicional que me proporcionates, dentro del condicional que te envie.
      A tus comentarios, muy agradecido.
      saludos,!!

      Eliminar
    3. Hola,
      podría ser así:
      Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Application.Intersect(Target, Range("D:D")) Is Nothing Then
      IF Range("B" & Target.Row).value<>"" THEN Range("B" & Target.Row) = Date
      End If
      End Sub

      lo que condiciona para completar la celda de la columna B correspondiente con la fecha es que ya tenga algo escrito previamente.

      Saludos

      Eliminar
  53. Buen día Ismael, tu blog es muy bueno, quisiera saber si me puedes ayudar para generar una macro que me convine probabilidad e impacto para calcular la severidad y asignar un color al resultado, ejemplo:

    IMPACTO * PROBABILIDAD = SEVERIDAD Color
    Inferior * Muy Baja = Baja Verde
    Menor * Baja = Baja Verde
    Moderado * Media = Alta Naranja
    Mayor * Alta = Extrema Rojo
    Superior * Muy Alta = Extrema Rojo

    Agradezco de antemano tu ayuda

    ResponderEliminar
    Respuestas
    1. Hola Luisa,
      no creo necesario una macro para obtener el dato, bastaría una fórmula que recupere el dato de 'Severidad'
      Tal cual lo expresas paree que se podría emplear un SI condicional o incluso un BUSCARV sobre el impacto, ya que parece que con indicar el Impacto es suficiente para identificar la Severidad
      =SI(celdaImpacto="Inferior";"Baja Verde";SI(celdaImpacto="Menor";"Baja Verde";SI(celdaImpacto="Moderado";"alta Naranja";SI(celdaImpacto="Mayor";"Extrema Rojo"; "Extrema Rojo"))))

      Saludos

      Eliminar
  54. Muchas gracias Ismael, ya lo aplique y me funciono.

    ResponderEliminar
  55. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  56. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  57. Hola, buen día Ismael, gracias por la aportación. Quisiera que me ayudaras, tengo un archivo de Excel en el que tengo dos hojas, en la hoja 1 tengo una lista con muchos proveedores y cada proveedor tiene muchos materiales distintos, y en la hoja 2 tengo una tabla en la que escribo materiales, lo que quiero es que en la hoja 2 se ponga de color cada celda dependiendo del proveedor, pienso que se podría hacer con una macro ya que como son muchos materiales y proveedores distintos con reglas sería muy tardado. De antemano gracias.

    ResponderEliminar
    Respuestas
    1. Hola,
      le daré una vuelta.. ya que una macro no creo aporte demasiado al asunto.
      Un saludo

      Eliminar
    2. Buen día, cuál cree que podría ser la posible solución?

      Eliminar
    3. lo pensaré.. pero a priori un formato condicional parece la respuesta más simple.
      Saludos

      Eliminar
    4. Buen día, ¿hay alguna forma en la que en lugar de buscar sólo una palabra busque una las palabras iguales de un rango?
      En lugar de que diga libre en esta parte “If valor = "LIBRA" Then” busque en un rango de celdas y si esa palabra está en el rango le de color.

      Eliminar
    5. Hola Raúl,
      en un comentario más arriba comentaba a otro lector algo similar, empleando comodines:
      If VALOR Like "*COLOR*" Then celda.Interior.Color = 255

      Espero te de la idea.
      Slds

      Eliminar
  58. Hola buen día, tengo un formato condicional y quiero que en automático me solicite un comentario y al terminar de colocar dicho comentario se oculte, posteriormente lo quiero extraer pero en otra pestaña del mismo archivo para generar un pareto ¿como lo puedo lograr?, muchas gracias por su ayuda..

    ResponderEliminar
  59. La verdad no lo se, tampoco se utilizar las macro

    ResponderEliminar
    Respuestas
    1. Hola Patricia,
      obviamente tal cosa solo es posible con un desarrollo de programación-macros.
      :(
      Saludos

      Eliminar
    2. Hola Ismael ¿cree que tenga tispo de ayudarme con un ejemplo? ó que textos debo consultar para lograr hacer lo que necesito?

      De antemano muchas gracias. :)

      Eliminar
  60. Hola Ismael
    Tengo un tema que me viene quitando el sueño.

    Tengo un validador de contraseña, tengo 3 usuarios, quiero que cada usuario pueda determinadas paginas del form (el form tiene el multipage con 3 pages)
    Este es mi codigo pero no me resulta.
    Dim password As Variant
    Dim DatoEncontrado
    Application.ScreenUpdating = False
    Sheets("User").Activate
    UsuarioExistente = Application.WorksheetFunction.CountIf(Range("A2:B4"), Me.TextBox1.Value)
    Set rango = Range("A2:B4")
    If Me.TextBox1.Value = "" Or Me.TextBox2.Value = "" Then
    MsgBox "Por favor introduce usuario y contraseña", vbExclamation, Blog
    Me.TextBox1.SetFocus
    ElseIf UsuarioExistente = 0 Then
    MsgBox "El usuario '" & Me.TextBox1 & "' no existe", vbExclamation, Blog
    ElseIf UsuarioExistente = 1 Then
    DatoEncontrado = rango.Find(What:=Me.TextBox1.Value, MatchCase:=True).Address
    Contrasenia = Range(DatoEncontrado).Offset(0, 1).Value
    If Range(DatoEncontrado).Value = Me.TextBox1.Value And Contrasenia = _
    Me.TextBox2.Value Then
    Cells(2, 3) = TextBox1
    Sheets("Fact").Activate
    MsgBox "Acceso Correcto"



    '*************Aquí Tengo problemas********************************
    If Range("C2").Value = "User_Factura" Then
    AFacturaAStock.Show
    With AFacturaAStock.MultiPage1
    .Page1.Visible = True
    .Page2.Visible = False
    .Page3.Visible = True
    End With

    Else
    If Range("C2").Value = "User_Stock" Then
    AFacturaAStock.Show
    With AFacturaAStock.MultiPage1
    .Page1.Visible = False
    .Page2.Visible = True
    .Page3.Visible = False
    End With

    Else
    If Range("C2").Value = "User_Jales" Then
    AFacturaAStock.Show
    End If
    End If
    End If
    Unload Me



    End If

    Else
    MsgBox "La contraseña es inválida", vbExclamation, Blog
    End If


    Application.ScreenUpdating = True

    ResponderEliminar
    Respuestas
    1. Hola,
      no se ve a priori ningún fallo.. tiene bastante lógica lo que has codificado...
      Lo único que se me ocurre es que el TestBox1 lo has reflejado en la hoja 'User' y finalmente activas las hoja 'Fact', por lo que al comenzar tu comparativa de usuario:
      If Range("C2").Value = "User_Factura" Then
      etc..
      en C2 de la hoja 'Fact' no encuentra lo que debería.
      Especifica la hoja donde se encuentra plasmado el usuario:
      If sheets("User").Range("C2").Value = "User_Factura" Then
      ...

      debería funcionar
      Saludos

      Eliminar
  61. Hola Ismael quisiera hacerle una consulta sería de gran ayuda. Tengo una base de datos en la hoja 1 como clientes necesitó un código en vba que me aplique un color a la fila respectiva del cliente según una condición de dos variables ejemplo las fechas de cobro tengo excel 2010. Anexo lo hize con el formato condicional pero necesitó hacer lo mismo en vba

    ResponderEliminar
    Respuestas
    1. Hola Omar,
      solo sigue las indicaciones del post, pero en el condicional añade la segunda condición
      IF condición1 AND condición2 THEN ....

      De todas formas es algo se puede hacer igualmente sin macros, con el formato condicional.
      Un cordial saludo

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Hola Ismael sigo con el problema, en el momento lo he hecho sin macros y funciona perfectamente, ahora quiero hacer una macro que haga lo siguiente. Un ejemplo en la hoja 2 tengo un botón que al darle clic, copie automáticamente los clientes de color amarillo por ejemplo y los pegue en la misma hoja 2.
      Anexo: al hacer este proceso no me toma en cuenta el color de fondo porque lo puse como formato condicional y cuando las pinto manualmente si lo toma en cuenta ¿por qué? por eso mi necesidad de pintar las filas según 2 condiciones, creo que la macro debería llevar primero objeto range para especificar el campo de aplicación y luego los condicionales, ahora no sé si es necesario meterlo en un bucle, necesito ayuda por favor

      Eliminar
    4. Hola Omar,
      el problema de aplicar criterios sobre colores, cuando hay un FC por medio, es que los colores no se identifican normalmente como un formato directo.
      Puedes aplicar a tus condiciones lo explicado aquí:
      http://excelforo.blogspot.com.es/2014/01/vba-obtener-el-color-de-relleno-o.html

      Slds

      Eliminar
  62. Hola Ismael Romero buenas tardes, ¿crees me puedas ayudar con una duda?
    tengo un dato que se obtiene de la sumatoria de otras celdas, lo que ocupo es condicionar ése resultado a que no sea menor de 2,500. podrás ayudarme que condicional tengo que hacer o si es por medio de macros. espero tu respuesta gracias.

    ResponderEliminar
    Respuestas
    1. Hola,
      no indicas qué quieres mostrar si fuera menor de 2500, pero el condicional sería:
      =SI(suma(...)>=2500;suma(...);0)
      esto es, si la SUMA es mayor o igual a 2500 devuelve la suma en caso contrario cero.
      Saludos

      Eliminar
    2. hola Ismael, condicionarlo a que me envíe un mensaje o que cambie a un color diferente.
      2. la condicional la utilizamos como macro o en la celda?

      Eliminar
    3. Hola,
      es una fórmula a introducir en una celda en la hoja de cálculo (sin macros).
      Que cambie de color o no lo puedes solucionar aplicando una regla de formato condicional...
      Para el envío de mensaje (por mail?, un pop up?) sí se debería emplear programación...
      Saludos

      Eliminar
  63. Hola ismael , un saludo, no se si me pudieras ayudar con unos datos,, tengo una hoja de excell donde tengo numeros de algunas claves y me gustaria saber si hay forma de que cada que cambia la clave en la lista, se agregue una fila en blanco, los datos son muchos, pero pongo un ejemplo para comprension:
    CLAVE COLOR FECHA
    1 VERDE 1.12.16
    1 VERDE 1.12.16
    1 VERDE 1.12.16
    2 ROJO 1.12.16
    2 ROJO 1.12.16
    3 CYAN 1.12.16

    ResponderEliminar
    Respuestas
    1. Hola,
      un truco sencillo sería aplicar la herramienta de Subtotales, según el campo CLAVE.. para una vez añadidos los subtotales, aplicar un filtro y borrar los textos y fórmulas añadidas.

      Otra opción con macros

      Slds

      Eliminar
  64. Hola me gustaría saber si me pueden ayudar para saber como hacer para validar una lista dependiente de otra cuando luego de usarla cambias el contenido de la primera celda (origen) y te queda mal la dependiente porque tal contenido se correspondía con el primer contenido de la celda de origen. No se me explico.Hay alguna forma de validarlo? Muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola,
      sí, te explicaste perfectamente ;-)
      Fíjate que cuando hablamos de Validación de datos en realidad estamos restringiendo qué puedo o no escribir en una celda..
      Al aplicar una validación de datos condicionada/dependiente estamos marcando un orden natural:
      según UNO podré escribir/desplegar en DOS.

      En todo caso, salvando ese orden, quizá se podría generar una Validación personalizada con alguna fórmula condicional... aunque eso supondría una doble relación algo confusa.

      Es más probable que se encuentre la solución con algo de programación y eventos tipo _Change sobre ambas celdas.

      Slds

      Eliminar
  65. Hola Ismael, antes de quitarte algo de tiempo con mi pregunta quiero felicitarte por el foro y lo explicativo que eres en él, me ha salvado en más de alguna ocación con las dudas que tengo.
    Mi pregunta es la siguiente, estoy comenzando con el tema de las macros y la que aparece aqui principalmente la utilice para una planilla y funciona perfectamente, el único problema que tengo es que cuando te aparece la opcion de indicar el rango de celdas, si presionar el boton cancelar esto me arroja un error 424 pues requiere un objeto, qué puedo hacer para que cuando presione cancelar sin indicar un rango de celdas no me genere ese error?

    ResponderEliminar
    Respuestas
    1. Hola!,
      prueba controlando el error:

      Sub formato()
      Dim celda As Object
      Dim rng As Range
      'con INPUTBOX seleccionamos un rango de celdas
      On Error Resume Next
      Set rng = Application.InputBox("en que rango quieres aplicar el formato??", Type:=8)
      On Error GoTo 0

      If rng Is Nothing Then
      MsgBox "No has seleccionado rango!", vbCritical
      Exit Sub
      End If


      'recorremos cada celda del rango seleccionado
      For Each celda In rng
      valor = celda.Value
      'asignamos colores según el valor de la celda
      If valor = "LIBRA" Then
      celda.Interior.Color = 65535
      ElseIf valor = "PERMISO" Then
      celda.Interior.Color = 15773696
      ElseIf valor = "GUARDIA" Then
      celda.Interior.Color = 255
      ElseIf valor = "CONSULTA" Then
      celda.Interior.Color = 5296274
      End If
      Next celda
      End Sub


      Saludos!!

      Eliminar
  66. Hola Ismael,
    Gracias por todo lo compartido. Me ha ayudado.
    Una consulta, he realizado 4 macros para la impresión de 15 hojas, que varían en función de un par unos parámetros.
    Ahora necesitaría una macro, que me ejecute una de las 4 anteriores, en función del resultado de A1, por ejemplo. Si A1 es 1, ejecutar macro 1, si A1 es 2 macro 2 ....
    Me puedes guiar?

    ResponderEliminar
    Respuestas
    1. Hola Miguel,
      podrías crear una macro nueva de control que según la condición llame a una macro u otra de las que ya tienes:
      sub nueva()
      if range("A1").value=1 then
      call macro1
      if range("A1").value=2 then
      call macro2
      end if
      end sub

      Saludos

      Eliminar
  67. Buen día Ismael,
    Son muy interesantes tus respuestas, por lo tanto agradezco me puedas ayudar.
    Necesito una macro para:
    Tengo una celda Ej: A1 (donde coloco un valor y este es el numero de decimales, ya que pueden variar). Ejemplo en celda A1 mi valor es 4.
    Lo que significa que quiero 4 decimales en otra celda, ejemplo B1.
    Adicionalmente si puedo configurar para que ese numero de decimales se me refleje en diferentes celdas, Ejemplo B1, B5, B7 a B15.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Anselmo,
      si quieres trabajar con el número de decimales (y no solo de formato) que indiques en la celda A1, en las demás celdas, por ejemplo B1, B5, B7 a B15:
      =REDONDEAR(número;A1)

      Por otro lado, si hablamos de formato solo y no de redondeo real, con la siguiente macro:

      Sub formato()
      strformat = "#,##0." & Application.WorksheetFunction.Rept(0, Range("A1").Value)
      Range("B1,B5,B7:B15").NumberFormat = strformat
      End Sub

      Saludos

      Eliminar
  68. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  69. Buenas noches requiero de tu ayuda tengo un control de pago pero quiero que cambie el color del de los nombres de acuerdo a los pagos realizados de la siguiente maner
    si suma igual 0 rojo
    si suma igual entre 1,2,3... 12 amarillo
    si suma igual entre 13, 14, 15... 23 verde
    si suma igual a 24 azul
    te aclaro las cantidades no llevan decimales.
    saludos y muchas gracias.
    Pd Los numeros son referenciales.

    ResponderEliminar
    Respuestas
    1. Hola Tomás,
      la idea sería aplicar tantas reglas de formato condicional como 'colores'
      Aplicaríamos las siguientes reglas de formato condicional:
      1 regla: FC - Resaltar reglas - Igual a = 0 con formato rojo
      2 regla: FC - Resaltar reglas - entre 1 y 12 con formato amarillo
      3 regla: FC - Resaltar reglas - entre 13 y 23 con formato verde
      4 regla: FC - Resaltar reglas - igual a = 24 con formato azul

      Puedes usar las estándar, o bien os formatos condicionales personalizados

      Espero te oriente.
      Slds

      Eliminar