Você está na página 1de 53

Funcin InputBox

Video 2 (Ejemplos)
Es una funcin que nos muestra una ventana en la que el usuario puede
digitar informacin y para ello se requiere declarar variable para que la
informacin sea almacenada en esas variables
1. Insertar un botn de comando para agregar el cdigo
Option Explicit // sale error obliga a declarar variables
Private Sub CommandButton1_Click()
Dim Texto As String
Texto = InputBox("Ingrese su nombre" & Chr(13) & "y apellido",
"Entrada de datos")
ActiveSheet.Range("A1") = Texto
End Sub
2. Otra variable
Dim Celda As String
Celda = InputBox("Seleccione la celda de destino", "Seleccin de
celda")
Cambio esta lnea ActiveSheet.Range("A1") = Texto por esta
ActiveSheet.Range(Celda) = Texto

Instruccin for next


Video 3 (Ejemplos)
1. Maneja buclies que es una instruccin que nos permitir ejecutar de
forma repetida un conjunto de instrucciones hasta que se cumpla la
condicion que hemos especificado, tambin son conocidas como
ciclos.
Ejemplo
Private Sub CommandButton2_Click()
Dim n As Integer
For n = 1 To 10
MsgBox ("n = " & n)
Next n
End Sub
2. Hacer que los nmeros aparezcan en las celdas A2 a A10
Private Sub CommandButton2_Click()
Dim Fila As Integer
Dim Columna As Integer
Dim n As Integer
Fila = 1
Columna = 1
For n = 1 To 10 Step 1
ActiveSheet.Cells(Fila, Columna) = n
Fila = Fila + 1
Next n
End Sub
3. El mismo cdigo pero que inicie en dos termine en 20 y cuente de 2
en 2
Dim Fila As Integer

4.
5.

6.
7.

Dim Columna As Integer


Dim n As Integer
Fila = 1
Columna = 1
For n = 2 To 20 Step 2
ActiveSheet.Cells(Fila, Columna) = n
Fila = Fila + 1
Next n
End Sub
Con unos datos de meses y ventas se le debe decir al programa que
coloque en fondo amarillo y fuente de color roja nmeros < x valor
Para esto hacemos una macro que saca el color de la celda y fuente y
eso la copiamos y pegamos en el cdigo para que saque los valores
menores
En macro le damos a modificar y copiamos el cdigo que nos sirve
desde el with hasta el end with lo pegamos debajo del activesheet
El nuevo cdigo queda asi
Private Sub CommandButton2_Click()
Dim Fila As Integer
Dim Columna As Integer
Columna = 8
For Fila = 2 To 13 Step 1
If ActiveSheet.Cells(Fila, Columna).Value < 3200 Then
ActiveSheet.Cells(Fila, Columna).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
End If
Next Fila
End Sub

Formularios
Video 4 (Formulario Cliente)
1. Un formulario es una ventana que se programa por medio de
controles los cuales responden a procesos que programamos
2. En la pestaa desarrollador editor de VB insertar userForm
3. Cambiamos el Name por frmCliente
4. Cambiamos caption o ttulo por Registro de clientes
5. Agregamos dos etiquetas con caption nombre y telfono les
colocamos la propiedad autosize en true y las seleccionamos y las
alineamos a la derecha colocamos los dos cuadro de texto y les
cambiamos nombre con prefijo txt y agregamos los botones de
comando con caption registrar y finalizar y el name de estos
controles con el prefijo btn

6. En la hoja de clculo hacemos los encabezados de donde van a


quedar registrados los registros
7. El cdigo para el botn registrar es el siguiente
Private Sub btnRegistrar_Click()
ActiveSheet.Cells(2, 1).Select //mandar el cursor a la celda
correspondiente en este caso la B1
Selection.EntireRow.Insert // inserte una fila completa donde se
encuentra el cursor
// cada caa de texto donde esta la informacin la coloque en las
celdas indicadas
ActiveSheet.Cells(2, 1) = txtNombre
ActiveSheet.Cells(2, 2) = txtTelefono
txtNombre = Empty
txtTelefono = Empty
txtNombre.SetFocus
Ordenar
End Sub
8. Hacer macro para que me organice registro alfabticamente
grabamos macro le colocamos nombre ordenar aceptar nos vamos al
botn ordenar de A a Z y detenerla en el cdigo del formulario
hacemos el llamado del formulario debajo de la lnea que da focus
solo colocamos nombre de la macro que en este caso es ordenar
9. El botn de finalizar solo colocamos
End
10.En la carpeta mdulos en modulo2 es donde se han gramado las dos
macros que se hicieron
11.En modulo1 colocamos el siguiente cdigo para cargar el formulario
este cdigo se le asigna a un botn que estar en la hoja de calculo
Sub Agregar() // esta es una macro
Load frmCliente
frmCliente.Show
End Sub
12.Vamos a la hoja de calculo agregamos auto forma le colocamos de
nombre registro de clientes clic derecho asignarMacro agregar

Creando una funcin


Video 5 y 6 (Creando funcin)
1. En VBA insertamos un modulo
Function Ejemplo(n As Integer) As Integer
Ejemplo = n * 4
End Function
La variable n representa cualquier celda que tiene un numero el cual
ser multiplicado por 4
2. Hacemos otra funcin que nos evalu un nmero y se coloca como
condicin que se coloca es que si el numero >= 1000 devuelva una
cadena de texto que diga cantidad grande y de lo contrario dira
cadena pequea
Function nEvaluar(j As Integer) As String
nEvaluar = IIf(j >= 1000, "Cantidad grande", "Cantidad pequea")

End Function
El iif con doble i es xq es una sola lnea de cdigo
3. Si queremos variables booleanas si es verdadero que lo coloque en
mayscula y si es falso en minuscula adicionamos esto al cdigo
Function nEvaluar(j As Integer, Optional Mayusculas As Boolean) As
String
nEvaluar = IIf(j >= 1000, "Cantidad grande", "Cantidad pequea")
nEvaluar = IIf(Mayusculas, UCase(nEvaluar), nEvaluar)
End Function

Convertir de nmeros a letras


vIdeo 7, 8, 9 y 10 (Creando funcin)
1. Para hacer una funcin que convierta nmeros a letras hacemos lo
siguiente ( num de 0 a 999)
Function cNumero(num As Integer) As String
Function cNumero(num As Integer) As String
Dim Texto As String
Dim cunidades, cDecenas, cCentenas
Dim nUnidades, nDecenas, nCentenas As Byte
unidades = Array("", "Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis",
"Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce",
"Quince", "Diesiseis", "Diesisiete", "Diesiocho", "Diesinueve", "Veinte",
"Ventiuno", "Ventidos", "Ventitres", "Venticuatro", "Venticinco",
"Ventiseis", "Ventisiete", "Ventiocho", "Ventinueve")
cDecenas = Array("", "Diez", "Veinte", "Treinta", "Cuarenta",
"Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa", "Cien")
cCentenas = Array("", "Ciento", "Dosientos", "Tresientos",
"Cuatrosientos", "Quinientos", "Seisientos", "Setecientos",
"Ochosientos", "Novesientos")
nCentenas = num \ 100 '\100 para que saque solo numero entero
sin decimales
nDecenas = (num \ 10) Mod 10 'mod 10 para que saque las
centenas de un numero sin decimales solo el entero
nUnidades = num Mod 10
'Evaluacion desde 0 hasta 999
If nCentenas <> 0 Then
Texto = cCentenas(nCentenas)
End If
If nDecenas <> 0 Then
If nDecenas = 1 Or nDecenas = 2 Then
If nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + unidades(num Mod 100)
cNumero = Texto

Exit Function
Else
If nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + cDecenas(nDecenas)
End If
End If
If nUnidades <> 0 Then
If nDecenas <> 0 Then
Texto = Texto + " y "
ElseIf nCentenas <> 0 Then
Texto = Texto + " "
End If
Texto = Texto + unidades(nUnidades)
End If
cNumero = Texto
End Function
2. Si se quiere agregar los miles y millones agregar estas dos variables
Dim nMiles As Long
Dim nMillones As Long
3. cNumero cambia de Integer a Long
4. Esta parte sufre unas modificaciones quedando asi
nMillones = num \ 1000000
nMiles = (num \ 1000) Mod 1000
nCentenas = (num \ 100) Mod 10 '\100 para que saque solo
numero entero sin decimales
nDecenas = (num \ 10) Mod 10 'mod 10 para que saque las
centenas de un numero sin decimales solo el entero
nUnidades = num Mod 10
5. Para evaluar miles y millones
' Evaluacion de milones
If nMillones = 1 Then
Texto = "Un Millon" + IIf(num Mod 1000000 <> 0, " " +
cNumero(num Mod 1000000), " ")
cNumero = Texto
Exit Function
ElseIf nMillones >= 2 And nMiles <= 999 Then
Texto = cNumero(num \ 1000000) + " Millones" + IIf(num Mod
1000000 <> 0, " " + cNumero(num Mod 1000000), "")
cNumero = Texto
Exit Function
' Evaluacion de miles
ElseIf nMiles = 1 Then
Texto = "Mil" + IIf (num Mod 1000 <> 0, " " + cNumero (num
Mod 1000), " ")
cNumero = Texto
Exit Function
ElseIf nMiles >= 2 And nMiles <= 999 Then

Texto = cNumero (num \ 1000) + " Mil" + IIf (num Mod 1000
<> 0, " " + cNumero (num Mod 1000), "")
cNumero = Texto
Exit Function
End If
6. Le vamos agregar la denominacin en moneda para eso creamos otra
funcin
7. A la funcin numero la primera parte le agregamos vial quedando asi
Function cNumero(ByVal num As Long) As String
8. Para que diga por ejemplo un peso o un dlar en unidades
cambiamos uno por un
9. La funcin nMoneda queda asi
Function cMoneda(num As Double) As String
Dim nEntero As Long
Dim nDecimal As Double
Dim Texto As String
nEntero = Int(num)
nDecimal = (num - nEntero) * 100
Texto = cNumero(nEntero)
' Agrega la moneda
If nEntero = 1 Then
Texto = Texto + " Dolar"
Else
If (nEntero Mod 1000000) = 0 Then
Texto = Texto + " De"
End If
Texto = Texto + " Dlares"
End If
' Agrega los centavos
If nDecimal <> 0 Then
Texto = Texto + " Con " + cNumero(nDecimal)
If nDecimal = 1 Then
Texto = Texto + " Centavo"
Else
Texto = Texto + " Centavos"
End If
End If
cMoneda = Texto
End Function
10.Cambio para que aparezca cero en ejercicio conv num a letras en la
parte agregar centavos el cdigo queda asi y si no se quiere
representar monedas la palabra dlar y dlares se quita y solo se deja
esa parte solo las
' Agrega los centavos
If nDecimal <> 0 Then

If nDecimal <= 9 Then


Texto = Texto + " Con cero " + cNumero(nDecimal)
Else
Texto = Texto + " Con " + cNumero(nDecimal)
End If
End If
cMoneda = Texto
End Function

ComboBox en Formulario
Video 11 (Formulario Clientes y cargos)
1. Vamos agregarle un combobox al formulario que creamos antes y una
etiqueta con el nombre de cargo
2. Para agregarle el listado de datos al combobox en una hoja nueva
colocamos los datos que estarn en ese combobox
3. Despus de hacer la lista la seleccionamos y le colocamos un nombre
descriptivo
4. En las propiedades del combobox en rowSource colocamos el nombre
del listado en este caso cargos
5. En el cdigo del botn registrar adicionamos esto
ActiveSheet.Cells(2, 3) = cmbCargos
cmbCargos = Empty
6. Adicionamos en la hoja donde saldran los datos la columna cargos
Cuando tenemos la funcin buscarV y por alguna razn sale el error
N/A para evistar que ese error salga es solo adicionar al principio de
la funcin
Si(celda=,,BUSCARV(FUNCION BUSCAR))

Reporte con un formulario


Video 12 (Ejercicio)
1. Con el archivo descargado colocarle la celda E3 el nombre de
CODIGO, la site seria NOMBRE, la otra ID y la otra PROMEDIO
2. ctl + shif + flecha hacia abajo para seleccionar todo el conjunto de
celdas que llamaremos listado desde d8: d23 hasta i8:i23 y para que
seleccione todo hasta abjo ctl + shif + flecha abajo
3. Iniciamos con la funcin de BUSCARV para celda E4, E5, E6
4. Para la celda E4 colocariamos la siguiente funcin
=SI(ESERROR(BUSCARV(CODIGO;LISTADO;2;FALSO));"Valor
indeterminado";BUSCARV(CODIGO;LISTADO;2;FALSO))
5. Para la celda E5
=SI(ESERROR(BUSCARV(CODIGO;LISTADO;3;FALSO));"Valor
indeterminado";BUSCARV(CODIGO;LISTADO;3;FALSO))
6. Para la celda E6
=SI(ESERROR(BUSCARV(CODIGO;LISTADO;6;FALSO));"Valor
indeterminado";BUSCARV(CODIGO;LISTADO;6;FALSO))

7. Para hacer el filtrado vamos al entorno de trabajo de VBA en la


primera opcin cogemos workSheet y la otra opcin Change
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("CODIGO")) Is Nothing Then
If WorksheetFunction.IsNumber(Range("CODIGO").Value) Then
ActiveSheet.Range("Tabla1").AutoFilter Field:=2,
Criteria1:="=*" & Range("NOMBRE") & "*"
Else
ActiveSheet.Range("Tabla1").AutoFilter Field:=2,
Criteria1:="=*" & Range("CODIGO") & "*"
End If
End If
End Sub
Se coloca tabla1 que es el nombre que le da Excel automticamente
a rango de celdas que ya tiene datos, field 2 es el campo que se va a
filtrar que es el de nombres
Criteria1:="=*" con esto se quiere decir que al colocar cualquier letra
lo filtre
Range("CODIGO") se refiere a la celda donde vamos a digitar el
registro que se va a filtrar
& "*" esto sirve para hacer una bsqueda profunda
8. Para fotografa se hace con un control Activex insertamos ee control
de imagen
9. Cogemos una celda al azar de la hoja de calculo y le colocamos de
nombre MIFOTO que en estr caso es la K1 y la K2 la llamamos SIN
FOTO
10.El control que colocamos le ponems de nombre fotografa
11.Antes de else colocar esto
FOTO = Range("miFoto") & Range("CODIGO").Text & ".jpg"
fotografia.Picture = LoadPicture(FOTO)
12.Despues del else y de la lnea que ya esta colocamos esto
NOFOTO = Range("sinFoto").Text
fotografia.Picture = LoadPicture(NOFOTO)
13.En las celdas que llamamos mifoto colocamos la ruta de esta asi
C:\Users\Diana\Desktop\fotos\
14.Y en la llamada no foto colocamos
C:\Users\Diana\Desktop\fotos\0000.jpg
15.Esta columna K se puede ocultar

Exportar datos a Word


Video 13
1. Hacemos el formulario
2. En hmientas referecias Ms Word object lybrary

3. Codigo botn procesar


Private Sub btnProcesar_Click()
'Crear nuevo objeto de aplicacin word
Dim AppWord As Word.Application
Set AppWord = New Word.Application
'En donde nosotros seleccionamos rango a copiar
Range(txtRango).Copy
With AppWord
.Visible = True
.Activate
End With
'Creando un documento en word
AppWord.Documents.Add
'Pegar celdas de excel
AppWord.Selection.PasteAndFormat wdFormatOriginalFormatting
AppWord.Selection.WholeStory
AppWord.ActiveDocument.SaveAs ("c:\Prueba.docx")
'Liberar objeto word
Set AppWord = Nothing
End Sub
4. Codigo de disparar ventana el cual lo ponemos en un nuevo modulo
Sub Ventana()
Load frmExportar
frmExportar.Show
End Sub
5. Agregar un botn en la cinta de opciones de Word clic derecho
personalizar cinta de opciones nueva pestaa que le colocamos de
nombre exportar datos y al grupo le colocamos Excel a Word y en la
ventana disponible en: colocamos macro y arrastramos la que se creo
que en este caso es ventana y agregar
6. PROBAR

Integrar macros en complemento


Video 14
1. Cuando quieres utilizar una macro o funcin creada en un libro de
Excel en otro lo que se hace es guardar un libro como complemento y
ya salen todas las funciones y macros creadas en el otro eso si en la
ficha complemento en un libro normal lo seleccionamos para que
cargue todo lo que se ha creado

Formulario avanzado agregar, modificar, eliminar y


fotografa
Video 15 (Clientes)

1. En la hoja de calculo se insertan registros por filas


2. Como tiene encabezado se programa que empiece a leer desde fila 2
3. Se crea un modulo donde se copia esto
Option Explicit
'carga formulario, nos ubicamos en hoja clientes y que la muestre y
que muestr formulario
Sub registrar()
Load frmClientes
Sheets("Clientes").Activate
frmClientes.Show
End Sub
Function nCliente(nombre As String) As Integer
Application.ScreenUpdating = False 'desabilita la actualizacin en
pantalla
Sheet("Clientes").Activate
Range("A2").Activate 'desde aqui empieza a leer los registos
nCliente = 0 'quiero decir que dicho cliente no existe
'mientras celda activa no este vacia o halla un registro
Do While Not IsEmpty(ActiveCell)
If nombre = ActiveCell Then
nCliente = ActiveCell.Row
End If
ActiveCell.Offset(1, 0).Select 'interesa que se desplace hacia abajo
Loop
aplication.ScreenUpdating = True 'activa actualizacion en pantalla
End Function
4. Doble clic en el combobox se copia esto
Private Sub cmbNombre_Change()
On Error Resume Next
If nCliente(cmbNombre.Text) <> 0 Then
Sheets("Clientes").Activate
Cells(cmbNombre.ListIndex + 2, 1).Select
txtDireccion = ActiveCell.Offset(0, 1)
txtTelefono = ActiveCell.Offset(0, 2)
txtID = ActiveCell.Offset(0, 3)
txtEmail = ActiveCell.Offset(0, 4)
fotografia.Picture = LoadPicture("")
fotografia.Picture = LoadPicture(ActiveCell.Offset(0, 5))
ArchivoIMG = ActiveCell.Offset(0, 5)
Else
txtDireccion = ""
txtTelefono = ""
txtID = ""
txtEmail = ""
ArchivoIMG = ""
fotografia.Picture = LoadPicture("")
End If

End Sub
5. El evento enter del combobox es esto
Private Sub cmbNombre_Enter()
CargarLista
End Sub
6. El evento que se llamo en el enter del combobox cargar lista tiene lo
siguiente
Sub CargarLista()
cmbNombre.Clear
Sheets("Clientes").Select
Range("A2").Select
Do While Not IsEmpty(ActiveCell)
cmbNombre.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
loop
End Sub
7. Metodo de limpiarFormulario
Sub LimpiarFormulario()
CargarLista
txtDireccion = ""
txtTelefono = ""
txtID = ""
txtEmail = ""
ArchivoIMG = ""
fotografia.Picture = LoadPicture("")
End Sub
8. Todo el cdigo completo
Option Explicit
Dim validar As String
Dim ArchivoIMG As String
Private Sub btnFinalizar_Click()
End
End Sub
Private Sub btnAgregarImagen_Click()
On Error Resume Next
ArchivoIMG = Application.GetOpenFilename("Imgenes
jpg,*.jpg,Imgenes bmp,*.bmp", 0, "Seleccionar Imgen para
Reegistro de Clientes")
fotografia.Picture = LoadPicture("")
fotografia.Picture = LoadPicture(ArchivoIMG)
End Sub
Private Sub btnAgregarModificar_Click()
Dim i As Integer
If cmbNombre.Text = "" Then
MsgBox "Debe ingresar un nombre", vbInformation + vbOKOnly
cmbNombre.SetFocus
Exit Sub
End If

If txtDireccion.Text = "" Then


MsgBox "Debe ingresar una direccin", vbInformation +
vbOKOnly
txtDireccion.SetFocus
Exit Sub
End If
If txtTelefono.Text = "" Then
MsgBox "Debe ingresar un nmero de tlefono", vbInformation +
vbOKOnly
txtTelefono.SetFocus
Exit Sub
End If
'Valida que la informacin ingresada en el campo de telefono sean
numerica
validar = IsNumeric(txtTelefono.value)
If validar = False Then
MsgBox "Debes ingresar un valor numerico", vbInformation +
vbOKOnly
txtTelefono = ""
txtTelefono.SetFocus
Exit Sub
End If
If txtID.Text = "" Then
MsgBox "Debe ingresar un ID", vbInformation + vbOKOnly
txtID.SetFocus
Exit Sub
End If
If txtEmail.Text = "" Then
MsgBox "Debe ingresar un correo electronico", vbInformation +
vbOKOnly
txtEmail.SetFocus
Exit Sub
End If
'verifica si un correo es valido con ayuda de la funcion
IsValidEmail creada en modulo2
If IsValidEmail(txtEmail) Then
'mail stuff here
Else
MsgBox "Ingrese un correo valido", vbInformation + vbOKOnly
txtEmail = ""
txtEmail.SetFocus
Exit Sub
End If
If Not (Mid(cmbNombre.Text, 1, 1) Like "[a-z]" Or
Mid(cmbNombre.Text, 1, 1) Like "[A-Z]") Then
MsgBox "Nombre invlido", vbInformation + vbOKOnly

cmbNombre.SetFocus
Exit Sub
End If
For i = 2 To Len(cmbNombre.Text)
If Mid(cmbNombre.Text, i, 1) Like "#" Then
MsgBox "Nombre invlido", vbInformation + vbOKOnly
cmbNombre.SetFocus
Exit Sub
End If
Next
Sheets("Clientes").Activate
Dim fCliente As Integer
fCliente = nCliente(cmbNombre.Text)
If fCliente = 0 Then
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate ' si el registro no existe, se va
al final.
Loop
Else
Cells(fCliente, 1).Select ' cuando ya existe el registro, cumple
esta condicin.
End If
'Aqui es cuando agregamos o modificamos el registro
Application.ScreenUpdating = False
ActiveCell = cmbNombre
ActiveCell.Offset(0, 1) = txtDireccion 'offset es el numero de
espacios que se esta dezplazando 1er num hacia abajo y 2do num
hacia der
ActiveCell.Offset(0, 2) = txtTelefono
ActiveCell.Offset(0, 3) = txtID
ActiveCell.Offset(0, 4) = txtEmail
ActiveCell.Offset(0, 5) = ArchivoIMG
Application.ScreenUpdating = True
LimpiarFormulario
cmbNombre.SetFocus
End Sub
Private Sub btnCerrar_Click()
End
End Sub
Private Sub btnEliminar_Click()
Dim fCliente As Integer
fCliente = nCliente(cmbNombre.Text)
If fCliente = 0 Then
MsgBox "El cliente que usted quiere eliminar no existe",
vbInformation + vbOKOnly

cmbNombre.SetFocus
Exit Sub
End If
If MsgBox("Seguro que quiere eliminar este cliente?", vbQuestion
+ vbYesNo) = vbYes Then
Cells(fCliente, 1).Select
ActiveCell.EntireRow.Delete
LimpiarFormulario
MsgBox "Cliente eliminado", vbInformation + vbOKOnly
cmbNombre.SetFocus
End If
End Sub
Private Sub cmbNombre_Change()
On Error Resume Next
If nCliente(cmbNombre.Text) <> 0 Then
Sheets("Clientes").Activate
Cells(cmbNombre.ListIndex + 2, 1).Select
txtDireccion = ActiveCell.Offset(0, 1)
txtTelefono = ActiveCell.Offset(0, 2)
txtID = ActiveCell.Offset(0, 3)
txtEmail = ActiveCell.Offset(0, 4)
fotografia.Picture = LoadPicture("")
fotografia.Picture = LoadPicture(ActiveCell.Offset(0, 5))
ArchivoIMG = ActiveCell.Offset(0, 5)
Else
txtDireccion = ""
txtTelefono = ""
txtID = ""
txtEmail = ""
ArchivoIMG = ""
fotografia.Picture = LoadPicture("")
End If
End Sub
Private Sub cmbNombre_Enter()
CargarLista
End Sub
Sub CargarLista()
cmbNombre.Clear
Sheets("Clientes").Select
Range("A2").Select
Do While Not IsEmpty(ActiveCell)

cmbNombre.AddItem ActiveCell.value
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Sub LimpiarFormulario()
CargarLista
txtDireccion = ""
txtTelefono = ""
txtID = ""
txtEmail = ""
ArchivoIMG = ""
End Sub
Private Sub fotografia_Click()
On Error Resume Next
ArchivoIMG = Application.GetOpenFilename("Imgenes jpg,*.jpg,
Imagenes bmp, *bmp.bmp", 0, "Seleccionar imagen para registro de
clientes")
fotografia.Picture = LoadPicture("")
fotografia.Picture = LoadPicture(ArchivoIMG)
End Sub
9. Las funciones creadas en mdulos
Option Explicit
'carga formulario, nos ubicamos en hoja clientes y que la muestre y
que muestr formulario
Sub registrar()
Load frmClientes
Sheets("Clientes").Activate
frmClientes.Show
End Sub
Function nCliente(nombre As String) As Integer
Application.ScreenUpdating = False 'desabilita la actualizacin en
pantalla
Sheets("Clientes").Activate
Range("A2").Activate 'desde aqui empieza a leer los registos
nCliente = 0 'quiero decir que dicho cliente no existe
'mientras celda activa no este vacia o halla un registro
Do While Not IsEmpty(ActiveCell)
If nombre = ActiveCell Then
nCliente = ActiveCell.Row
End If
ActiveCell.Offset(1, 0).Select 'interesa que se desplace hacia abajo
Loop
Application.ScreenUpdating = True 'activa actualizacion en pantalla
End Function
Function IsValidEmail(value As String) As Boolean
Dim RE As Object
Set RE = CreateObject("vbscript.RegExp")
RE.Pattern = "^[a-zA-Z0-9\._-]+@([a-zA-Z0-9_-]+\.)+([a-zA-Z]{2,3})$"
IsValidEmail = RE.Test(value)
Set RE = Nothing

End Function

ComboBox mas InputBox


Video 16 (ComboBoxInputBox)
1. Insertamos un combobox desde la hoja de calculo y 3 botones
2. Botn para agregar tem
Private Sub btnAgregar_Click()
i = InputBox("Agregar item")
If Len(i) > 0 Then
Hoja10.ComboBox1.AddItem (i)
Else
MsgBox ("Usted no ha ingresado ningn item")
End If
End Sub
3. Botn limpiar
Private Sub btnLimpiar_Click()
Hoja10.ComboBox1.Clear
End Sub
4. Botn seleccionar
i = InputBox("Que item desea seleccionar. Ingrese su nmero de
posicin")
On Error Resume Next
Hoja10.ComboBox1.ListIndex = i
End Sub

Eliminar filas duplicadas


Video 17 (modulo eliminar fila duplicada) Hoja ventas
1. Insertamos un nuevo modulo para crear macro y copiamos esto
Sub EliminarFilaDuplicada()
Dim Fila As Long
With Application
'Busque en las filas de 1 en 1 si hay repetidas y con xlUp se
devuelve de abajo - arriba
For Fila = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If WorksheetFunction.CountIf(Range("A:A"), Cells(Fila, 1)) >
1 Then Cells(Fila, 1).EntireRow.Delete
Next Fila
End With
End Sub

Responder preguntas formularios


Video 18 (Formulario cliente y cargos)
1. Con relacin al formulario de nombre y telfono si quiero que solo
se agreguen valores numricos en el campo telfono lo coloco asi
ActiveSheet.Cells(2, 2) = val(txtTelefono)

2. Para que un combobox tome fecha se da clic en el combobox y se


copia lo siguiente,
cmbFecha = Format(cmbFecha, "dd/mm/yyyy")

Ventana de login con InputBox y userForm


Video 19 (Ocultar hojas)
1. Ocultar hojas de clculo mediante codigo
2. Si yo quiero hacer un botn de input con un login entonces en un
modulo. Se declara una variable de nombre hoja que es de tipo objeto
worksheet que se refiere a la hoja de trabajo. Luego el pass lo
igualamos al InputBox y le colocamos el mensaje de ingrese
contrasea y con titulo autentificacin de usuario. Colocamos la
condicin de que si el pass el diferente a uno establecido que coloque
mensaje de error. En el xlSheetVisible sirve para mostrar las hojas
pero hay otras opciones el xlSheetHidden que oculta hojas de calculo
pero con solo dar clic derecho en la hoja no oculta ya aparece
habilitado la opcin para mostrar las hojas y no seria tan seguro.
xlSheetVeryHidden desabilita ese botn de la posibilidad de
mostrarlas
Sub CheckPass()
Dim Hoja As Worksheet
Pass = InputBox("Ingrese su Contrasea: ", "Autenticacin de
Uusario")
If Pass <> "1234" Then GoTo WrongPass
MsgBox ("Bienvenido Otto...")
For Each Hoja In Worksheets
Hoja.Visible = xlSheetVisible
Next Hoja
Exit Sub
WrongPass:
MsgBox "Lo siento. Slamente Otto Gonzlez puede acceder aqu."
End Sub
3. En el evento clic del botn colocamos esto
CheckPass
4. En modulo el codigo de ocultar hoja
Sub OcultarHojas()
Dim Hoja As Worksheet
For Each Hoja In Worksheets
If Hoja.CodeName <> "Hoja12" Then
Hoja.Visible = xlSheetVeryHidden
End If
Next Hoja
End Sub

El nmero de hoja depende de la que se quiera dejar sin ocultar en este


caso es la 12
5. El codigo para el botn seria primero que todo para que aparezca
oculto en la propiedad passwordChar del textBox vamos a la colocarle
*
6. El codigo del botn ingresar es elte
Private Sub btnIngresar_Click()
Dim Hoja As Worksheet
If txtContrasea <> "1234" Then GoTo WrongPass
Unload Me
MsgBox ("Bienvenida Diana...")
For Each Hoja In Worksheets
Hoja.Visible = xlSheetVisible
Next Hoja
Exit Sub
WrongPass:
Unload Me
MsgBox "Contrasea incorrecta."
End Sub
7. En el evento clic del botn login del formulario copiamos este codigo
MostrarForm
8. El codigo del evento mostrarForm se mostrara en modulo tendr esto
Sub MostrarForm()
Load frmLogin
frmLogin.Show
End Sub

Programando una alarma


Video 20 (Alarma)
1. El primer procedimiento que se llamaprogramar alarma se establece
la hora en la que nosotros deseamos que se ejecute la alarma
Sub ProgramarAlarma()
Application.OnTime TimeValue("7:45:00 p.m."), "EjecutarAlarma"
End Sub
2. El siguiente procedimiento es la ejecucin del alarma
Sub EjecutarAlarma()
Application.Speech.Speak ("Es tiempo de hacer trabajo de grado")
MsgBox "Es tiempo de hacer trabajo de grado"
End Sub
3. En la hoja de calculo colocamos la hora y un botn de formulario le
asignamos la macro programar alarma y le cambiamos el nombre a
programar alarma
4. En el evento programarAlarma agregamos estas lneas de codigo
Dim SetTime As String
SetTime = Hoja13.Range("A1") .Text
y cambiaramos la hora ente parentesis de la siguiente lnea de
codigo por el nombre de la varible que hemos creado que en este

caso es ProgramarHora y antes de end sub un mensaje que diga


MsgBox "Alarma programada"
5. En tipo de celda colocar personalizada y elegir la de h:mm:ss am pm
para que no salga error
6. Como opcional para hacer mas funcional la alarma
' Tendrn que seleccionar slamente UNA de las tres opciones
Application.OnTime TimeValue(SetTime), "EjecutarAlarma"
' Application.OnTime DateValue("12/31/2013 5:00 pm"),
"EjecutarAlarma" ' Establecer una fecha y hora especfica
' Application.OnTime Now + TimeValue("00:20:00"),
"EjecutarAlarma"
' Establecer un lapso de minutos, partiendo de
una hora determinada.
' Est prearada para
ejecutarse dentro de 20 minutos, partiendo de cualquiera hora en su
reloj

Listar archivos desde una carpeta a Excel


Video 21 (Listar Archivos)
1. Copiar la ruta de la carpeta de los archivos a listar en la celda
correspondiente en Excel
2. Se crean dos variables string y dos enteras. Archivos se encarga de
identificar los archivos que estn contenidos en una carpeta, y la
variable carpeta se encarga de establecer la ubicacin de donde listar
esos archivos. La variable fila se encarga de manejar las filas, la
posicin en las hojas de clculo y de igual forma la variable columna
3. Si no hay informacin en la celda c1 (en este caso la celda elegida
para colocar la ruta) que el proceso termine
Sub Listar_archivos()
Dim Archivos, Carpeta As String
Dim Fila, Columna As Integer
Carpeta = Hoja14.Range("C1").Text
If Carpeta = "" Then
Exit Sub
Else
If Right(Carpeta, 1) <> "\" Then '1 es porque lo unico que se
agrega es \ al final de la ruta
Carpeta = Carpeta & "\"
End If
End If
Fila = 1 'comienza listado desde fila 1
Columna = 1 'comienza listado desde columna 1
Archivos = Dir(Carpeta) 'establece comando dir
Do While Len(Archivos) > 0 'si no existen archivos dentro de la
carpeta no realice el bucle
Cells(Fila, Columna).value = Archivos
Archivos = Dir()

Fila = Fila + 1
Loop
End Sub

Gestor de inventarios parte 1-6


Video 22, 23, 24, 25, 26 y 27 (Principal, productos, entradas, salidas,
existencias)
Instruccin for Next
Validacin contra registros repetidos
Formulario para registrar
Formulario para modificar
Formulario entradas de existencias
Formulario de salida de existencias
1. Insertamos un nuevo modulo con un metodo llamado
registrarProductos
2. Creamos tres variables fila y final que sern entera y una llamada
datos que ser de tipo variant
3. En la hoja de calculo ingresar un botn que se vincula la macro de
registrar producto
4. La idea es pasar los datos de una celda a otra en este caso la celda
d1
Sub RegistrarProductos()
Dim fila As Integer 'controlo fila en la hoja de calculo
Dim final As Integer 'detectar el final donde se inserta el registro
Dim datos As Variant 'proporcionar la info para que quede en la
hoja de calculo
datos = Hoja15.Cells(1, 4) 'columna 4 porque el la D y fila 1
For fila = 1 To 1000 '1000 registros por que esta variable fila es
entera mas grande se puede cambiar a long
If Hoja15.Cells(fila, 1) = "" Then 'recorrer de 1 a 1000 en las
filas de la hoja en la columna 1 y si esta vacia
final = fila
Exit For
End If
Next
Hoja15.Cells(final, 1) = datos
End Sub
5. Para validar que no haya registros repetidos lo 1ro es adicionar esta
variable
Dim Registro As Integer
6. Utilizamos un bucle para hacer la validacin
For Registro = 1 To Final
If Hoja15.Cells(Registro, 1) = Datos Then
MsgBox "El registro ya existe"
Exit Sub
Exit For
End If
Next
7. Probar

8. Ahora creamos el formulario de entrada para los registros agrgamos


un useForm en el botn registrar llamamos la macro
Call RegistrarProductos
9. En el botn finalizar copiamos esto para cerrar formulario
Unload Me
10.En la hoja de calculo eliminamos los q hicimos al principio lo dejamos
a parte y abrimos otra hoja que llamamos principal y otra que se
llame producto
11.En principal se crea un botn con el cual se llama el formulario para
registrar pto
12.En ptos los encabezados para entrar los registros
13.En el evento clic del botn registrar copiamos esto
Sub Registrar_Productos()
Dim Fila As Integer 'controlo fila en la hoja de calculo
Dim Final As Integer 'detectar el final donde se inserta el registro
Dim Registro As Integer
For Fila = 1 To 1000 '1000 registros por que esta variable fila es
entera mas grande se puede cambiar a long
If Hoja17.Cells(Fila, 1) = "" Then 'recorrer de 1 a 1000 en las
filas de la hoja en la columna 1 y si esta vacia
Final = Fila
Exit For
End If
Next
For Registro = 2 To Final 'debido a que se tiene un encabezado
If Hoja17.Cells(Registro, 1) = Me.txtCodigoProducto Then
MsgBox "El registro ya existe" + Chr(13) + "Ingrese un
cdigo diferente"
Me.txtCodigoProducto.SetFocus
Exit Sub
Exit For
End If
Next
If MsgBox("Son correctos los datos?" + Chr(13) + "Desea proceder?",
vbOKCancel) = vbOK Then
Hoja17.Cells(Final, 1) = Me.txtCodigoProducto
Hoja17.Cells(Final, 2) = Me.txtNombre
Hoja17.Cells(Final, 3) = Me.txtDescripcion
Me.txtCodigoProducto = ""
Me.txtNombre = ""
Me.txtDescripcion = ""
Me.txtCodigoProducto.SetFocus
Else
Exit Sub
End If
End Sub

14.Para modificar se necesitara otro formulario que en este caso se hace


independiente es prcticamente igual al 1ro solo cambia en que en
vez de un textbox se usa combobox para el codigo del pto
15.El combobox en su evento change queda con el siguiente codigo
Private Sub cmbCodigoProducto_Change()
Dim Fila As Integer
Dim Final As Integer
If cmbCodigoProducto.value = "" Then
Me.txtNombre = ""
Me.txtDescripcion = ""
End If
For Fila = 2 To 1000 'debido a que se tiene un encabezado
If Hoja17.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
For Fila = 2 To Final 'debido a que se tiene un encabezado
If Me.cmbCodigoProducto = Hoja17.Cells(Fila, 1) Then
Hoja17.Cell(Fila, 2) = Me.txtNombre
Hoja17.Cell(Fila, 3) = Me.txtDescripcion
Final = Fila - 1
Exit For
End If
Next
End Sub
16.Para el evento enter que lo que se hace es adicionar el listado de
cdigos de ptos en el combobox queda asi
Private Sub cmbCodigoProducto_Enter()
Dim Fila As Integer
Dim Final As Integer
Dim Lista As String
' Este evento es para que aparezcan los codigos de ptos en el
comboBox
For Fila = 1 To cmbCodigoProducto.ListCount
cmbCodigoProducto.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" Then
Final = Fila - 1 ' No se necesita la ultima celda que sale en
blanco para agregar ya que este modifica
Exit For
End If
Next
For Fila = 2 To Final

Lista = Hoja17.Cells(Fila, 1)
cmbCodigoProducto.AddItem (Lista)
Next
End Sub
17.El clic del botn modificar quedara asi
Private Sub btnModificar_Click()
' reemplazar la informacion de un registro existente
Dim Fila As Integer 'controlo fila en la hoja de calculo
Dim Final As Integer 'detectar el final donde se inserta el registro
For Fila = 2 To 1000 'debido a que se tiene un encabezado
' envia informacion a 3 hojas de calculo
If Hoja17.Cells(Fila, 1) = "" And Hoja18.Cells(Fila, 1) = "" And
Hoja19.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
For Fila = 2 To Final 'debido a que se tiene un encabezado
If Me.cmbCodigoProducto = Hoja17.Cells(Fila, 1) Then
Hoja17.Cells(Fila, 2) = Me.txtNombre
Hoja17.Cells(Fila, 3) = Me.txtDescripcion
Exit For
End If
Next
' hacer modificacion del nombre en hoja18 (entradas) y
19(existencia) que es la unica modificacion que se hace ahi
For Fila = 2 To Final
If Me.cmbCodigoProducto = Hoja18.Cells(Fila, 1) Then
Hoja18.Cells(Fila, 2) = Me.txtNombre
End If
Next
For Fila = 2 To Final
If Me.cmbCodigoProducto = Hoja19.Cells(Fila, 1) Then
Hoja19.Cells(Fila, 2) = Me.txtNombre
Exit For
End If
Next
Me.cmbCodigoProducto = ""
Me.txtNombre = ""
Me.txtDescripcion = ""
End Sub
18.Si en el codigo de registrar pto se quiere colocar un fondo en color
para seleccionar un registro cuando se intente registrar y este ya
exista se debe seleccionar el textBox del formulario y en las
propiedades la de backColor colocarla en el color deseado para copiar
el codigo que aparece y luego regresarlo al original y en codigo
adicionar esto debajo del for del registro ya existe

Me.txtCodigoProducto.BackColor = &HC0C0FF y despus de la parte


de son correctos los datos para volverlo al color original
me.txtCodigoProducto = &H8000000F&
19.ESTE TRABAJA CON CINCO HOJAS DE CALCULO
PRINCIPAL: Se coloca un botn que se le asigna macro de tal forma
que al darle clic aparece un men para el gestor de inventarios donde
se tienen los botones de registrar productos, modificar productos
agrupados en una opcin llamada mantenimientos y se tiene el botn
de entradas y salidas agrupadas en lo que se llama movimientos
PRODUCTOS: esta la tabla para el formulario con las opciones de
codigo, nombre y descripcin
ENTRADAS: esta la tabla para el formulario con las opciones de
codigo, nombre, fecha de ingreso, num factura, provedor y cantidad
EXISTENCIA: esta la tabla para el formulario con las opciones de
codigo, nombre y existencia
SALIDA (Codigo aun no se ha hecho)
20.Lo primero es en principal hacer el botn gestor inventarios
insertando una foma luego hacer un modulo llamado gestor de
inventarios en donde se copie lo siguiente
Sub Menu_Principal()
frmMenu.Show
End Sub
Y posteriormente agregar esa macro al botn creado en la hoja de
calculo principal
21.En el formulario registrar pto agregar el siguiente codigo despus de
desea proceder y que nombre la hoja 17 con sus campos
Hoja19.Cells(Final, 1) = Me.txtCodigoProducto
Hoja19.Cells(Final, 2) = Me.txtNombre
Hoja19.Cells(Final, 3) = 0
22.En el formulario de modificar se agrego lo siguiente despus del 2do
for exactamente despus del next antes de colocar los campos vacios
(quitarlo arriba esta parte para no confundirse por un error que no
daba la parte de modificar nombre en todas las hojas copie y se pego
todo codigo arriba en donde sale codigo botn modificar)
' hacer modificacion del nombre en hoja18 (entradas) y
19(existencia) que es la unica modificacion que se hace ahi
For Fila = 2 To Final
If Me.cmbCodigoProducto = Hoja18.Cells(Fila, 1) Then
Hoja18.Cells(Fila, 2) = Me.txtNombre
End If
Next
For Fila = 2 To Final
If Me.cmbCodigoProducto = Hoja19.Cells(Fila, 1) Then
Hoja19.Cells(Fila, 2) = Me.txtNombre
Exit For
End If
Next

23.Y en el primer for en clic de modificar queda la primera lnea asi


If Hoja17.Cells(Fila, 1) = "" And Hoja18.Cells(Fila,1) = "" And
Hoja19.Cells(Fila,1) = "" Then
24.En los eventos clic del formulario de men se copia estas macros
Private Sub btnEntradas_Click()
frmEntradas.Show
End Sub
Private Sub btnModificarProductos_Click()
frnModificarProductos.Show
End Sub
Private Sub btnRegistrarProductos_Click()
frmRegistrarProducto.Show
End Sub
25.Para codigo del formulario entradas en el combobox quedaran asi
evento change
Private Sub cmbCodigoProducto_Change()
Dim Fila As Integer
Dim Final As Integer
If cmbCodigoProducto.value = "" Then
Me.txtNombre = ""
Me.txtDescripcion = ""
End If
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" And Hoja19.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
For Fila = 2 To Final
If cmbCodigoProducto = Hoja17.Cells(Fila, 1) Then
Me.txtNombre = Hoja17.Cells(Fila, 2)
Exit For
End If
Next
For Fila = 2 To Final
If cmbCodigoProducto = Hoja19.Cells(Fila, 1) Then
Me.txtNombre = Hoja19.Cells(Fila, 3)
Exit For
End If
Next
End Sub
26.El evento enter de este combobox es igual al del combobox del
formulario de modificar productos
Private Sub cmbCodigoProducto_Enter()
Dim Fila As Integer
Dim Final As Integer
Dim Lista As String

' Este evento es para que aparezcan los codigos de ptos en el


comboBox
For Fila = 1 To cmbCodigoProducto.ListCount
cmbCodigoProducto.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" Then
Final = Fila - 1 ' No se necesita la ultima celda que sale en
blanco para agregar ya que este modifica
Exit For
End If
Next
For Fila = 2 To Final
Lista = Hoja17.Cells(Fila, 1)
cmbCodigoProducto.AddItem (Lista)
Next
End Sub
27.El click del botn procesar queda asi
Private Sub btnProcesar_Click()
Dim Fila As Integer
Dim Final As Integer
Dim Existencia As Integer
Dim Total As Integer
'determinar listado para poder establecer cual es el final para saber
donde se inscribir los registros
For Fila = 2 To 1000
If Hoja18.Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next
' enviar informacion digitado en el formulario de entrada a la hoja de
calculo de entrada
Hoja18.Cells(Final, 1) = Me.cmbCodigoProducto
Hoja18.Cells(Final, 2) = Me.txtNombre
Hoja18.Cells(Final, 3) = Me.txtFechaIngreso
Hoja18.Cells(Final, 4) = Me.txtNumeroFactura
Hoja18.Cells(Final, 5) = Me.txtProveedor
Hoja18.Cells(Final, 6) = Me.txtCantidad
' Buscar la coincidencia de un registro que se encuentre en la hoja de
entrada con uno que se encuentre en la hoja de existencia
For Fila = 2 To 1000
If Hoja19.Cells(Fila, 1) = Hoja18.Cells(Final, 1) Then
Existencia = Hoja19.Cells(Fila, 3)
Total = Me.txtCantidad + Existencia
Hoja19.Cells(Fila, 3) = Total
Exit For
End If
Next

'limpiar cajas de texto al terminar de digitar informacion


Me.cmbCodigoProducto = ""
Me.txtNombre = ""
Me.txtFechaIngreso = ""
Me.txtNumeroFactura = ""
Me.txtProveedor = ""
Me.txtCantidad = ""
End Sub
28.Botn finalizar queda asi
Private Sub btnFinalizar_Click()
Unload Me
End Sub
29.Para hacer formularios de salidas este queda prcticamente igual al
de entrada con excepcin de dos eventos change el de change de
cantidadSalida para que se actualice el txtbox saldo y siempre se
sepa cuanto hay disponible y evitar cantidades negativas
Private Sub txtCantidadSalida_Change()
Dim Fila As Integer
Dim Final As Integer
Dim Registro As Integer
Dim Antes As Integer
Dim Ahora As Double
Dim Saldo As Double
For Fila = 1 To 1000
If Hoja19.Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next
For Registro = 1 To Final
If Val(cmbCodigoProducto) = Hoja19.Cells(Registro, 1) Then
Antes = Hoja19.Cells(Registro, 3) 'cantidad de existencia en la
hoja de calculo existencia
Ahora = Val(Me.txtCantidadSalida) 'cantidad de salida
Saldo = Antes - Ahora
Me.txtSaldo = Saldo
Exit For
End If
Next
End Sub
30.El evento change del textbox saldo que en la hoja de calculo no se
muestra solo valor para mostrar en formulario
Private Sub txtSaldo_Change()
If Me.txtCantidadSalida = "" Or Me.txtCantidadSalida = 0 Then
Ahora = 0
Me.txtCantidadSalida = ""
End If

End Sub
31.Codigo change del combobox es el mismo del de entradas
Private Sub cmbCodigoProducto_Change()
Dim Fila As Integer
Dim Final As Integer
'si comboBox esta en blanco nombre y descripcion tambien deben
estar en blanco
If cmbCodigoProducto.value = "" Then
Me.txtNombre = ""
Me.txtExistencia = ""
End If
'toma informacion de la hoja de ptos y de existencias
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" And Hoja19.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
'Tomar informacion del nombre que se encuentra en la hoja de pto
para colocarlo en el textBox de nombre del form de consultas
For Fila = 2 To Final
If cmbCodigoProducto = Hoja17.Cells(Fila, 1) Then
Me.txtNombre = Hoja17.Cells(Fila, 2)
Exit For
End If
Next
'toma informacion de la hoja19 la de existencias para asi mostrarlo
en la caja de texto de existencias
For Fila = 2 To Final
If cmbCodigoProducto = Hoja19.Cells(Fila, 1) Then
Me.txtExistencia = Hoja19.Cells(Fila, 3)
Exit For
End If
Next
End Sub
32.Codigo enter del combobox tambin es el mismo del formulario
entradas
Private Sub cmbCodigoProducto_Enter()
Dim Fila As Integer
Dim Final As Integer
Dim Lista As String
' Este evento es para que aparezcan los codigos de ptos en el
comboBox
For Fila = 1 To cmbCodigoProducto.ListCount
cmbCodigoProducto.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" Then

Final = Fila - 1 ' No se necesita la ultima celda que sale en


blanco para agregar ya que este modifica
Exit For
End If
Next
For Fila = 2 To Final
Lista = Hoja17.Cells(Fila, 1)
cmbCodigoProducto.AddItem (Lista)
Next
End Sub
33.Botn procesar es el mismo solo cambian los nombres de los textbox
y en vez de suma se resta para saber cuanto queda en existencia
Private Sub btnProcesar_Click()
Dim Fila As Integer
Dim Final As Integer
Dim Existencia As Integer
Dim Total As Integer
'determinar listado para poder establecer cual es el final para saber
donde se inscribir los registros
For Fila = 2 To 1000
If Hoja20.Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next
' enviar informacion digitado en el formulario de entrada a la hoja de
calculo de entrada
Hoja20.Cells(Final, 1) = Me.cmbCodigoProducto
Hoja20.Cells(Final, 2) = Me.txtNombre
Hoja20.Cells(Final, 3) = Me.txtFechaSalida
Hoja20.Cells(Final, 4) = Me.txtNumeroTransferencia
Hoja20.Cells(Final, 5) = Me.txtDestino
Hoja20.Cells(Final, 6) = Me.txtCantidadSalida
'Buscar la coincidencia de un registro que se encuentre en la hoja de
entrada con uno que se encuentre en la hoja de existencia
For Fila = 2 To 1000
If Hoja19.Cells(Fila, 1) = Hoja20.Cells(Final, 1) Then
Existencia = Hoja19.Cells(Fila, 3)
Total = Existencia - Me.txtCantidadSalida
Hoja19.Cells(Fila, 3) = Total
Exit For
End If
Next
'limpiar cajas de texto al terminar de digitar informacion
Me.cmbCodigoProducto = ""
Me.txtNombre = ""
Me.txtFechaSalida = ""
Me.txtNumeroTransferencia = ""
Me.txtDestino = ""

Me.txtCantidadSalida = ""
End Sub
34.Codigo del botn finalizar es el mismo
Private Sub btnFinalizar_Click()
Unload Me
End Sub
35.El codigo de producto en las hojas de texto se registra como texto y
no como numero para arreglar eso cambiamos unas cosas en la
mayor parte del codigo partiendo desde formulario registrar
productos es agregar la palabra val antes de todos los
me.txtCodigoProducto el cual queda entre parentesis, se aregla para
todo lo relacionado con el codigo de producto ya sea txt o cmb
36.Se agrego en el formulario modificar el codigo para que tambin
modifique nombre de producto en hoja de calculo de salidas
For Fila = 2 To Final
If Val(Me.cmbCodigoProducto) = Hoja20.Cells(Fila, 1) Then
Hoja20.Cells(Fila, 2) = Me.txtNombre
Exit For
End If
Next
37.Para que carque automticamente el formulario cuando se abra el
libro seleccionar this workbook que hace referencia al libro de trabajo
entero doble clic en la pantalla gris aparece general seleccionamos
workbook en el evento open colocar frmMenu.show (o el formulario
que quiere que se abra cuando abre documento)
38.En los textbox de fecha para no tener que colocar los slash se pone
un codigo que enmascara esa parte por lo que uno solo colocara los
nmeros tanto en el textbox de fecha de entrada como en de fecha
de salida se da doble clic en el evento keydown osea cuando se
presionan las teclas
Private Sub txtFechaSalida_KeyDown(ByVal KeyCode As
MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case Len(Me.txtFechaSalida) 'longitud informacion ingresada
en el textbox
Case 2 'caso de que sean 2 digitos o caracteres osea los dos nume
del dia
Me.txtFechaSalida = Me.txtFechaSalida + "/"
Case 5 ' 5 caracteres correspondientes a dos del dia mas el / mas
los dos del mes
Me.txtFechaSalida = Me.txtFechaSalida + "/"
End Select
End Sub
Private Sub txtFechaIngreso_KeyDown(ByVal KeyCode As
MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case Len(Me.txtFechaIngreso) 'longitud informacion ingresada
en el textbox

Case 2 'caso de que sean 2 digitos o caracteres osea los dos nume
del dia
Me.txtFechaIngreso = Me.txtFechaIngreso + "/"
Case 5 ' 5 caracteres correspondientes a dos del dia mas el / mas
los dos del mes
Me.txtFechaIngreso = Me.txtFechaIngreso + "/"
End Select
End Sub

Modificar libro desde otro libro


Video 28 (Agregar datos desde otro libro)
1. Enviar informacin desde un libro x hacia otro libro y estando
cerrado el libro y.
2. Abrimos libro y tenemos una tabla para agregar registros nombres y
apellidos para saber que tipo de informacin es la que se enva desde
el libro x, y es un libro simple sin macros ni nada
3. El libro x que en este caso es el de los ejercicios macros tiene el
codigo le agregamos una hoja donde al hacer clic en el botn
aparecer un formulario para agregar nombres y apellidos que se
agregaran al libro y en la tabla creada anteriormente
4. Formulario en el cual el botn guardar tiene el siguiente codigo
Private Sub btnGuardar_Click()
Dim objExcel As Application
Dim RutaArchivo As String
Dim Texto As String
Dim Fila As Integer
Dim Final As Integer
Dim Celda As Object
Texto = "Espere un momento... Procesando la informacin"
Application.StatusBar = Texto

Set objExcel = CreateObject("Excel.Application")


With objExcel
RutaArchivo = ThisWorkbook.Path & "\datos agregados desde
ejecicios macro.xlsx"
If IsFileOpen(RutaArchivo) Then
MsgBox "El libro debe estar cerrado para proceder."
Exit Sub
Else
'
With .Workbooks.Open(RutaArchivo)

For Fila = 2 To 1000


If .Worksheets("Hoja1").Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next
.Worksheets("Hoja1").Cells(Final, 1) = Me.txtNombres
.Worksheets("Hoja1").Cells(Final, 2) = Me.txtApellidos
.Close SaveChanges:=True
End With
End If
'
.Quit
End With
Call LiberarBarra
MsgBox "Informacin procesada con xito!"
Me.txtNombres = ""
Me.txtApellidos = ""
End Sub
5. Se crean dos modulos uno liberarBarra_MostrarForm
LiberarBarra es el que se llama en el botn guardar
Sub LiberarBarra()
Application.StatusBar = False
End Sub
Esta es la macro para agregarla al botn
Sub EnviarInfo()
frmEnviarInfo.Show
End Sub
6. Funcin de si esta archivo abierto
'codigo para comprobar si un archivo esta abierto
Function IsFileOpen(FileName As String)
Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
iFilenum = FreeFile()
Open FileName For Input Lock Read As #iFilenum
Close iFilenum
iErr = Err
On Error GoTo 0
Select Case iErr
Case 0: IsFileOpen = False
Case 70: IsFileOpen = True
Case Else: Error iErr
End Select

End Function

Gestor de inventarios parte 7-10


Video 29, 30, 31, 32 (Principal, productos, entradas, salidas, existencias,
devoluciones,comprobantes)
Formulario para eliminar
Formulario para devoluciones
Reporte para movimientos
1. Codigo para eliminar productos (algo que en la vida real no se hace)
2. Se hace el formulario de eliminar y el botn eliminar tendr el
siguiente codigo
Private Sub btnEliminar_Click()
Dim Fila As Integer
Dim final As Integer
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" And Hoja18.Cells(Fila, 1) = "" And
Hoja19.Cells(Fila, 1) = "" And Hoja20.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
If MsgBox("Seguro que quiere eliminar este producto?", vbQuestion
+ vbYesNo) = vbYes Then
For Fila = final To 2 Step -1 'CORRECCIN: Esto hace que los
registros se eliminen desde el final hasta la fila 2 con un paso de -1
If Val(Me.cmbCodigoProducto) = Hoja17.Cells(Fila, 1)
Then
Hoja17.Cells(Fila, 1).EntireRow.Delete
Exit For
End If
Next
For Fila = final To 2 Step -1 'CORRECCIN: Esto hace que los
registros se eliminen desde el final hasta la fila 2 con un paso de -1
If Val(Me.cmbCodigoProducto) = Hoja18.Cells(Fila, 1)
Then
Hoja18.Cells(Fila, 1).EntireRow.Delete
End If
Next
For Fila = final To 2 Step -1 'CORRECCIN: Esto hace que los
registros se eliminen desde el final hasta la fila 2 con un paso de -1
If Val(Me.cmbCodigoProducto) = Hoja19.Cells(Fila, 1)
Then
Hoja19.Cells(Fila, 1).EntireRow.Delete
End If
Next

For Fila = final To 2 Step -1 'CORRECCIN: Esto hace que los


registros se eliminen desde el final hasta la fila 2 con un paso de -1
If Val(Me.cmbCodigoProducto) = Hoja20.Cells(Fila, 1)
Then
Hoja20.Cells(Fila, 1).EntireRow.Delete
End If
Next
MsgBox "Producto eliminado", vbInformation + vbOKOnly
Else
Exit Sub
End If

Me.cmbCodigoProducto = ""
Me.txtNombre = ""
Me.txtDescripcion = ""
End Sub
3. Botn cancelar
Private Sub btnFinalizar_Click()
Unload Me
End Sub
4. Para el caso de los combobox es el mismo codigo que el form de
moddificar para que cargue las opciones en el evento change
Private Sub cmbCodigoProducto_Change()
Dim Fila As Integer
Dim final As Integer
If Val(cmbCodigoProducto.value = "") Then
Me.txtNombre = ""
Me.txtDescripcion = ""
End If
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
For Fila = 2 To final
If Val(cmbCodigoProducto) = Hoja17.Cells(Fila, 1) Then
Me.txtNombre = Hoja17.Cells(Fila, 2)
Me.txtDescripcion = Hoja17.Cells(Fila, 3)
Exit For
End If

Next
End Sub
5. Para el evento enter
Private Sub cmbCodigoProducto_Enter()
Dim Fila As Integer
Dim final As Integer
Dim Lista As String
' Este evento es para que aparezcan los codigos de ptos en el
comboBox
For Fila = 1 To cmbCodigoProducto.ListCount
cmbCodigoProducto.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja17.Cells(Fila, 1) = "" Then
final = Fila - 1 ' No se necesita la ultima celda que sale en
blanco para agregar ya que este modifica
Exit For
End If
Next
For Fila = 2 To final
Lista = Hoja17.Cells(Fila, 1)
cmbCodigoProducto.AddItem (Lista)
Next
End Sub
6. Se hicieron cambios se cambio entradas por ingresos por conpras y
salidas por transferencias ya que se refiere a transferencias de
mercancas a otras bodegas o tiendas
7. Hacer el botn para devoluciones de entradas y salidas los botones
de combobox quedan de la siguiente forma para ambos combobox
Private Sub cmbCodigoProducto_Change()
Dim Fila As Integer
Dim final As Integer
If Val(cmbCodigoProducto.value = "") Then
Me.txtNombre = ""
Me.txtExistencia = ""
End If
For Fila = 2 To 1000
If Hoja19.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
For Fila = 2 To final
If Val(cmbCodigoProducto) = Hoja19.Cells(Fila, 1) Then
Me.txtNombre = Hoja19.Cells(Fila, 2)

Me.txtExistencia = Hoja19.Cells(Fila, 3)
Exit For
End If
Next
End Sub
Private Sub cmbCodigoProducto_Enter()
Dim Fila As Integer
Dim final As Integer
Dim Lista As String
' Este evento es para que aparezcan los codigos de ptos en el
comboBox
For Fila = 1 To cmbCodigoProducto.ListCount
cmbCodigoProducto.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja19.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
For Fila = 2 To final
Lista = Hoja19.Cells(Fila, 1)
cmbCodigoProducto.AddItem (Lista)
Next
End Sub
8. Los botones de finalizar quedan asi
Private Sub btnFinalizar_Click()
Unload Me
End Sub
9. Al colocar la fecha para que por codigo oculto se coloque los
separadores de dia, mes, ao
Private Sub txtFechaDevolucion_KeyDown(ByVal KeyCode As
MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case Len(Me.txtFechaDevolucion) 'longitud informacion
ingresada en el textbox
Case 2 'caso de que sean 2 digitos o caracteres osea los dos nume
del dia
Me.txtFechaDevolucion = Me.txtFechaDevolucion + "/"
Case 5 ' 5 caracteres correspondientes a dos del dia mas el / mas
los dos del mes
Me.txtFechaDevolucion = Me.txtFechaDevolucion + "/"
End Select
End Sub
10.Botn procesar para entradas y salidas por devolucin solo cambia
dos lneas de codigo donde se suma y resta por la existencia y la del
tipo de devolucin

Private Sub btnProcesar_Click()


Dim Fila As Integer
Dim final As Integer
Dim Existencia As Integer
Dim Total As Integer
Dim Comprob As Long 'comprobante
Hoja22.Range("G1").value = Hoja22.Range("G1").value + 1 'celda G1
se enceuntra num de comprobante oculto con celda resaltada en
blanco y cada vez que se hace un comprobante aumenta en 1, como
un autonumerico
Comprob = Hoja22.Range("G1").value
For Fila = 2 To 1000
If Hoja22.Cells(Fila, 1) = "" Then
final = Fila
Exit For
End If
Next
Hoja22.Cells(final, 1) = "DEV " & Comprob
Hoja22.Cells(final, 2) = Val(Me.cmbCodigoProducto)
Hoja22.Cells(final, 3) = Me.txtNombre
Hoja22.Cells(final, 4) = Me.txtFechaDevolucion
Hoja22.Cells(final, 5) = Me.txtCantidad
Hoja22.Cells(final, 6) = "Salida" 'tipo de devolucin en este caso
salida para form
salida
Hoja22.Cells(final, 6) = "Entrada" 'tipo de devolucin en este caso
entrada para form entrada
For Fila = 2 To 1000
If Hoja19.Cells(Fila, 1) = Hoja22.Cells(final, 2) Then
Existencia = Hoja19.Cells(Fila, 3)
Total = txtExistencia txtCantidad // esto para salida
Total = txtExistencia + txtCantidad // esto para entradas
Hoja19.Cells(Fila, 3) = Total
Exit For
End If
Next
Me.cmbCodigoProducto = ""
Me.txtNombre = ""
Me.txtFechaDevolucion = ""
Me.txtExistencia = ""
Me.txtCantidad = ""
End Sub
11.Aqu se mira como generar un comprobante de movimientos o Kardex
se borra botn eliminar y se coloca botn de reporte de movimientos
(yo no lo elimino)
12.Se declaran variables
Dim Fila As Integer

Dim Fila2 As Integer


Dim Final As Integer
Dim Final2 As Integer
Dim Registro As Integer
Dim Registro2 As Integer
Dim ObjExcel As Object
Dim SaldoTotal As Integer
Dim NombreArchivo As String 'manejar libro de trabajo nuevo
generado se maneja con el nombre por defecto que le coloca excel al
rchivo nuevo
Dim ContarFilas As Double 'poner distancia desde la info que se tiene
en fila 1 hasta fila 9 los registros que se envian inician en la fila 10
Dim ContarFilasFilas2 As Double
Dim CodProd As String
Dim FilaDelTotal As Integer
Dim ValorSaldo As Double
Set ObjExcel = Workbooks.Add 'generar nuevo libro de trabajo donde
se guardara el reporte
ObjExcel.Activate 'poner activa la ventana del nuevo libro
NombreArchivo = ActiveWorkbook.Name 'poner nombre
predetminado por excel al nuevo libro
13.Determinar final listado hoja entrada y salida
'Entradas con este blucle se determina el final del listado de la hoja
de calculo de entradas
For Fila = 1 To 1000
If Hoja18.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
'Salidas con este blucle se determina el final del listado de la hoja de
calculo de salidas
For Fila2 = 1 To 1000
If Hoja20.Cells(Fila2, 1) = "" Then
Final2 = Fila2 - 1
Exit For
End If
Next
CodProd = Me.cmbCodigoProducto
14.Asignar datos pto consultado
'Establecer datos del producto consultado
ContarFilas = 9 'numero de filas(encabezado) que abra desde el inicio
hasta donde se colocarian los registros
'Asignar el codigo de producto para el reporte. El Ucase es para hacer
mayusculas lo q esta en txtnombre

Application.Workbooks(NombreArchivo).Worksheets(1).Cells(1, 1) =
"DETALLE DE MOVIMIENTOS DE " & UCase(Me.txtNombre)
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(3, 2) =
CodProd 'Celda B3
For Fila = 1 To 1000
If Hoja17.Cells(Fila, 1) = CodProd Then 'hoja de calculo ptos
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(4,
2) = Hoja17.Cells(Fila, 2) '(4,2) nombre
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(5,
2) = Hoja17.Cells(Fila, 3) '(5,2) desc
Exit For
End If
Next
For Fila = 1 To 1000
If Hoja19.Cells(Fila, 1) = CodProd Then 'hoja calculo existencia
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(6,
2) = Hoja19.Cells(Fila, 3) '(6,2) existencia
ValorSaldo = Hoja19.Cells(Fila, 3)
Exit For
End If
Next
15.Establecer datos del pto
'Establecer datos del producto consultado
ContarFilas = 9 'numero de filas(encabezado) que abra desde el inicio
hasta donde se colocarian los registros
'Asignar el codigo de producto para el reporte. El Ucase es para hacer
mayusculas lo q esta en txtnombre
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(1, 1) =
"DETALLE DE MOVIMIENTOS DE " & UCase(Me.txtNombre)
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(3, 2) =
CodProd 'Celda B3
For Fila = 1 To 1000
If Hoja17.Cells(Fila, 1) = CodProd Then 'hoja de calculo ptos
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(4,
2) = Hoja17.Cells(Fila, 2) '(4,2) nombre
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(5,
2) = Hoja17.Cells(Fila, 3) '(5,2) desc
Exit For
End If
Next
For Fila = 1 To 1000
If Hoja19.Cells(Fila, 1) = CodProd Then 'hoja calculo existencia
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(6,
2) = Hoja19.Cells(Fila, 3) '(6,2) existencia
ValorSaldo = Hoja19.Cells(Fila, 3)
Exit For

End If
Next
16.Detalle de registro de entradas y salidas
'Entradas colocar detalle de registro de mov de entradas
For Registro = 1 To Final
If Hoja18.Cells(Registro, 2) = CodProd Then
ContarFilas = ContarFilas + 1
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 2) = Hoja18.Cells(Registro, 1) 'Comprob'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 3) = Hoja18.Cells(Registro, 4) 'Fecha de Ingreso'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 4) = Hoja18.Cells(Registro, 5) 'No. Factura'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 5) = Hoja18.Cells(Registro, 6) 'Proveedor'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 6) = Hoja18.Cells(Registro, 8) 'Tipo Entrada'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
as, 7) = Hoja18.Cells(Registro, 7) 'Cant. Entrada'
End If
Next
'Salidas colocar detalle de registro de mov de salidas
ContarFilasFilas2 = 9
For Registro2 = 1 To Final2
If Hoja18.Cells(Registro2, 2) = CodProd Then
ContarFilasFilas2 = ContarFilasFilas2 + 1
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 8) = Hoja18.Cells(Registro2, 1) 'Comprob'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 9) = Hoja18.Cells(Registro2, 4) 'Fecha de Salida'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 10) = Hoja18.Cells(Registro2, 5) 'No. Factura'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 11) = Hoja18.Cells(Registro2, 6) 'Destino'
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 12) = Hoja18.Cells(Registro2, 8) 'Tipo Salida'

