Sunteți pe pagina 1din 20

SESIN N 5

o Implementar aplicaciones utilizando UserForms y los


principales controles de Formularios.
o Utilizar Variables de memoria para realizar operaciones
con los datos mientras que la aplicacin se ejecute.
o Utilizar en forma apropiada las funciones incorporadas
en VBA.

MACROS EN EXCEL

APLICACIONES RESUELTAS
EMISIN DE RDENES DE PAGO
La siguiente aplicacin nos permite emitir rdenes de pago en una institucin municipal en el
departamento de Catastro. La informacin necesaria para la aplicacin est distribuida en seis hojas
de trabajo, as tenemos:
Hoja Categoras: contiene las categoras de trmites que se desea efectuar. Son 21 categoras.

Hoja Especificaciones: contiene los detalles de cada uno de los trmites que se desea efectuar. Son 98
especificaciones.

Hoja Usuarios: contiene los nombres de usuario y sus contraseas de acceso al sistema.

Pg. 2/20

MACROS EN EXCEL
Hoja Ordenes: almacena cada una de las rdenes de pago emitidas.

Hoja Indices: contiene los datos necesarios para la bsqueda de los datos cuando se realice una
bsqueda.

Hoja Formato: Tiene el formato de la orden de pago para su impresin.

FORMULARIOS DE LA APLICACIN
El acceso al sistema es mediante un usuario y una clave de acceso proporcionada por la hoja Usuarios.
El desarrollo de esta aplicacin consta de 4 formularios y un mdulo, en ste ltimo estarn contenidas
todas las funciones que se utilizarn desde cualquier punto de la aplicacin.

Formulario de Presentacin
El primer formulario es una pantalla de presentacin (frmInicio) que se debe abrir al momento de
abrir el libro, esta ventana se mostrar unos segundos y luego debe aparecer la ventana de acceso a la
aplicacin. La ventana de este formulario es el siguiente:

Pg. 3/20

MACROS EN EXCEL

Label1

Image1

Image2

Formulario de Presentacin
El segundo formulario (frmAcceso) es el que permite el acceso al sistema a travs de un nombre de
usuario y una contrasea, los mismos que son validados de la hoja Usuarios. Los detalles de este
formulario se pueden apreciaren la siguiente captura:

txtUsuario
txtContrasea
btnAceptar

btnSalir

NOTA: Cuando ingreses la contrasea deben aparecer asteriscos en lugar de cada


carcter, para lograr este efecto debes establecer el valor * en la propiedad
PasswordChar, desde la ventana de Propiedades.

Formulario de rdenes de pago


El formulario de rdenes de pago (frmOrdenes) es el formulario principal que contiene los datos de la
orden, tales como:

Nmero de recibo: el nmero de recibo es correlativo y se genera automticamente y sirve


como ndice en la base de datos de la hoja Ordenes.

Cdigo: identifica el ejercicio catastral para lo que se requiere la orden.

Precio unitario: es el valor por unidad del servicio.


Pg. 4/20

MACROS EN EXCEL

Cantidad: indica el nmero de rdenes por el mismo concepto, ya que es posible que se
requiera ms de una orden de pago por el mismo servicio y para evitar la duplicidad de rdenes
se emite una sola orden con el importe correspondiente.

Total a pagar: Es e l importe en nmeros que se abonar.

Autorizacin: Es el nombre de la persona o institucin que est pidiendo en servicio.

Cantidad (en letras): es el importe a pagar expresado en letras.

Concepto: es la definicin del servicio.

Fecha de emisin: es la fecha en la que se emite la orden.

Los detalles de este formulario de puede apreciar en la siguiente captura:


lblRecibo
txtCdigo
btnNCat
lblStatus

txtPrecioUnit
txtCantidad

sbtCantidad
txtTotalPagar
txtAutoriza
txtCantidadLetras
txtConcepto
txtFechaEmisin
btnbtnGrabar

btnModificar

btnNuevo

btnImprimir

btnCancelar

btnSalir

btnBsqueda
NOTA: El control sbtCantidad es un control del tipo SpinButton o control numrico que
permite aumentar o disminuir el valor del control txtCantidad.

Formulario de Categoras
Este formulario permite seleccionar la categora del servicio, as como el tipo de construccin a la que
se aplica el servicio. Est compuesta de dos controles CcomboBox (cboCategora)que capturan los
datos respectivos de las hojas Categoras y Especificaciones. Los controles TextBox (txtCdigo y
txtPrecio) capturan los datos del servicio que correspondan a la seleccin.
Los detalles de ste formulario se pueden apreciar en la siguiente captura:

Pg. 5/20

MACROS EN EXCEL

cboCategora
cboTipo
txtCdigo
txtPrecio
btnSalir

btnAceptar

CODIFICACIN DE LA APLICACIN
Una vez que tengamos los formularios de la aplicacin, ahora procederemos a la codificacin.
Empezaremos con la codificacin de mdulo principal, para ello en la ventana del editor de VBA
(ALT+F11), aade un nuevo mdulo (men Insertar/Mdulo).
Codificando en el Mdulo1
La primera lnea del mdulo hace una declaracin de la variable ult para todo el mdulo. El
procedimiento Auto_open() es el que permite que la aplicacin se ejecute cuando se abre el libro.
El procedimiento EMPEZAR descarga el formulario de inicio (frmInicio) y carga el formulario de acceso
(frmAcceso) a la aplicacin.
' *************************************************************************
' Esta es una variable global, se puede usar en cualquier procedimiento
' Por eso se define en esta seccin
' *************************************************************************
Dim ult
Sub Auto_open()
' Se ejecuta en forma automtica cuando abre el libro de excel
Load frmInicio
frmInicio.Show
End Sub
Sub EMPEZAR()
Unload frmInicio
frmAcceso.Show
End Sub
La funcin Busqueda es una funcin muy importante ya que permite buscar al usuario que har uso
de la aplicacin, al inicio de la misma, as como permitir la bsqueda de las rdenes de pago emitidas
en una consulta de las mismas.
Function Busqueda(caso, valor1, valor2) As Integer
' **************************************************************************
' Parmetros de la Funcion

Pg. 6/20

MACROS EN EXCEL
' Caso : 1 si es Hoja Usuarios, 2 si es Hoja Ordenes
' Valor1: Es el valor que se buscar
' Valor2: En el caso de la validacin de los usuarios es la clave de acceso
'
valor2 solo se usa para los usuarios
' **************************************************************************
Dim obj_cell As Range ' Objeto tipo rango
Dim ult, hoja, i
Busqueda = 0 ' Valor por defecto de cero (0) para la funcin
' *******************************************************************
' Las siguientes lneas permiten buscar en que hoja se realizar
' la bsqueda, define la cantidad de elementos que tiene dicha hojs
' y hace la bsqueda respectiva, desde 1 hasta la variable ult, que
' es la ltima fila donde se encuentra los datos
' ********************************************************************
Select Case caso
Case 1:
ult = Worksheets("indices").Range("B1")
hoja = "Usuarios"
Case 2:
ult = Worksheets("indices").Range("B4")
hoja = "Ordenes"
End Select
Set obj_cell = Range("A1:A" & ult)
obj_cell.Select ' Selecciona la hoja
With Worksheets(hoja)
.Activate
For i = 1 To ult
Select Case caso
Case 1:
' Valor1 es el nombre de usuario que se busca, valor2 es la clave
' Se usa la funcin Ucase para convertir a maysculas lo ingresado
If UCase(.Cells(i, 2)) = UCase(valor1) And UCase(.Cells(i, 3)) = UCase(valor2) Then
Busqueda = i
Exit For
End If
Case 2:
' En este caso Valor1 es el valor a ser buscado
If .Cells(i, 1) = Val(valor1) Then
Busqueda = i
Exit For
End If
End Select
Next

Pg. 7/20

MACROS EN EXCEL
End With
End Function
La funcin ContarCeldas() permite contar el nmero de celdas que se requiere en los procesos
de captura de datos para los controles ComboBox en el formulario de Categoras.
Function ContarCeldas(X) As Integer
Dim obj_cell As Range
Dim ult, hoja
ult = Worksheets("indices").Range("B3")
Set obj_cell = Range("A1:A" & ult)
obj_cell.Select
ContarCeldas = 0
With Worksheets("Especificaciones")
.Activate
For i = 1 To ult
If .Cells(i, 2).Value = X Then
ContarCeldas = ContarCeldas + 1
End If
Next
End With
End Function
Las funciones que a continuacin se indican se utilizan en la conversin los importes de las rdenes de
pago de nmeros a letras:
Function ImporteLetras(xx) As String
Dim L As Long
Dim c As String, numero As String, deci As String
deci = Right(xx, 2)
c = ""
xx = Mid(xx, 1, InStr(1, xx, ".", 1) - 1)
L = Len(xx)
numero = ""
If L > 3 Then
c = Left(xx, L - 3)
Select Case Val(c)
Case 1
numero = "UN"
Case 2 To 20
numero = Ver_NumeroHasta20(Val(c))
Case 21
numero = "VEINTIUN"
Case 22 To 99
numero = Ver_NumeroHasta20(Val(c))
Case 100
numero = "CIEN"
Case 101 To 999
numero = Ver_NumeroHasta1000(Val(c))

