Pasar valores de formulario Access a documento excel

Me gustaría saber sui es posible pasar los valores de un registro de formulario Access a un documento Excel. Si es así por favor indíquenme, que código tendría que poner en el evento "al hacer clic" de un botón de comando.

Respuesta
1

José María lo puede hacer como explico en este ejemplo:

DISEÑO HOJA DE EXCEL

FORMULARIO

Hago clic en el botón Exportar Excel y obtengo en EXCEL

CÓDIGO DEL BOTÓN 

Private Sub btnExportarExcel_Click()
 On Error GoTo hay_error
    ' Declarar variables
    Dim xlApp As excel.Application
    Dim xlbook As excel.Workbook
    Dim xlSheet As excel.Worksheet
    Dim intColumna As Integer
    Dim intFila As Integer
    Dim strArchivo As String
    'Si adiconamos a la tabla un campo boolean donde se controle
    'si el registro ya esta exportado para no repetirlo en Excel
    'Se debe adicionar este campo a la tabla
    strArchivo = CurrentProject.Path & "\empleados.xlsx"
    If EstaAbierto(strArchivo) Then
       MsgBox "El libro está abierto, cierrélo e intente nuevamente", vbCritical, "Le informo"
       Exit Sub
    End If
    ' Crear una instancia de Excel y abrir un libro existente o crear uno nuevo
    Set xlApp = New excel.Application
    Set xlbook = Nothing
    On Error Resume Next
    Set xlbook = xlApp.Workbooks(strArchivo)
    On Error GoTo 0
    If xlbook Is Nothing Then
        ' El libro no está abierto, lo abrimos
        Set xlbook = xlApp.Workbooks.Open(strArchivo)
    End If
    ' Seleccionar la hoja de trabajo donde se agregarán los datos
    Set xlSheet = xlbook.Worksheets("Hoja1")
    ' Moverse a la última fila de la hoja de trabajo
    intFila = xlSheet.Cells(xlSheet.Rows.count, "A").End(xlUp).Row + 1
    ' Escribir los datos del registro actual en la hoja de trabajo
    'Complete las columnas de acuerdo con los campos que vaya a exportar
    'y asugne el nombre del campo siguiendo el modelo de abajo
    intColumna = 1 ' Columna A
    xlSheet.Cells(intFila, intColumna).Value = Me.idempleado
    intColumna = 2 ' Columna B
    xlSheet.Cells(intFila, intColumna).Value = Me.idseccion
    intColumna = 3 ' Columna C
    xlSheet.Cells(intFila, intColumna).Value = Me.empleado
    intColumna = 4 ' Columna D
    xlSheet.Cells(intFila, intColumna).Value = Me.sueldo
    ' Guardar y cerrar el libro de Excel si no está abierto por otro proceso
    If xlbook.ReadOnly = False Then
        xlbook.Save
        xlbook.Close
    End If
    ' Liberar recursos
    Set xlSheet = Nothing
    Set xlbook = Nothing
    Set xlApp = Nothing
  If Err.Number = 0 Then
    MsgBox "Registro exportado a Excel satisfactoriamente.", vbInformation, "Le informo"
    'Aqui se puede hacer un UPDATE para marcar en un campo boolean a True si el
    'registro ya fue exportado, en este caso se debe adicionar a la tabla el campo
  End If
error_exit:
  Exit Sub
hay_error:
      MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
      Resume error_exit
End Sub

Este procedimiento necesita la siguiente Función a nivel del formulario para validar que el libro no esté abierto.

Function EstaAbierto(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:    EstaAbierto = False
    Case 70:   EstaAbierto = True
    Case Else: Error iErr
    End Select
End Function

Solo queda validar si ya fue exportado el registro. Le dejo la validación. Si quiere el ejemplo lo puede solicitar a [email protected] 

Observe como queda la hoja de Excel al pasar otros registros

¿Esta es la respuesta a su pregunta?

1 respuesta más de otro experto

Respuesta
1

El problema del formulario es que, en un principio, tiene muchos registros, Si le dijeras simplemente que te pasara el formulario te pasaría todos los registros que tuviera ese formulario. Por eso tendrías que individualizar ese registro en particular. Por ejemplo, tengo el formulario Productos, que tiene 80 registros y me voy al tercero

Cuando pulso el botón, me deja el libro de Excel Ejemplo

En este caso, repito, en este caso, en el botón tengo puesto

Private Sub Comando9_Click()
Me.RecordSource = "select * from productos where producto='" & Me.Producto & "'"
DoCmd.OutputTo acOutputForm, "Productos", "ExcelWorkbook(*.xlsx)", "C:\users\gonza\documentos\ejemplo.xlsx", False, "", , acExportQualityPrint
End Sub

La primera línea es para que el formulario sólo tenga un registro, por eso le modifico el origen de registros.

La segunda línea es para enviar sus valores a la hoja de Excel.

También podrías usar

Docmd. TransferSpreedSheet

Pero casi te diría que es mejor Importar desde Excel que Exportar desde Access a Excel.

Julián, Se trata de de ir creando registros en el formulario y que al hacer clic en el botón grabar, los datos se vaya pasando al documento Excel. Es decir, cada vez que grabemos un registro,

En Access, se cree una nueva línea en el documento Excel.

José María, lo siento, pero es que de Excel no tengo ni idea, y en particular de como decirle que una vez insertado un valor, el siguiente vaya a la primera fila vacía.

Personalmente opino, que lo que se puede hacer en Excel se puede hacer en Access. Cualquier fórmula de Excel, se reduce a un trozo de código, por lo que también se puede hacer en Access.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas