Excel VBA를 사용하여 MS Access 테이블로 데이터 내보내기
현재 다음 코드를 사용하여 워크시트에서 MS Access 데이터베이스로 데이터를 내보내고 있습니다.코드는 각 행을 루프하여 MS Access Table에 데이터를 삽입합니다.
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
위의 코드는 수백 줄의 레코드에서 정상적으로 동작하지만 25000개의 레코드와 같이 내보낼 데이터가 많아질 것입니다.모든 레코드를 루프하지 않고 SQL INSERT 문을 하나만 사용하여 모든 데이터를 MS에 일괄 삽입할 수 있습니다.한 번에 테이블에 액세스하시겠습니까?
어떤 도움이라도 주시면 대단히 감사하겠습니다.
편집: 문제 해결 완료
참고로 찾고 있는 사람이 있다면 아래의 코드를 많이 검색해 보았습니다만, SQL INSERT로 매우 빠릅니다(3초만에 레코드가 27648개).!!):
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
"Select *"를 사용하는 대신 특정 필드 이름을 추가하는 작업을 계속하고 있으며, 필드 이름을 추가하는 다양한 방법을 시도했지만 현재 사용할 수 없습니다.
모든 레코드를 루프하지 않고 내보낼 수 있습니까?
Excel에서 행 수가 많은 범위의 경우, 다음을 생성하면 성능이 향상될 수 있습니다.Access.Application
Excel의 객체를 사용하여 Excel 데이터를 Access로 Import합니다.다음 코드는 다음 테스트 데이터가 포함된 동일한 Excel 문서의 VBA 모듈에 있습니다.
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
@아메드
다음 코드는 MS Access에 삽입하기 위해 지정된 범위의 필드를 지정하는 코드입니다.이 코드의 장점은 Excel에서 원하는 필드에 이름을 붙일 수 있다는 것입니다(*을 사용하는 경우 Excel과 Access 사이에 정확히 일치해야 합니다). Access 컬럼은 dte라고 불리지만 Excel 컬럼은 Haha라고 이름 붙여져 있습니다.
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
언급URL : https://stackoverflow.com/questions/16161865/using-excel-vba-to-export-data-to-ms-access-table
'programing' 카테고리의 다른 글
ORDER BY 절이 뷰, 인라인 함수, 파생된 테이블, 하위 쿼리 및 일반 테이블 식에 유효하지 않습니다. (0) | 2023.04.17 |
---|---|
T-SQL에서 날짜/시간을 문자열로 변환하는 방법 (0) | 2023.04.17 |
디렉토리가 bash로 마운트되었는지 확인합니다. (0) | 2023.04.17 |
VBA에서 전원 쿼리를 자동화하는 방법 (0) | 2023.04.17 |
Windows NT 그룹/사용자에 대한 정보를 가져올 수 없습니다. (0) | 2023.04.17 |