Pg. 8/20

MACROS EN EXCEL
End Select
numero = numero + " MIL "
End If
c = Right(xx, 3)
Select Case Val(c)
Case 1 To 20
numero = numero + Ver_NumeroHasta20(Val(c))
Case 21 To 99
numero = numero + Ver_NumeroHasta100(Val(c))
Case 100
numero = numero + "CIEN"
Case 101 To 999
numero = numero + Ver_NumeroHasta1000(Val(c))
End Select
ImporteLetras = numero & " CON " & deci & "/100"
End Function
Function Ver_NumeroHasta20(n) As String
Dim Nu As String
Select Case n
Case 1
Nu = "UNO"
Case 2
Nu = "DOS"
Case 3
Nu = "TRES"
Case 4
Nu = "CUATRO"
Case 5
Nu = "CINCO"
Case 6
Nu = "SEIS"
Case 7
Nu = "SIETE"
Case 8
Nu = "OCHO"
Case 9
Nu = "NUEVE"
Case 10
Nu = "DIEZ"
Case 11
Nu = "ONCE"
Case 12
Nu = "DOCE"
Case 13
Nu = "TRECE"
Case 14
Nu = "CATORCE"
Case 15
Nu = "QUINCE"
Pg. 9/20

MACROS EN EXCEL
Case 16
Nu = "DIECISEIS"
Case 17
Nu = "DIECISIETE"
Case 18
Nu = "DIECIOCHO"
Case 19
Nu = "DIECINUEVE"
Case 20
Nu = "VEINTE"
End Select
Ver_NumeroHasta20 = Nu
End Function
Function Ver_NumeroHasta100(n As Integer) As String
Dim Nu As String, Nu2 As String
Select Case n
Case 1 To 19
Nu = Ver_NumeroHasta20(n)
Case 20
Nu = "VEINTE"
Case 21 To 29
Nu = "VEINTI"
Case 30 To 39
Nu = "TREINTA"
Case 40 To 49
Nu = "CUARENTA"
Case 50 To 59
Nu = "CINCUENTA"
Case 60 To 69
Nu = "SESENTA"
Case 70 To 79
Nu = "SETENTA"
Case 80 To 89
Nu = "OCHENTA"
Case 90 To 99
Nu = "NOVENTA"
End Select
If n > 0 And n < 20 Then
Else
If n Mod 10 <> 0 Then
Nu2 = Ver_NumeroHasta20(n Mod 10)
If n > 20 And n < 30 Then
Nu = Nu + Nu2
Else
Nu = Nu + " Y " + Nu2
End If
End If
End If
Pg. 10/20

MACROS EN EXCEL
Ver_NumeroHasta100 = Nu
End Function
Function Ver_NumeroHasta1000(n) As String
Dim Nu As String, Nu2 As String
Select Case n
Case 102 To 199
Nu = "CIENTO"
Case 200 To 299
Nu = "DOSCIENTOS"
Case 300 To 399
Nu = "TRECIENTOS"
Case 400 To 499
Nu = "CUATROCIENTOS"
Case 500 To 599
Nu = "QUINIENTOS"
Case 600 To 699
Nu = "SEISCIENTOS"
Case 700 To 799
Nu = "SETECIENTOS"
Case 800 To 899
Nu = "OCHOCIENTOS"
Case 900 To 999
Nu = "NOVECIENTOS"
End Select
If n Mod 100 <> 0 Then
Nu2 = Ver_NumeroHasta100(n Mod 100)
Nu = Nu + " " + Nu2
End If
Ver_NumeroHasta1000 = Nu
End Function

CODIFICANDO EN EL FORMULARIO frmInicio


