Encuéntranos en Google+.
Working Into Binary
Ingeniería electrónica, lenguajes de programación, software, simulación, noticias, ofimática, ERP,...
Mostrando entradas con la etiqueta Visual Basic for Applications (VBA). Mostrar todas las entradas
Mostrando entradas con la etiqueta Visual Basic for Applications (VBA). Mostrar todas las entradas

Como saber si un valor es múltiplo de otro en Excel con y sin Visual Basic

06 septiembre, 2012
Hoy veremos dos maneras de validar que un cierto valor se múltiplo de otro. El primer método es aplicable dentro del ámbito de Excel mediante la fórmula Residuo(). El segundo método, y más interesante para los que programamos en Visual Basic, es mediante el operador MOD, el cual nos sirve para cualquier aplicación que utilice VBA (Excel, Access, Word,...).
El primer método es utilizando la función Residuo. Tenemos la siguiente tabla de valores:


Vemos como en la primera columna tenemos los valores que queremos saber si son múltiplos o no de los valores que aparecen en la columna de la derecha. En la última columna obtenemos la respuesta Sí/No. Para obtener dicha respuesta, utilizamos la fórmula siguiente:

=SI(RESIDUO(A2;B2)=0;"Sí";"No")

La condición de que un valor sea múltiplo de otro es que el residuo de su cociente sea 0. La fórmula Residuo() nos da eso, el residuo del cociente de los dos valores que indiquemos en su argumento. Aplicamos esa condición mediante la fórmula Si() y ya tenemos nuestra respuesta.

Este es un método muy sencillo para saber si un valor es múltiplo de otro, pero es que en el caso de Visual Basic es igual de fácil. En Visual Basic utilizaremos el operador MOD. Su sintaxis es:

Residuo = Valor1 MOD Valor2

El operador MOD nos devuelve el residuo del cociente entre el Valor1 y el Valor2. Aplicamos la misma condición que antes, residuo igual a 0, y validamos:

Sub Check_Multiple()

Dim V1 As Double
Dim V2 As Double

V1 = 16
V2 = 2

If V1 Mod V2 = 0 Then
  MsgBox "El valor " & V1 & " ES múltiplo de " & V2 & ".", vbOKOnly + vbInformation
Else
  MsgBox "El valor " & V1 & " NO ES múltiplo de " & V2 & ".", vbOKOnly + vbInformation
End If

End Sub


De este modo disponemos de dos manera de validar que un valor sea múltiplo de otro.

Cómo eliminar u ocultar en Excel las filas con un cierto valor en una de sus celdas con VBA

05 septiembre, 2012
Hoy me han preguntado sobre como automatizar la eliminación/ocultación de filas en Excel que tengan un cierto valor en una de sus celdas. La solución: Visual Basic. Me atrevería a decir que no hay casi nada imposible para VBA, solo nos limita nuestra capacidad de imaginación en el momento de idear una solución. Por eso, aprovecho esta entrada para recomendaros, al igual que he hecho con el compañero que me ha preguntado, su aprendizaje. Más adelante tengo pensado hacer un tutorial básico de VBA dentro del entorno de Excel.
Pero a lo que ibamos!
Tenemos una tabla como la siguiente:


La tabla corresponde a la tabla de Pedidos de la base de datos de ejemplo de Access llamada Northwind 2007. La podéis descargar desde este blog mismamente (buscar en el SideBar de la derecha) o desde el propio Access.

Queremos eliminar de todas las filas cuyo valor en la columna "Tipo de pago" sea "Cheque" o no contenga nada (la columna es la "O", que queda a la derecha de las columnas que muestra la imagen anterior). Lo que haremos será recorrer una a una las filas de la hoja y comprobar cual es el valor de la celda en la columna "O". Evaluaremos ese valor y realizaremos una acción u otra según el mismo.

Primeramente, diseñaremos un código que nos elimine las filas y, después, otro código que nos oculte las filas. Habrá una ligera diferencia entre ellas.

El código para eliminar las filas es el siguiente:

Sub Delete_Rows()

Dim Wb As Worksheet
Set Wb = Worksheets("Hoja1")

Dim i As Integer
i = 2

Do While Wb.Cells(i, 1) <> ""
  If Wb.Cells(i, 15) = "" Or Wb.Cells(i, 15) = "Cheque" Then
    Wb.Rows(i).EntireRow.Delete
  Else
    i = i + 1
  End If
Loop

MsgBox "Filas eliminadas con éxito!", vbOKOnly + vbInformation, "Tarea finalizada"

End Sub

Podría comentar el código, pero la experiencia me ha demostrado que hay gente que solo le interesa tener el código, adaptarselo y ya está, y luego está la gente que quiere entender el código (que son los que realmente acaban aprendiendo a programar en VBA). A ellos les recomiendo ejecutar el código paso a paso y ver qué hace. Intentar entenderlo facilitará mucho más el aprendizaje de VBA que el que os comente línea a línea todo el código. Buscar en Internet y en los archivos de ayuda de las correspondientes aplicaciones también facilita el aprendizaje del código. Finalmente, si algo no se entiende, no dudéis en dejar un comentario y gustosamente os lo explicaré.

