1.
Diseñar el Formulario (UserForm)
Primero, debemos entrar al entorno de programación:
1. Presiona ALT + F11 para abrir el Editor de VBA.
2. Ve al menú Insertar > UserForm.
3. En el cuadro de herramientas, agrega los siguientes elementos y cámbiales el
nombre en la ventana de Propiedades (esto es vital para que el código funcione):
Elemento Etiqueta (Label) Nombre del Objeto (Name)
Cuadro de texto Descripción txtDescripcion
Cuadro de texto Adquisición txtAdquisicion
Cuadro de texto Costo Adquisición txtCostoCompra
Cuadro de texto Estatus txtEstatus
Cuadro de texto Años de Utilidad txtAnios
Cuadro de texto Costo Actual txtCostoActual
Botón de comando (Guardar) btnGuardar
Exportar a Hojas de cálculo
2. El Código para Guardar los Datos
Haz doble clic en el botón "Guardar" que creaste dentro del formulario y pega el
siguiente código:
VBA
Private Sub btnGuardar_Click()
Dim fila As Long
'Validar que la descripción no esté vacía
If [Link] = "" Then
MsgBox "Por favor, ingresa una descripción.", vbExclamation
Exit Sub
End If
'Buscar la siguiente fila vacía en la Hoja1 (ajusta el nombre si es
necesario)
fila = Sheets("INVENTARIO").Range("A" & [Link]).End(xlUp).Row + 1
'Pasar los datos del formulario a las celdas
With Sheets("INVENTARIO")
.Cells(fila, 1).Value = [Link]
.Cells(fila, 2).Value = [Link]
.Cells(fila, 3).Value = [Link]
.Cells(fila, 4).Value = [Link]
.Cells(fila, 5).Value = [Link]
.Cells(fila, 6).Value = [Link]
End With
'Limpiar el formulario
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
MsgBox "Datos guardados correctamente", vbInformation
End Sub
3. Crear el Botón de Acción en Excel
Ahora necesitamos el macro que "llama" al formulario:
1. En el mismo editor de VBA, ve a Insertar > Módulo.
2. Pega este código:
VBA
Sub AbrirFormulario()
[Link]
End Sub
3. Regresa a tu hoja de Excel.
4. Ve a la pestaña Insertar > Ilustraciones > Formas y dibuja un rectángulo (o usa
un botón de la pestaña Programador).
5. Haz clic derecho sobre la forma y selecciona "Asignar macro...".
6. Elige AbrirFormulario y acepta.
Un toque de matemáticas para tu "Costo Actual"
Si quieres que el Costo Actual se calcule automáticamente basándose en la depreciación
lineal, podrías usar una lógica simple dentro de VBA:
Cactual=Cadquisicioˊn−(An~osutilidadCadquisicioˊn×An~ostranscurridos)
Nota importante: No olvides guardar tu archivo como "Libro de Excel habilitado para
macros (.xlsm)", de lo contrario, perderás todo el código al cerrar.
¿Te gustaría que agregue una función para que el "Costo Actual" se calcule
automáticamente apenas ingreses los años de utilidad?
Private Sub btnGuardar_Click()
Dim fila As Long
'Validar que la descripción no esté vacía
If [Link] = "" Then
MsgBox "Por favor, ingresa una descripción.", vbExclamation
Exit Sub
End If
[Link] = True
[Link] = RGB(240, 240, 240) ' Color gris de fondo (opcional)
' Asigna el primer código disponible
[Link] = GenerarSiguienteCodigo()
'Buscar la siguiente fila vacía en la Hoja1 (ajusta el nombre si es necesario)
fila = Sheets("INVENTARIO").Range("B" & [Link]).End(xlUp).Row + 1
'Pasar los datos del formulario a las celdas
With Sheets("INVENTARIO")
.Cells(fila, 2).Value = [Link]
' .Cells(fila, 3).Value = [Link]
.Cells(fila, 4).Value = [Link]
.Cells(fila, 5).Value = [Link]
.Cells(fila, 6).Value = [Link]
.Cells(fila, 7).Value = [Link]
.Cells(fila, 8).Value = [Link]
.Cells(fila, 9).Value = [Link]
End With
MsgBox "Datos guardados correctamente", vbInformation
LimpiarCampos
End Sub
Sub LimpiarCampos()
' [Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
[Link] = ""
' Asigna el nuevo código automáticamente al terminar
[Link] = GenerarSiguienteCodigo
End Sub
Private Function GenerarSiguienteCodigo() As Long
Dim ultimoId As Variant
' Busca el valor máximo en la columna B de la hoja INVENTARIO
ultimoId = [Link](Sheets("INVENTARIO").Range("B:B"))
If IsNumeric(ultimoId) Then
GenerarSiguienteCodigo = ultimoId + 1
Else
GenerarSiguienteCodigo = 1 ' Si la tabla está vacía, inicia en 1
End If
End Function
Private Sub Command_cancelar_Click()
End Sub
1. Botón para Buscar Datos
Este código busca el valor de txtCodigo en la columna B de tu hoja. Si lo
encuentra, carga la información en el formulario.
vba
Private Sub btnBuscar_Click()
Dim codigoBusqueda As String
Dim rangoBusqueda As Range
Dim celdaEncontrada As Range
Dim ws As Worksheet
Set ws = Sheets("INVENTARIO")
codigoBusqueda = [Link]
If codigoBusqueda = "" Then
MsgBox "Por favor, ingresa un código para buscar.", vbExclamation
Exit Sub
End If
' Buscar en la columna B
Set celdaEncontrada = [Link]("B").Find(What:=codigoBusqueda,
LookIn:=xlValues, LookAt:=xlWhole)
If Not celdaEncontrada Is Long Then
' Cargar datos encontrados (ajusta los índices de columna según
tu hoja)
' [Link] nos da el número de fila
[Link] = [Link]([Link], 4).Value
[Link] = [Link]([Link], 5).Value
[Link] = [Link]([Link], 6).Value
[Link] = [Link]([Link], 7).Value
[Link] = [Link]([Link], 8).Value
[Link] = [Link]([Link], 9).Value
MsgBox "Registro encontrado en la fila " & [Link],
vbInformation
Else
MsgBox "El código " & codigoBusqueda & " no existe en el
inventario.", vbCritical
End If
End Sub
Usa el código con precaución.
2. Modificar el Botón Guardar (Para que también Actualice)
Para que el botón Guardar sea "inteligente", debe detectar si el código ya existe.
Si existe, actualiza la fila; si no, crea una nueva.
vba
Private Sub btnGuardar_Click()
If Not CamposCompletos() Then Exit Sub
Dim fila As Long
Dim ws As Worksheet
Dim celdaEncontrada As Range
Set ws = Sheets("INVENTARIO")
' Intentar encontrar si el código ya existe para MODIFICAR
Set celdaEncontrada = [Link]("B").Find(What:=[Link],
LookIn:=xlValues, LookAt:=xlWhole)
If Not celdaEncontrada Is Nothing Then
' Si existe, usamos esa fila
fila = [Link]
Else
' Si NO existe, buscamos la última fila vacía para NUEVO registro
fila = [Link]("B" & [Link]).End(xlUp).Row + 1
End If
' Guardar o Actualizar datos
With ws
.Cells(fila, 2).Value = Val([Link])
.Cells(fila, 4).Value = [Link]
.Cells(fila, 5).Value = [Link]
.Cells(fila, 6).Value = CDbl([Link])
.Cells(fila, 7).Value = Val([Link])
.Cells(fila, 8).Value = [Link]
.Cells(fila, 9).Value = CDbl([Link])
End With
MsgBox "Proceso completado correctamente.", vbInformation
LimpiarCampos
End Sub
Usa el código con precaución.
3. Ajuste Necesario
Para que puedas buscar, debes permitir que el usuario escriba
en txtCodigo temporalmente o añadir un botón de "Nuevo Registro" que
reactive el autoincremento. Si el campo está bloqueado ( Locked = True ), el
usuario no podrá escribir el ID que quiere buscar.
Recomendación: Agrega un botón "Limpiar / Nuevo" que llame
a LimpiarCampos y desbloquee el código si deseas buscar manualmente.