En este formulario, un pequeo procedimiento que permite mostrar dicho formulario unos segundos
y a continuacin, llamar al procedimiento EMPEZAR, que a su vez despliega el formulario de acceso.
Private Sub UserForm_Initialize()
Application.OnTime Now + TimeValue("00:00:03"), "EMPEZAR"
End Sub

Pg. 11/20

MACROS EN EXCEL

CODIFICANDO EN EL FORMULARIO frmAcceso


En este formulario se codifican los botones btnAceptar y btnSalir. En el botn btnAceptar
se utiliza la funcin Busqueda() para verificar el nombre del usuario y su respectiva contrasea.
Private Sub btnAceptar_Click()
If Busqueda(1, txtUsuario.Text, txtContrasea.Text) <> 0 Then
Unload Me
frmOrdenes.Show
Else
MsgBox "Usuario no reconocido, Vuelva a intentarlo...!", 64 + 1, "Errror...!"
txtUsuario.Text = Empty
txtClave.Text = Empty
txtUsuario.SetFocus
End If
End Sub
Private Sub btnSalir_Click()
End
End Sub

CODIFICANDO EN EL FORMULARIO frmOrdenes


En este formulario se inicializa las variables globales sw y fil, la primera, por ejemplo, se utiliza como
swicht o interruptor entre las operaciones a realizar, por ejemplo, cuando se van a guardar los datos.
Tambin, se codifica el evento Initialize del formulario UserForm que se encarga de desactivar
algunos botones y activar otros, por ejemplo, el botn Grabar an no debe estar activado sino hasta
despus de aadir una nueva orden, al igual que el botn Imprimir, pero el botn Nuevo y el botn
Salir se deben estar activos. As tenemos:
Dim sw
Dim fil As Integer
Private Sub UserForm_Initialize()
btnGrabar.Enabled = False
btnCancelar.Enabled = False
btnNCat.Enabled = False
btnModificar.Enabled = False
btnImprimir.Enabled = False
btnBusqueda.Enabled = True
btnSalir.Enabled = True
btnNuevo.Enabled = True
Activar (False)
End Sub

Pg. 12/20

MACROS EN EXCEL
La funcin Activar() se utiliza para activar o desactivar los cuadros de texto segn sea una nueva
orden de pago, una bsqueda o modificacin:
Sub Activar(sw As Boolean)
txtCdigo.Enabled = sw
txtPrecioUnit.Enabled = sw
txtCantidad.Enabled = sw
txtTotalPagar.Enabled = sw
txtAutoriza.Enabled = sw
txtCantidadLetras.Enabled = sw
txtConcepto.Enabled = sw
txtFechaEmisin.Enabled = sw
End Sub
Si el argumento de esta funcin es False los controles TextBox se desactivan, en caso contrario
estos se activan cuando el argumento es True.
El procedimiento LimpiarCampos(), se utiliza para eliminar el contenido de los cuadros de texto,
cuando se quiera aadir una nueva orden de compra o una nueva bsqueda:
Sub LimpiarCampos()
txtCdigo.Text = ""
txtPrecioUnit.Text = ""
txtCantidad.Text = ""
txtTotalPagar.Text = ""
txtAutoriza.Text = ""
txtCantidadLetras.Text = ""
txtConcepto.Text = ""
txtFechaEmisin.Text = ""
lblNRecibo.Caption = ""
End Sub

El botn Nuevo inicialmente limpia los campos de texto, tanto para un nuevo registro y luego cambia
los estados de los botones, habilitando los que vamos a usar, en este caso Grabar y Cancelar.
Private Sub btnNuevo_Click()
LimpiarCampos
' Habilita y desabilita los botones del formulario de acuerd
' de acuerdo a la opcin seleccionada: Nuevo
btnGrabar.Enabled = True
btnCancelar.Enabled = True
btnNCat.Enabled = True
btnModificar.Enabled = False
btnsalir.Enabled = False
btnImprimir.Enabled = False
btNnuevo.Enabled = False
btnBsqueda.Enabled = False
With lblStatus
.Caption = "Nuevo"

Pg. 13/20