Ahora, el código para esconder las filas:

Sub Hide_Rows()

Dim Wb As Worksheet
Set Wb = Worksheets("Hoja1")

Dim i As Integer
i = 2

Do While Wb.Cells(i, 1) <> ""
  If Wb.Cells(i, 15) = "" Or Wb.Cells(i, 15) = "Cheque" Then
    Wb.Rows(i).EntireRow.Hidden = True
  End If
  i = i + 1
Loop

MsgBox "Filas escondidas con éxito!", vbOKOnly + vbInformation, "Tarea finalizada"

End Sub


Y con estas pocas líneas de código podemos realizar nuestra tarea eficientemente.

(Acordaros que podéis descargaros la base de datos Northwind 2007 en el SideBar de la derecha de este blog. Utilizaré de ahora en adelante sus tablas y diferentes elementos para futuros ejemplos de Excel o Access.)

Base de Datos de ejemplo Northwind 2007 para Access


Para los futuros ejemplos para Excel o Access utilizaremos una base de datos basada en Access que ofrece Microsoft gratuitamente. Utilizaremos esta base de datos para realizar ejemplos sobre Access y sus tablas para realizar ejemplos en Excel (basta con hacer un "copiar y pegar" de las tablas al Excel).
Os dejo un enlace a la web de Microsoft donde os la podéis descargar sin ningún problema.

Enlace: Northwind 2007

(Nota: al abrir el archivo que descarguéis no esperéis tener la base de datos directamente abierta. Os mostrará la pantalla de inicio de Access y debéis de indicar que queréis crear una nueva base de datos, la cual se llamará Northwind 2007 por defecto. Aún así, al abrir Access, en la barra de la izquierda, aparece un enlace donde pone "Ejemplos". Si clicáis ahí también la encontraréis.)

Cómo ingresar, en Excel, fórmulas en celdas mediante VBA

04 septiembre, 2012
A veces queremos ingresar fórmulas en las celdas de Excel en lugar de valores directamente. Ello se logra con la propiedad FormulaLocal.
Utilizaremos esta propiedad para añadir la fórmula, mediante un string, a la celda que deseemos. Nada mejor que un ejemplo.
Queremos que la celda B6 tome el valor de la suma del rango B2:B4 y, al modificar algún valor de los que contiene el rango mencionado, el resultado en B6 se nos actualice. Ello lo logramos ingresando la fórmula "=SUMAR(B2:B4)" en la celda B6.
Si ingresamos la fórmula directamente sobre la celda, VBA lo interpretará como una cadena de texto y lo ingresará como tal. Para que nos lo reconozca como fórmula tenemos que utilizar FormulaLocal.
Tenemos la hoja de datos de nuestro ejemplo:


Para ingresar la fórmula en la celda B6 utilizaríamos el siguiente código:

Sub Ejemplo()

  Worksheets("Hoja1").Range("B6").FormulaLocal = "=SUMA(B2:B4)"

End Sub

e-Seminario de Access (Kung-Fu Access)

25 julio, 2012

Os traigo el vídeo de un e-seminario sobre Access impartido por el MVP Juan Soto. En este vídeo de 50 minutos, se muestran diferentes aspectos sobre Access como:
  • Variables temporales.
  • Utilización de enumeración en lugar de variables para una mejor lectura del código.
  • Utilización de clases para automatizar tareas frecuentes.
El seminario tubo lugar el 13 de julio y está en ingles apoyado gráficamente mediante una presentación en diapositivas y ejemplos prácticos en Access, por lo que se hace entendible incluso para aquellos que no dominen la lengua de Shakespeare.


Os dejo el vídeo y el enlace al web del autor del e-seminario.



Cómo centrar controles en los formularios de Access

21 julio, 2012

No existe un "botón" para centrar los controles de un formulario de Access indistintamente del tamaño que éste tenga. Únicamente nos da las opciones de delimitarlos respecto izquierda o derecha y arriba o abajo. Para centrar los controles hay que pasar obligatoriamente por el uso de VBA. Aún así, es fácil su implementación y podremos hacerla en no más de cuatro líneas y media.
Imaginemos que tenemos un formulario llamada "frmEjemplo" y dentro de este formulario tenemos un control, por ejemplo un label (etiqueta), llamado "lblCentrado", que es el control que queremos que se centre automáticamente en el formulario indistintamente de el tamaño de éste último. Con este código, además, lograremos que el control se coloque automáticamente en el centro del formulario aunque  lo re-dimensionemos.
Para empezar el código lo introduciremos directamente en el formulario. Para ello, abrimos el formulario en vista diseño. Después, teniendo seleccionado el formulario, en la ventana Propiedades, entramos en la pestaña Eventos. Nos situamos en cualquiera de ellos que esté vacío y clicamos sobre el botón con tres puntos suspensivos que nos aparece al lado. En el cuadro que nos salta, seleccionamos Generador de código y clicamos en Aceptar. Automáticamente, apareceremos en el editor de VBA dentro del formulario en cuestión. Al final del todo agregamos el siguiente código:

