Formulario de captura en Excel que guarda datos en otro archivo de Excel
En un artículo anterior vimos cómo tener un formulario de captura que guarda datos en otra hoja de Excel, que por cierto el video asociado a ese tutorial tiene hasta la fecha 56 mil vistas en Youtube, lo cual lo hace un tutorial que le ha sido útil a bastantes personas.
Ahora, tomando el mismo ejemplo le hice algunas modificaciones en las macros para que ahora los datos se capturen en un formulario que esté en un archivo de Excel y que los datos capturados se guarden en otro archivo de Excel.
Ver video Capturar datos y guardarlos en otro archivo
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Guardar datos en otro archivo de Excel
Tenemos un archivo de Excel en el cual, en la primera hoja tenemos un formulario para capturar datos. En la hoja Captura contamos con dos botones:
-
-
Guardar datos en otro archivo.
-
Guardar datos en otra hoja (mismo archivo).
-
Figura 1. Capturar datos y guardarlos en el mismo archivo o en otro archivo.
En caso de presionar el botón Guardar datos (otro archivo), los datos se capturarán en el archivo llamado Datos – EXCELeINFO.xlsx, mismo que debe guardarse en la misma carpeta del archivo de captura.
Figura 2. Los datos se guardarán en otro archivo, que debe estar en la misma carpeta.
Guardar en el mismo archivo, pero en otra hoja
En caso de presionar el botón Guardar datos (mismo archivo), los datos se guardarán en la hoja Datos del mismo archivo de captura.
Figura 3. Guardar datos en hoja de Excel.
Código vba de la macro. Guardar en otro archivo
El siguiente código debe ir en un módulo normal y será llamado por el botón Guardar datos (otro archivo).
Option Explicit 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'Guardar datos en otro archivo de Excel Sub Captura_Datos2() 'Declaración de variables ' Dim strTitulo As String Dim Continuar As String Dim RangoDatos As Range Dim NuevaFila As Integer Dim Limpiar As String Dim HojaDestino Dim Ruta As String ' 'Declaramos las variables que nos permitirán tener una segunda instancia de Excel 'ejecutándose en segundo plano. Dim x10 As New Excel.Application Dim ArchivoDestino As New Excel.Workbook ' strTitulo = "EXCELeINFO" ' Continuar = MsgBox("Dar de alta los datos?", vbYesNo + vbExclamation, strTitulo) If Continuar = vbNo Then Exit Sub ' 'En caso de que el archivo esté en la misma ruta Ruta = ActiveWorkbook.Path ' 'Abrimos el archivo donde se guardarán los datos. 'Este archivo se abrirá en la instancia de Excel ejecutándose en segundo plano. 'Set ArchivoDestino = x10.Workbooks.Open("C:\ruta\del\archivo\de\datos\Datos - EXCELeINFO.xlsx") Set ArchivoDestino = x10.Workbooks.Open(Ruta & "\Datos - EXCELeINFO.xlsx") Set HojaDestino = ArchivoDestino.Worksheets("Datos") ' 'Definimos el rango actual de la hoja Datos Set RangoDatos = HojaDestino.Cells(1, 1).CurrentRegion ' 'Nueva fila será la fila donde se guardarán los datos nuevos NuevaFila = RangoDatos.Rows.Count + 1 'La variable HojaDestino será la hoja donde se guardarán los datos. With HojaDestino .Cells(NuevaFila, 1).Value = Date .Cells(NuevaFila, 2).Value = Format(Date, "dd") 'Día actual .Cells(NuevaFila, 3).Value = Format(Date, "mm") 'Mes actual .Cells(NuevaFila, 4).Value = Format(Date, "yy") 'Año actual .Cells(NuevaFila, 5).Value = ThisWorkbook.Sheets(1).Range("C6") 'Responsable .Cells(NuevaFila, 6).Value = ThisWorkbook.Sheets(1).Range("C9") 'Inventario .Cells(NuevaFila, 7).Value = ThisWorkbook.Sheets(1).Range("C12") 'Célula .Cells(NuevaFila, 8).Value = ThisWorkbook.Sheets(1).Range("C15") 'V.O.B.O. .Cells(NuevaFila, 9).Value = ThisWorkbook.Sheets(1).Range("F9") 'Se reemplaza .Cells(NuevaFila, 10).Value = ThisWorkbook.Sheets(1).Range("F12") 'Aplica pago .Cells(NuevaFila, 11).Value = ThisWorkbook.Sheets(1).Range("F15") 'Comentarios End With ' MsgBox "Alta exitosa.", vbInformation, strTitulo ' ' 'Guardamos el archivo con los datos. ArchivoDestino.Save 'Cerramos el archivo con los datos. ArchivoDestino.Close 'Quitamos las referencias a los objetos de la otra instancia de Excel Set x10 = Nothing Set ArchivoDestino = Nothing ' Limpiar = MsgBox("Deseas limpiar los campos de la captura?", vbYesNo, strTitulo) ' If Limpiar = vbYes Then With ActiveWorkbook.Sheets(1) .Range("C6").ClearContents .Range("C9").ClearContents .Range("C12").ClearContents .Range("C15").ClearContents .Range("F9").ClearContents .Range("F12").ClearContents 'ClearContents no funciona en celda combinada... .Range("F15").Value = "" End With Else End If ' End Sub
Código vba de la macro. Guardar en otra hoja
El siguiente código debe ir en un módulo normal y será llamado por el botón Guardar datos (mismo archivo).
Option Explicit 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh Sub Captura_Datos() 'Declaración de variables ' Dim strTitulo As String Dim Continuar As String Dim RangoDatos As Range Dim NuevaFila As Integer Dim Limpiar As String ' strTitulo = "EXCELeINFO" ' Continuar = MsgBox("Dar de alta los datos?", vbYesNo + vbExclamation, strTitulo) If Continuar = vbNo Then Exit Sub ' Set RangoDatos = ThisWorkbook.Worksheets("Datos").Cells(1, 1).CurrentRegion ' NuevaFila = RangoDatos.Rows.Count + 1 ' With ThisWorkbook.Worksheets("Datos") .Cells(NuevaFila, 1).Value = Date .Cells(NuevaFila, 2).Value = Format(Date, "dd") 'Día actual .Cells(NuevaFila, 3).Value = Format(Date, "mm") 'Mes actual .Cells(NuevaFila, 4).Value = Format(Date, "yy") 'Año actual .Cells(NuevaFila, 5).Value = ThisWorkbook.Sheets(1).Range("C6") 'Responsable .Cells(NuevaFila, 6).Value = ThisWorkbook.Sheets(1).Range("C9") 'Inventario .Cells(NuevaFila, 7).Value = ThisWorkbook.Sheets(1).Range("C12") 'Célula .Cells(NuevaFila, 8).Value = ThisWorkbook.Sheets(1).Range("C15") 'V.O.B.O. .Cells(NuevaFila, 9).Value = ThisWorkbook.Sheets(1).Range("F9") 'Se reemplaza .Cells(NuevaFila, 10).Value = ThisWorkbook.Sheets(1).Range("F12") 'Aplica pago .Cells(NuevaFila, 11).Value = ThisWorkbook.Sheets(1).Range("F15") 'Comentarios End With ' MsgBox "Alta exitosa.", vbInformation, strTitulo ' Limpiar = MsgBox("Deseas limpiar los campos de la captura?", vbYesNo, strTitulo) ' If Limpiar = vbYes Then With ActiveWorkbook.Sheets(1) .Range("C6").ClearContents .Range("C9").ClearContents .Range("C12").ClearContents .Range("C15").ClearContents .Range("F9").ClearContents .Range("F12").ClearContents 'ClearContents no funciona en celda combinada... .Range("F15").Value = "" End With Else End If ' End Sub
Descargar los archivos de ejemplo
Formulario de captura que guarda en otro archivo de Excel.rar