MACROS EN EXCEL
.ForeColor = RGB(255, 0, 0)
End With
sw = 1
Activar (True)
btnNCat_Click ' Invoca al formulario frmcategorias
txtAutoriza.SetFocus
End Sub
Observa que el control lblStatus toma el valor de Nuevo, que indica que se est efectuando un
nuevo registro. La variable sw nos va a permitir realizar la correcta accin al momento de grabar los
datos, esto debido a que usamos el mismo botn para grabar los datos ya sean para nueva orden o
para una modificacin, pero se utiliza el mismo cdigo para grabar, con una pequea variacin que
estar dada, justamente, por la variable sw.
La lnea de cdigo btnNCat_Click es importante porque permite simular hacer un Click en el botn
btnNCat y ejecutar todo el cdigo asignado a este evento, a su vez permitir abrir el formulario
frmCategorias:
Private Sub btnNCat_Click()
'************************************************************
' vbModal, hace que el usuario no pueda cambiar de ventana
' hasta que cierre el formularion, en este caso frmcategorias
'************************************************************
frmcategorias.Show [vbModal]
End Sub
El parmetro [vbModal] permite abrir el formulario en modo modal, es decir que es dependinete
de formulario frmOrdenes, mientras que el formulario frmCategorias no se cierre no se podr
acceder al formulario frmOrdenes.
El botn Grabar tiene el siguiente cdigo:
Private Sub btngrabar_Click()
If txtCdigo.Text = "" Or txtAutoriza.Text = "" Then
MsgBox "Datos Imcompletos, no ha ingresado a quin se autoriza la orden de pago...", 64 + 1, "Error..."
txtAutoriza.SetFocus
Else
Select Case sw
Case 1: 'Nuevo Registro
ult = Worksheets("indices").Range("B4") + 1
Case 2: 'Graba modificacin del ltimo ingresado
ult = Worksheets("indices").Range("B4")
Case 3: 'Graba modificacin de la bsqueda
ult = fil
End Select
With Worksheets("Ordenes")
.Activate
.Cells(ult, 1) = ult

Pg. 14/20

MACROS EN EXCEL
.Cells(ult, 2) = txtCdigo.Text
.Cells(ult, 3) = txtPrecioUnit.Text
.Cells(ult, 4) = txtCantidad.Text
.Cells(ult, 5) = txtTotalPagar.Text
.Cells(ult, 6) = txtAutoriza.Text
.Cells(ult, 7) = txtCantidadLetras.Text
.Cells(ult, 8) = Trim(txtConcepto.Text)
.Cells(ult, 9) = txtFechaEmisin.Text
End With
lblnRecibo.Caption = ult
btNnuevo.Enabled = True
btnModificar.Enabled = True
btnSalir.Enabled = True
btnImprimir.Enabled = True
btnBsqueda.Enabled = True
btnNCat.Enabled = False
btnGrabar.Enabled = False
btnCancelar.Enabled = False
If sw <> 3 Then
Worksheets("indices").Range("B4") = ult
End If
Activar (False)
End If

End Sub
Cuando se inserta el contenido en los cuadros de texto desde el formulario Categoras, se llenan todos
los campos excepto uno, el que corresponde a Se autoriza a (txtAutoriza), por lo tanto sera fcil
de comprobar si el contenido de todos los campos estn llenos antes de grabar los datos, slo
comparando el contenido del control txtAutoriza con cualquiera de los otros cuadros de texto, en
este caso con el control txtxCdigo, como se observa en la siguiente lnea:
If txtCdigo.Text = "" Or txtAutoriza.Text = "" Then
Luego seleccionamos la forma de grabacin segn sea el caso: Si sw = 1 significa que vamos a grabar
un nuevo registro. Si sw = 2 significa que vamos a grabar la modificacin de datos del ltimo registro
ingresado y que an tenemos los datos en pantalla y su sw = 3 significa que vamos a grabar la
modificacin de los datos de un registro que es el resultado de una consulta previa y que puede estar
ubicado en cualquier lado dentro de la basa de datos.
El botn Bsqueda permite buscar un registro segn su nmero de ndice, que es nico y correlativo
para cada registro. La bsqueda lo realiza la funcin Busqueda() que se encuentra en el Mdulo1, si no
encuentra el registro sale un mensaje de error:

Private Sub btnbsqueda_Click()


Dim nn As String
LimpiarCampos
lblStatus.Caption = "CONSULTA"
lblStatus.ForeColor = RGB(0, 0, 255)

Pg. 15/20

