miércoles, 11 de noviembre de 2009

VBA en Excel: IF... THEN...ELSE.

Analizamos en una entrada anterior el uso en VBA de la instrucción SELECT CASE, aplicado a una tabla de Retenciones de IRPF; de forma similar existe otra instrucción en VBA, IF...THEN...ELSE, que nos permitirá realizar la misma operación.
Sobre el mismo ejemplo:


podemos aplicar el siguiente código, generando una función llamada 'IRPFretencion':


El resultado es el esperado...



Recordemos que el uso de esta instrucción IF...THEN...ELSE se emplea, de manera similar al SI condicional de Excel, para ejecutar un grupo de instrucciones de manera condicionada, en función del valor de una 'expresión', sin embargo, SELECT CASE ejecuta una de varias instrucciones según el valor de la expresión.
La sintaxis general de IF...THEN es:
IF condición THEN inst_verdaderas [ELSE inst_falsas]

12 comentarios:

  1. Buen día:

    Poseo una pequeña aplicacion en Access en la cual capturo novedades de nomina de empleados. En dicha aplicación he insertado un modulo de codigo VBA el cual me permite realizar una exportacion de registros desde Access hacia un archivo de Excel conforme a un intervalo de fechas que la aplicacion solicita ingresar al momento de efectuar la exportacion.

    Este codigo funciona perfectamente, pero resulta que debo aplicar cierto formato a cada celda en Excel, ya que el archivo final se convierte en un archivo plano para ser subido a el programa contable.

    Requiero de su amable colaboración para que me digan como puedo aplicar el formato que necesito en el archivo Excel así:

    En la celda A2 el valor traido de Access es 72048768. Necesito aplicar un formato de tal forma que me quede 0000072048768. Es decir, en la columna A los valores introducidos en cada celda deben completar 13 digitos (completando con ceros adicionales a la izquierda), en la columna B se deben completar 5 digitos, en la columna C se deben completar con 3 digitos y asi sucecivamente para cada columna subsiguiente

    A continuacion el codigo VBA que realiza el copiado de los datos extraidos de Aceess en la hoja de Excel

    fila = 2
    columna = 1
    While Not rst.EOF
    For Each fld In rst.Fields
    .Cells(fila, columna) = fld.Value
    AQUI ES DONDE DEBO APLICAR EL FORMATO A LA CELDA
    columna = columna + 1
    Next
    columna = 1
    fila = fila + 1
    rst.MoveNext
    Wend

    Les agradezco muchisimo me puedan ayudar con esto

    ResponderEliminar
    Respuestas
    1. Hola Alexc,
      lo primero sería aclarar si quieres darle formato o si quieres completar con dígitos '0' hasta llegar a 13, 5 ó 3.
      Ya que la opción de formato, igual que en Access, sólo es una máscara aplicada a la celda, esto es no modifica el valor; mientras que la opción de completar cambiaría el valor numércio por uno de tipo texto, con 13, 5 ó 3 caracteres cero por la izquierda.
      Otra cosa importante sería conocer la longitud del valor para cada columna de Excel donde acabara, ya que comentas que si el valor fuera a la col A debería tener un formato, a la B otro y así sucesivamente...
      Supondré que independientemente de en qué columna acabe, siempre deberá dar un formato total de 13 dígitos, y que sólo buscas modificar el formato del valor (no convertilo en texto), por lo que la línea de código que buscas sería:
      .Cells(fila,columna).NumberFormat = "0000000000000"

      Cualquier otra posibilidad requeriría incluir un condicional que dirigiera un formato de texto con 13, 5 ó 3 ceros añadidos por la izquierda, dependiendo de la variable columna; algo del estilo:

      Cells(fila, columna).NumberFormat = "@"
      If Cells(fila, columna).Column = 1 Then Cells(fila, columna).Value = Application.WorksheetFunction.Rept("0", 13 - Len(Cells(fila, columna).Value)) & Cells(fila, columna).Value
      else if Cells(fila, columna).Column = 2 Then Cells(fila, columna).Value = Application.WorksheetFunction.Rept("0", 5 - Len(Cells(fila, columna).Value)) & Cells(fila, columna).Value
      IF columna = 3 then etc, etc


      Espero haberte orientado
      Slds

      Eliminar
  2. IF condición THEN inst_verdaderas [ELSE inst_falsas] no se entiende ni madres

    ResponderEliminar
    Respuestas
    1. Hola que tal estás!?
      Un placer poder ayudarte.
      El IF ...THEN ...ELSE es un sentencia condicional que evalúa una CONDICIÓN y actúa de una manera u otra cuando dicha condición sea VERDADERA o FALSA, a eso se refiere la sintaxis...

      Un cordial saludo

      Eliminar
  3. Estimados, necesito ejecutar una macro, por ejemplo que cambie el rango del eje de un gráfico, pero por cada elemento que seleccione de su cuadro de segmentación de datos. El cambiar el rango del eje del gráfico si lo sé, lo que no sé es como programar que se detecte que se esta eligiendo un elemento del cuadro de segmentación, pistas por favor para poder lograrlo. Gracias

    ResponderEliminar
    Respuestas
    1. Hola Henry,
      en principio al seleccionar elementos de una Segmentación de datos se adaptan automáticamente los valores de los ejes...
      No veo necesidad de forzarlo con programación ¿¿¿???
      Quizá se me escapa el sentido de lo que preguntas.

      Saludos

      Eliminar
  4. Hola, si me puedes ayudar te lo agradeceria, necesito crear una macro, pero soy nuevo en esto, lo que necesito es que si en las colunnas X tengo montos iguales + o - se pongan de un color y si existen montos iguales que utilice la descripcion para poder agruparlos, ya que son muchas transacciones y pierdo mucho tiempo haciendolo manualmente, y ocupo automatizarlo, el asunto es que son muchas transacciones, de antemano gracias por su ayuda!

    ResponderEliminar
    Respuestas
    1. Hola,
      lo primero que debemos plantearnos antes de comenzar a programar es qué criterios son los que debemos aplicar, y sobre todo cuál es el fin a lograr.
      En tu detalle hablas de dar formato (poner un color) a celdas con un valor similar... esto es lo primero que debemos tener claro, ¿qué entiendes por valor igual + o -?? ,¿qué diferencia debe haber entre uno y otro para considerarlos iguales?
      En segundo lugar hablas de agrupar valores iguales.. y la cuestión que se me plantea es ¿cómo quieres concrétamente realizar esta agrupación??

      Quizá bastase aplicar unos formatos condicionales para el formato y crear una tabla dinámica para esas agrupaciones... o finalmente no hubiera más remedio que aplicar algún tipo de macro.
      ??????
      Se necesitaría mucho más detalle para empezar a plantearse construir una macro de ese estilo.
      Saludos

      Eliminar
  5. Hola, quiero saber como hacer que una celda cambie de valor o cifra cuando alcance cierto numero, es decir: tenemos 30 ventas(A1) las cuales se pagan a 10 pesos(B1) pero, si las ventas aumentan a 40 ventas se pagarían a 15 pesos(C1), si llegan a 50 se pagarían a 20 pesos(D1) ¿como hacer que B1 cambie a C1 o D1 cuando A1 llegue a 40 o 50 en su caso?

    ResponderEliminar
    Respuestas
    1. Hola,
      deberías aplicar un condicional SI en la celda B1:
      =SI(A1<40;A1*10;SI(A1<50;A1*15;A1*20))

      Saludos

      Eliminar

  6. Hola Buen dia, quisiera de su ayuda ya que tengo un formato de cotizacion y tengo el siguiente problema:
    Trabajamos 4 listas de precios diferentes A,B,C,D lo que quiero es que al poner en una celda la letra de la lista, me de los precios en las celdas de la columna de los precios.
    Por si no me explique: si en la celda "A1" pongo "B" en la columna donde van los precios me de en cada celda el precio de la lista "B".
    Espera me puedan apoyar ... Gracias

    ResponderEliminar
    Respuestas
    1. Hola Edgar,
      hay varias formas de hacerlo, como en tu caso solo tienes cuatro listas de precios, podrías montar un condicional del tipo:
      =SI(A1="A";BUSCARV(...Tabla Precios A...);SI(A1="B";BUSCARV(... Tabla Precios B...);SI(A1="C";BUSCARV(... Tabla Precios C...);BUSCARV(... Tabla Precios C...))))

      Espero te oriente
      Saludos

      Eliminar