varios valores una tabla registros registro modificar insertar eliminar datos borrar actualizar sql excel-vba ms-access access-vba vba

sql - valores - Usando Excel VBA para exportar datos a la tabla de MS Access



modificar datos de una tabla mysql (2)

¿Es posible exportar sin recorrer todos los registros?

Para un rango en Excel con un gran número de filas, puede ver algunas mejoras en el rendimiento si crea un objeto Access.Application en Excel y luego lo usa para importar los datos de Excel en Access. El siguiente código se encuentra en un módulo VBA en el mismo documento de Excel que contiene los siguientes datos de prueba

Option Explicit Sub AccImport() Dim acc As New Access.Application acc.OpenCurrentDatabase "C:/Users/Public/Database1.accdb" acc.DoCmd.TransferSpreadsheet _ TransferType:=acImport, _ SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _ TableName:="tblExcelImport", _ Filename:=Application.ActiveWorkbook.FullName, _ HasFieldNames:=True, _ Range:="Folio_Data_original$A1:B10" acc.CloseCurrentDatabase acc.Quit Set acc = Nothing End Sub

Actualmente estoy usando el siguiente código para exportar datos de la hoja de trabajo a la base de datos de MS Access, el código está en bucle a través de cada fila e insertar datos en la tabla de MS Access.

Public Sub TransData() Application.ScreenUpdating = False Application.EnableAnimations = False Application.EnableEvents = False Application.DisplayAlerts = False ActiveWorkbook.Worksheets("Folio_Data_original").Activate Call MakeConnection("fdMasterTemp") For i = 1 To rcount - 1 rs.AddNew rs.Fields("fdName") = Cells(i + 1, 1).Value rs.Fields("fdDate") = Cells(i + 1, 2).Value rs.Update Next i Call CloseConnection Application.ScreenUpdating = True Application.EnableAnimations = True Application.EnableEvents = True Application.DisplayAlerts = True End Sub

Public Function MakeConnection(TableName As String) As Boolean ''*********Routine to establish connection with database Dim DBFullName As String Dim cs As String DBFullName = Application.ActiveWorkbook.Path & "/FDData.mdb" cs = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";" Set cn = CreateObject("ADODB.Connection") If Not (cn.State = adStateOpen) Then cn.Open cs End If Set rs = CreateObject("ADODB.Recordset") If Not (rs.State = adStateOpen) Then rs.Open TableName, cn, adOpenKeyset, adLockOptimistic End If End Function

Public Function CloseConnection() As Boolean ''*********Routine to close connection with database On Error Resume Next If Not rs Is Nothing Then rs.Close End If If Not cn Is Nothing Then cn.Close End If CloseConnection = True Exit Function End Function

El código anterior funciona bien para unos pocos cientos de líneas de registros, pero aparentemente habrá más datos para exportar. Como 25000 registros, es posible exportar sin hacer un bucle a través de todos los registros y solo una instrucción SQL INSERT para insertar de forma masiva todos los datos en Ms.Access Tabla de una sola vez?

Cualquier ayuda será muy apreciada.

EDITAR: NÚMERO RESUELTO

Solo para obtener información, si alguien busca esto, hice una gran cantidad de búsquedas y encontré que el siguiente código funciona bien para mí, y es muy rápido debido a SQL INSERT, (27648 registros en solo 3 segundos !!!! ):

Public Sub DoTrans() Set cn = CreateObject("ADODB.Connection") dbPath = Application.ActiveWorkbook.Path & "/FDData.mdb" dbWb = Application.ActiveWorkbook.FullName dbWs = Application.ActiveSheet.Name scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath dsh = "[" & Application.ActiveSheet.Name & "$]" cn.Open scn ssql = "INSERT INTO fdFolio ([fdName], [fdOne], [fdTwo]) " ssql = ssql & "SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh cn.Execute ssql End Sub

Aún trabajando para agregar nombres de campos específicos en lugar de usar "Seleccionar *", probé varias formas de agregar nombres de campos, pero no puedo hacer que funcione por ahora.


@Ahmed

A continuación se encuentra el código que especifica los campos de un rango con nombre para su inserción en MS Access. Lo bueno de este código es que puede asignar un nombre a sus campos en Excel como lo desee (si usa *, entonces los campos deben coincidir exactamente entre Excel y Access), como puede ver, he nombrado una columna de Excel "Haha" a pesar de que la columna de acceso se llama "dte".

Sub test() dbWb = Application.ActiveWorkbook.FullName dsh = "[" & Application.ActiveSheet.Name & "$]" & "Data2" ''Data2 is a named range sdbpath = "C:/Users/myname/Desktop/Database2.mdb" sCommand = "INSERT INTO [main] ([dte], [test1], [values], [values2]) SELECT [haha],[test1],[values],[values2] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh Dim dbCon As New ADODB.Connection Dim dbCommand As New ADODB.Command dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sdbpath & "; Jet OLEDB:Database Password=;" dbCommand.ActiveConnection = dbCon dbCommand.CommandText = sCommand dbCommand.Execute dbCon.Close End Sub