MACROS EN EXCEL
nn = InputBox("Ingrese Nmero de Orden", "Bsqueda")
' **********************
' Null = Vacio o Nulo
' **********************
If nn = Null Or nn = "" Then
MsgBox "No ingres el Nmero de Orden, vuelva a Intentarlo...", _
64 + 1, "Atencin!"
LimpiarCampos
btnImprimir.Enabled = False
btnModificar.Enabled = False
Else
If IsNumeric(nn) Then
fil = Busqueda(2, Val(nn), 0)
If fil = 0 Then ' No se encontr la Orden
LimpiarCampos
btnImprimir.Enabled = False
btnModificar.Enabled = False
MsgBox "Orden no encontrada", 64 + 1, "Atencin!"
Else
With Worksheets("Ordenes")
.Activate
lblnRecibo.Caption = .Cells(fil, 1)
txtCdigo.Text = .Cells(fil, 2)
txtPrecioUnit.Text = .Cells(fil, 3)
txtCantidad.Text = .Cells(fil, 4)
txtTotalPagar.Text = .Cells(fil, 5)
txtAutoriza.Text = .Cells(fil, 6)
txtCantidadLetras.Text = .Cells(fil, 7)
txtConcepto.Text = .Cells(fil, 8)
txtFechaEmisin.Text = .Cells(fil, 9)
btnImprimir.Enabled = True
btnModificar.Enabled = True
End With
sw = 3
End If
End If
End If

End Sub
El botn Modificar tiene el siguiente cdigo:
Private Sub btnModificar_Click()
btnGrabar.Enabled = True
btnCancelar.Enabled = True
btnNCat.Enabled = True
Pg. 16/20

MACROS EN EXCEL
btnModificar.Enabled = False
btnSalir.Enabled = False
btnImprimir.Enabled = False
btnNuevo.Enabled = False
btnBusqueda.Enabled = False
If lblStatus.Caption = "CONSULTA" Then
sw = 3
Else
lblStatus.Caption = "Modificando"
lblStatus.ForeColor = RGB(125, 125, 255)
sw = 2
End If
Activar (True)
End Sub
Para modificar un registro primero debemos de asegurarnos que los datos estn en pantalla, ya sea
como resultado de una bsqueda o en un nuevo ingreso. Ac podemos notar que la variable sw toma
el valor de 2.
El botn Cancelar permite cancelar tanto el ingreso de un nuevo registro como la modificacin de
datos, el cdigo es el siguiente:
Private Sub btnCancelar_Click()
btnGrabar.Enabled = False
btnCancelar.Enabled = False
btnNCat.Enabled = False
btnModificar.Enabled = False
btnSalir.Enabled = True
btnImprimir.Enabled = False
btnNuevo.Enabled = True
btnBusqueda.Enabled = True
LimpiarCampos
lblStatus.Caption = ""
Activar (False)
End Sub
El botn Imprimir permite enviar la informacin a la impresora, la misma que se aade al formato que
tenemos en la hoja Formato:
Private Sub btnImprimir_Click()
With Worksheets("Formato")
.Activate
.Range("B3").Value = txtCdigo.Text
.Range("B5").Value = Format(CDbl(txtPrecioUnit.Text), "#,###,###,##0.00")
.Range("B7").Value = txtCantidad.Text
.Range("B9").Value = Format(CDbl(txtTotalPagar.Text), "#,###,###,##0.00")
.Range("B11").Value = txtAutoriza.Text
.Range("B13").Value = txtCantidadLetras.Text

Pg. 17/20

MACROS EN EXCEL
.Range("B15").Value = txtConcepto.Text
.Range("B17").Value = txtFechaEmisin.Text
.PrintOut
End With
End Sub
El control numrico (SpinButton) se utiliza para modificar la cantidad en el cuadro de texto txtCantidad,
como tiene dos elementos para aumentar y disminuir el valor, se tiene que programar ambas
situaciones:
Private Sub sbtCantidad_SpinUp()
If Not txtCantidad.Text = "" Then
txtCantidad.Text = Val(txtCantidad.Text) + 1
txtTotalPagar.Text = Val(txtPrecioUnit.Text)* Val(txtCantidad.Text)
txtTotalPagar.Text = Format(CDbl(txtTotalPagar.Text),"#,###,###,##0.00")
txtCantidadLetras.Text = ImporteLetras(txtTotalPagar.Text)
End If
End Sub
Private Sub sbtCantidad_SpinDown()
If Not txtCantidad.Text = "" Then
txtCantidad.Text = Val(txtCantidad.Text) - 1
If Val(txtCantidad.Text) = 0 Then txtCantidad.Text = 1
txtTotalPagar.Text = Val(txtPrecioUnit.Text)* Val(txtCantidad.Text)
txtTotalPagar.Text = Format(CDbl(txtTotalPagar.Text), "#,###,###,##0.00")
txtCantidadLetras.Text = ImporteLetras(txtTotalPagar.Text)
End If
End Sub
Finalmente, el botn Salir, permite cerrar la aplicacin:
Private Sub btnSalir_Click()
End
End Sub