Private Sub Form_Resize()
  Me.lblCentrado.Top=Me.WindowHeight/2
  Me.lblCentrado.Left=Me.WindowWidth/2
End Sub

El código se ejecuta para el evento Resize. Este evento tiene lugar cundo se inicia el formulario y cuando éste es re-dimensionado. Podéis observar como no aparece el nombre del formulario frmEjemplo por ningún lado. Hacemos referencia a él mediante el comando Me. Dentro de la macro tenemos únicamente dos líneas de código.
La primera línea establece la propiedad Top del control lblCentrado. La propiedad Top indica la posición de la esquina superior izquierda del control respecto el borde superior del formulario. Para que quede centrado utilizamos la propiedad del formulario WindowHeight, que nos indica la altura total del formulario. Para situar el control en el centro, fijamos la propiedad Top del control con un valor igual a la mitad de la altura del formulario, es decir, la mitad de WindowHeight.
La segunda línea establece la propiedad Left del control lblCentrado. La propiedad Left indica la posición de la esquina superior izquierda del control respecto el borde izquierdo del formulario. Para que quede centrado utilizamos la propiedad del formulario WindowWidth, que nos indica la anchura total del formulario. Para situar el control en el centro, fijamos la propiedad Left del control con un valor igual a la mitad de la anchura del formulario, es decir, la mitad de WindowWidth.

Si introducimos este código el control quedará cerca del centro del formulario, pero no exactamente en el centro. Eso es debido a que las propiedades Top y Left toman como referencia la esquina superior izquierda del control para situarlo en el formulario. Para corregir esto, haremos que la propiedad Top tome el mismo valor que antes, pero quitándole la mitad de lo que mide de altura el el control. Para corregir la parte del Left, hacemos que tome el mismo valor que antes, pero quitándole la mitad de la anchura del control. El código quedaría de la siguiente manera:

Private Sub Form_Resize()
  Me.lblcentrado.Top=Me.WindowHeight/2-Me.lblcentrado.Height/2
  Me.lblcentrado.Left=Me.WindowWidth/2-Me.lblcentrado.Width/2
End Sub

Pero si introducimos este código, puede darse el caso en que reduzcamos tanto la ventana que Me.WindowHeight sea más pequeño de Me.lblCentrado.Height y la propiedad Top tome valores negativos. Esto no ocasionará un error en la ejecución del código (lo mismo para la propiedad Left). Para solventar esto, debemos controlar la ejecución del código con un If de tal manera que, si el formulario toma un tamaño que ocasiona valores negativos para las propiedades Top y Left, el código no sea ejecutado. En el caso extremo, el código quedaría finalmente de la siguiente manera:


Private Sub Form_Resize()
  If Me.WindowHeight/2-Me.lblcentrado.Height/2>=0 Then
    Me.lblcentrado.Top=Me.WindowHeight/2-Me.lblcentrado.Height/2
  End If

  If Me.WindowWidth/2-Me.lblcentrado.Width/2>=0 Then
    Me.lblcentrado.Left=Me.WindowWidth/2-Me.lblcentrado.Width/2
  End If
End Sub

De esta manera logramos tener un control situado justo en el centro de un formulario de Access. Ahora solo se debe adaptar el código a las necesidades particulares de cada uno.

Cómo habilitar la pestaña Programador del Ribbon

18 julio, 2012

Queremos mostrar la pestaña Programador en el Ribbon (Cinta de Opciones) en Excel. Ello nos ofrecerá nuevas acciones a realizar (abrir el editor de VBA, añadir controles al libro, gestionar expansiones,...) que nos darán pie a sacarle el máximo partido a la aplicación. El proceso para el resto de aplicaciones del paquete de Office es el mismo. Es por ello que solo se mostrará como hacerlo en Excel. También comentar que la versión de Microsoft Office es la de 2007.

Para mostrar la pestaña Programador realizaremos los siguientes pasos:


1. Hacer clic sobre el botón de Office que aparece en la parte superior izquierda de la aplicación.


2. Hacemos clic sobre el botón Opciones de Excel que nos aparece abajo a la derecha del menú que nos acaba de aparecer.


3. En la ventana que nos aparece nada más entrar, deberemos marcar la casilla que dice Mostrar ficha de Programador en la cinta de opciones. Pulsaremos Aceptar y ya tendremos visible nuestra pestaña Programador.