Application.Workbooks(NombreArchivo).Worksheets(1).Cells(ContarFil
asFilas2, 13) = Hoja18.Cells(Registro2, 7) 'Cant. Salida'
End If
Next
17.Codigo para saber donde se coloca saldo
'Determinar el final para colocar saldo final del producto
'7(G) se refiere a la fila del final parte de entradas y 13(M) a la de
salidas y (1) es hoja 1 del nuevo lobro de trabajo
For FilaDelTotal = 10 To 1000
If
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(FilaDelTot
al, 7) = "" And
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(FilaDelTot
al, 13) = "" Then
SaldoTotal = FilaDelTotal
Exit For
End If
Next
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(SaldoTot
al, 12) = "Saldo"
Application.Workbooks(NombreArchivo).Worksheets(1).Cells(SaldoTot
al, 13) = ValorSaldo
18.Ahora para hacer formatos se puede en el mismo codigo o creando
modulo donde se copiara el codigo para llamarlo desde el codigo de
botn consultar con call nombreModulo se acostumbra hacersr aparte
si el codigo es muy largo si no se deja ah mismo
19.'APLICAR FORMATO A TODO EL REPORTE
Unload Me
ObjExcel.Activate
20.Macro para colocar bordes y quitar cuadricula de la hoja
Macro para establecer Bordes en reporte y quitar las lneas de
cuadrcula
Range(Cells(10, 2), Cells(SaldoTotal, 13)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin

End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
Range("A3").Select
ActiveWindow.DisplayGridlines = False
21.Macro para formatear saldo
'Macro para formatear el saldo
Range(Cells(SaldoTotal, 12), Cells(SaldoTotal, 13)).Select
Selection.Font.Bold = True
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

22.Macro para formatear reporte


Formatear_Reporte Macro
'
Range("A1:M1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Selection.Font.Size = 12
Selection.Font.Size = 14
Selection.Font.Size = 16
Selection.Font.Size = 18
Selection.Font.Size = 20
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
Range("A3").Select
ActiveCell.FormulaR1C1 = "Cdigo"
Range("A4").Select
ActiveCell.FormulaR1C1 = "Nombre"
Range("A5").Select
ActiveCell.FormulaR1C1 = "Descripcin"
Range("A6").Select
ActiveCell.FormulaR1C1 = "Existencia"
Range("A3").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With

With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Range("A3:A6").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Selection.Font.Bold = True
Range("B9").Select
ActiveCell.FormulaR1C1 = "Comprb."
Range("C9").Select
ActiveCell.FormulaR1C1 = "Fecha"
Range("D9").Select
ActiveCell.FormulaR1C1 = "Factura"
Range("E9").Select
ActiveCell.FormulaR1C1 = "Proveedor"
Range("F9").Select
ActiveCell.FormulaR1C1 = "Tipo Entrada"
Range("G9").Select
ActiveCell.FormulaR1C1 = "Cant. Entrada"
Range("H9").Select
ActiveCell.FormulaR1C1 = "Comprb."
Range("I9").Select
ActiveCell.FormulaR1C1 = "Fecha"
Range("J9").Select

ActiveCell.FormulaR1C1 = "Transf."
Range("K9").Select
ActiveCell.FormulaR1C1 = "Destino"
Range("L9").Select
ActiveCell.FormulaR1C1 = "Tipo Salida"
Range("M9").Select
ActiveCell.FormulaR1C1 = "Cant. Salida"
Range("M9").Select
Range(Selection, Selection.End(xlToLeft)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Selection.Font.Bold = True
Range("A3").Select
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
Columns("F:F").EntireColumn.AutoFit
Columns("G:G").EntireColumn.AutoFit
Columns("H:H").EntireColumn.AutoFit
Columns("J:J").EntireColumn.AutoFit
Columns("K:K").EntireColumn.AutoFit
Columns("L:L").EntireColumn.AutoFit
Columns("M:M").EntireColumn.AutoFit
Range("B8:G8").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
ActiveCell.FormulaR1C1 = "ENTRADAS"
Range("H8:M8").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0

.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
ActiveCell.FormulaR1C1 = "SALIDAS"
Range("B8:G8").Select
Selection.Font.Size = 12
Selection.Font.Size = 14
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("H8:M8").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Selection.Font.Size = 12
Selection.Font.Size = 14
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Selection.Font.Bold = True
Range("B8:G8").Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Selection.Font.Bold = True
Range("A3").Select
23.Codigo para botn finalizar
Private Sub btnFinalizar_Click()
Unload Me
End Sub

Enviar datos de un listBox a hoja de clculo


Video 33 (Registros desde listBox)
1. Como enviar contenido de un listbox con un solo clic a una hoja de
calculo
2. Hacer formulario que tenga listbox y commandBottom
3. En el botn enviar colocar el ste codigo

Private Sub btnEnviar_Click()


Dim Fila As Integer
Dim Final As Integer
Dim i As Integer
' determinar final del listado
For Fila = 1 To 1000
If Hoja24.Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next
'info del listBox se envie a hoja de calculo
For i = 0 To lstBoxEnviar.ListCount - 1
Hoja24.Cells(Final, 1) = lstBoxEnviar.List(i, 0)
Final = Final + 1
Next
End Sub
4. Evento initialize del formulario colocar esto
Private Sub UserForm_Initialize()
Dim x As Integer
For x = 1 To 10
lstBoxEnviar.AddItem x
Next
End Sub
5. Hacer botn en la hoja de calculo para mostrar listBox y hacer un
modulo para mostrarlo el cual tiene el siguiente codigo
Sub EnviarInfoDesdeListBox()
frmEnviarInfoDesdeListBox.Show
End Sub

Gestor de inventarios parte 11-15


Video 34,35,36,37,38 (Principal, productos, entradas, salidas, existencias,
devoluciones,comprobantes)
Acceso multiusuario y contrasea
Ocultar libro de trabajo (vamos por ac min 11)
Mtodo de costo promedio ponderado
Facturacin preview
Facturacin cdigo fuente
1. Creamos una hoja llamada login con usuario, pass y nivel (admin,
empleado)
2. Crea una hoja llamada logs que se refiere a la bitcora de acceso
3. Formulario de eliminar usuario BOTON ELIMIAR
Private Sub btnEliminar_Click()
Dim Fila As Integer
Dim final As Integer

For Fila = 2 To 1000


If Hoja25.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
If MsgBox("Seguro que quiere eliminar este Usuario?", vbQuestion +
vbYesNo) = vbYes Then
For Fila = 2 To final
If Me.cmbUsuario = Hoja25.Cells(Fila, 1) Then
Hoja25.Cells(Fila, 1).EntireRow.Delete
Exit For
End If
Next
MsgBox "Usuario eliminado", vbInformation + vbOKOnly
Else
Exit Sub
End If
Me.cmbUsuario = ""
Me.txtStatus = ""
End Sub
4. BOTON FINALIZAR
Private Sub btnFinalizar_Click()
Unload Me
End Sub
5. El combobox evento enter y change
Private Sub cmbUsuario_Change()
Dim Fila As Integer
Dim final As Integer
If cmbUsuario.value = "" Then
Me.txtStatus = ""
End If
For Fila = 2 To 1000
If Hoja25.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
For Fila = 2 To final
If cmbUsuario = Hoja25.Cells(Fila, 1) Then
Me.txtStatus = Hoja25.Cells(Fila, 3)
Exit For
End If

Next
End Sub
Private Sub cmbUsuario_Enter()
Dim Fila As Integer
Dim final As Integer
Dim Lista As String
For Fila = 1 To cmbUsuario.ListCount
cmbUsuario.RemoveItem 0
Next Fila
For Fila = 2 To 1000
If Hoja25.Cells(Fila, 1) = "" Then
final = Fila - 1
Exit For
End If
Next
For Fila = 2 To final
Lista = Hoja25.Cells(Fila, 1)
cmbUsuario.AddItem (Lista)
Next
End Sub
6. Formulario de login
Private Sub btn_Registrar_Click()
Dim usuario As String
Dim Fila, final As Integer
Dim password, UsuarioEncontrado, yaExiste, Status
Dim Rango As Range
Titulo = "Gestor de Inventarios"
yaExiste =
Application.WorksheetFunction.CountIf(Hoja25.Range("Tabla5[Usuario
s]"), Me.txtUsuario.value)
Set Rango = Hoja25.Range("Tabla5[Usuarios]")
If Me.txtUsuario.value = "" Or Me.txtPassword.value = "" Then
MsgBox "Introduce usuario y contrasea", vbExclamation, Titulo
Me.txtUsuario.SetFocus
ElseIf yaExiste = 0 Then
MsgBox "El usuario '" & Me.txtUsuario & "' no existe",
vbExclamation, Titulo
ElseIf yaExiste = 1 Then
UsuarioEncontrado =
Rango.Find(What:=Me.txtUsuario.value, MatchCase:=False).Address
password = Hoja25.Range(UsuarioEncontrado).Offset(0,
1).value
Status = Hoja25.Range(UsuarioEncontrado).Offset(0,
2).value

If Hoja25.Range(UsuarioEncontrado).value =
Me.txtUsuario.value And password = Me.txtPassword.value Then
For Fila = 1 To 1000
If Hoja26.Cells(Fila, 1) = "" Then
final = Fila
Exit For
End If
Next
Hoja26.Cells(final, 1) = "=NOW()"
Hoja26.Cells(final, 1).Copy
Hoja26.Cells(final, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Hoja26.Cells(final, 2) = Me.txtUsuario
Hoja26.Cells(final, 3) = Status
If Status = "Admin" Then
Hoja16.btnAdmin.Enabled = True
End If
Hoja26.Range("G1") = Me.txtUsuario
Unload Me
Else
MsgBox "La contrasea es incorrecta", vbExclamation, Titulo
End If
End If
End Sub
7. Botn salir que cierra el documento
Private Sub btn_Salir_Click()
Unload Me
ActiveWorkbook.Save
Application.DisplayAlerts = False
Application.Quit
End Sub
8. Cuando se inicialice el formulario se desactiva el botn administrador
que solo ser accesible para ese perfil
Private Sub UserForm_Initialize()
Call OcultarHojasGestorInventario
Hoja16.btnAdmin.Enabled = False
End Sub
9. Otro evento del formulario
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer)
If CloseMode = 0 Then
Unload Me

ActiveWorkbook.Save
Application.DisplayAlerts = False
Application.Quit
'Cancel = 1
'CloseMode = 1
End If
End Sub
10.Modulo para ocultar y mostrar hojas
Sub MostrarHojas()
Dim Hoja As Worksheet
For Each Hoja In Worksheets
If Hoja.CodeName <> "Hoja16" Then
Hoja.Visible = xlSheetVisible
End If
Next Hoja
End Sub
Sub OcultarHojasGestorInventario()
Dim Hoja As Worksheet
For Each Hoja In Worksheets
If Hoja.CodeName <> "Hoja16" Then
Hoja.Visible = xlSheetVeryHidden
End If
Next Hoja
End Sub
11.Se le agrega a la hoja de entrads por devolucin, ingresos por
compras, salidas por devolucin, tranferencias respectivamente
Hoja18.Cells(final, 11) = Hoja26.Range("G1")
Hoja18.Cells(final, 11) = Hoja26.Range("G1")
Hoja20.Cells(final, 11) = Hoja26.Range("G1")
Hoja20.Cells(final, 11) = Hoja26.Range("G1")
12.En thisworkbook para que cuando se abra libro de trabajo se coloca
Private Sub Workbook_Open()
frmLoginGestor.Show
End Sub
13.Pendiente cdigo del botn de fecha porque en office 64 no sirve
(parte11 gestor inv los ltimos min)
14.Para ocultar el libro de trabajo en el momento que se ejecuta la
aplicacin en donde dice thsiWorkNook se copia esta lnea
ThisWorkBook.Application.Visible = False
SplashForm.Show
15.Este codigo va en el load del splashForm
'Para mostrar un UserForm sin barra de titulo necesitamos cuatro
funciones API:
Const GWL_STYLE = -16
Const WS_CAPTION = &HC00000
#If VBA7 Then
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As
Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias


"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal
dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal
hwnd As Long) As Long
Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
#Else
Private Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As
Long
Private Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal
dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd
As Long) As Long
Private Declare Function FindWindowA Lib "user32" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Private Sub UserForm_Initialize()
'Este cdigo realiza el procedimiento de ocultar la barra de ttulo,
haciendo uso de las API
Dim lngWindow As Long, lFrmHdl As Long
lFrmHdl = FindWindowA(vbNullString, Me.Caption)
lngWindow = GetWindowLong(lFrmHdl, GWL_STYLE)
lngWindow = lngWindow And (Not WS_CAPTION)
Call SetWindowLong(lFrmHdl, GWL_STYLE, lngWindow)
Call DrawMenuBar(lFrmHdl)
'----------------------------------------------------------------------------------------'Cargamos el formulario y establecemos un timer para que se cierre
automticamente
Dim Contador, Maximo, Intervalo As Integer
Dim Inicio As Double
Dim X
Maximo = 300
Me.Show
For Contador = 1 To Maximo
Inicio = Timer
Do Until Timer - Inicio > Intervalo
X = DoEvents()
Loop
Me.lblBar.Width = Contador
Me.lblPercent.Caption = "Cargando " & Format(Contador /
Maximo, "Percent")
Next Contador
frmLoginGestor.Show
End

End Sub
16.En el form para que funcione la propiedad showModal debe ser false
17.Adiciono splash screem personalizado la pantalla de inicio de la
aplicacin con una barra de progreso
18.Oculto libro de trabajo que solo se muestra con la opcin mostrar
todo
19.Todas las opciones en un solo formulario
20.La x de cerrar no permite cerrar formulario no hace nada cunado el
libro de trabajo est cerrado y para eso se coloca botn salir para que
sea el nico con el que se pueda salir si no se es admin que es
cuando da la opcin de mostrar libro de trab
21.Se deshabilitan todos los botones de uso administrativo cuando se
entra con usuario empleado
22.Para ocultar libro de trabajo cuando se ejecute la aplicacin vamos a
la hoja llamada thisworkbook
Private Sub Workbook_Open()
ThisWorkbook.Application.Visible = False
End Sub
Min 11:43 parte12
Pendiente escribir todo el cdigo de parte 12
23.

Você também pode gostar