CODIFICANDO EN EL FORMULARIO frmCategorias


En este formulario primero se declara una matriz de variables para capturar la informacin de las
categoras de servicio. Luego, el evento UserForm_Initialize() permite cargar al control
cboCategoras la lista de categoras desde la hoja del mismo nombre.
Dim mat() As String
Private Sub UserForm_Initialize()
ult = Worksheets("indices").Range("B2")
ReDim mat(ult, 2)
mat(0, 1) = "Codigo"
mat(0, 0) = "Categoria"
Pg. 18/20

MACROS EN EXCEL

With Worksheets("Categorias")
.Activate
For i = 1 To ult
mat(i, 1) = .Cells(i, 1)
mat(i, 0) = .Cells(i, 2)
Next
End With
cboCategoras.List = mat
End Sub
El siguiente procedimiento permite cargar las especificaciones o tipo que se va a utilizar, en el control
cboTipo:
Private Sub cboCategoras_Click()

Dim ult
Dim X
If cboCategoras.ListIndex > 0 Then
ult = Worksheets("indices").Range("B3")
X = ContarCeldas(Val(cboCategoras.List(cboCategoras.ListIndex,1)))

ReDim mat(X, 3)
cboTipo.Clear
txtCdigo.Text = ""
txtPrecio.Text = ""
With Worksheets("Especificaciones")
.Activate
X=0
For i = 1 To ult
If .Cells(i, 2).Value = Val(cboCategoras.List(cboCategoras.ListIndex, 1)) Then

X=X+1
mat(X, 0) = .Cells(i, 3).Value
mat(X, 1) = .Cells(i, 4).Value
mat(X, 2) = .Cells(i, 5).Value
End If
Next
End With
cboTipo.List = mat
Else
cboCategoras.Text = ""
End If
cboTipo.SetFocus
End Sub

Pg. 19/20

MACROS EN EXCEL
El siguiente procedimiento programa el evento ClicK en el control cboTipo permite cargar los datos a
los controles de texto txtCdigo y txtPrecio.
Private Sub cboTipo_Click()
If cboTipo.ListIndex > 0 Then
txtCdigo.Text = cboTipo.List(cboTipo.ListIndex, 1)
txtPrecio.Text = Format(CDbl(cboTipo.List(cboTipo.ListIndex, 2)), "#,###,###,##0.00")
End If
End Sub
El botn Aceptar, verifica si los datos estn completos y luego los capia en el formulario Ordenes
para despus descargarse. Tiene el siguiente cdigo:
Private Sub btnAceptar_Click()
Dim cad
If txtCdigo.Text = "" Or txtPrecio.Text = "" Then
MsgBox "Datos incompletos, No ha ingresado todos los datos requeridos"
Else
frmOrdenes.txtCdigo = txtCdigo.Text
frmOrdenes.txtPrecioUnit = Format(CDbl(txtPrecio.Text), "#,###,###,##0.00")
frmOrdenes.txtCantidad = 1
frmOrdenes.txtTotalPagar = Format(CDbl(txtPrecio.Text), "#,###,###,##0.00")
frmOrdenes.txtCantidadLetras = ImporteLetras(txtPrecio.Text)
frmOrdenes.txtConcepto = Trim(cboCategoras.Text) & " - " & Trim(cboTipo.Text)
frmOrdenes.txtFechaEmisin = Format(Now, "dd/mm/yyyy")
Unload Me
End If
End Sub
Finalmente el botn Salir, descarga el formulario Categoras sin capturar los datos:
Private Sub btnSalir_Click()
Unload Me
End Sub

Pg. 20/20

S-ar putea să vă placă și