hoabattu3387
Thành viên chính thức


- Tham gia
- 11/9/08
- Bài viết
- 91
- Được thích
- 2
Bạn chỉnh code sau và chạy thử nhéMình có 1 file access lấy dữ liệu từ file excel vào bảng BVL để tạo ra 2 report BVL và VTB, file excel thay đổi theo ngày (cả nội dung lẫn tên file). Nhờ các bạn viết code giúp mình trên access để tự động lấy dữ liệu từ file excel.
Mình cảm ơn cả nhà!
On Error Resume Next
DoCmd.DeleteObject acTable, "BVL"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "BVL", "DuongDanDenFile", True, "DetailOfCreditTotalTransaction!A6:Z17"
Anh ơi, lệnh DoCmd.DeleteObject sẽ bị xóa cả bảng "BVL", nên lệnh DoCmd.TransferSpreadsheet không tìm thấy bảng "BVL" để import ạ.Bạn chỉnh code sau và chạy thử nhé
Mã:On Error Resume Next DoCmd.DeleteObject acTable, "BVL" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "BVL", "DuongDanDenFile", True, "DetailOfCreditTotalTransaction!A6:Z17"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "\\10.33.132.218\ktts\Doi soat\12. POS-BVL\THANG 09.17\28.09\28.09.xlsx", True, "DetailOfCreditTotalTransaction!A6:Z19"Anh ơi, lệnh DoCmd.DeleteObject sẽ bị xóa cả bảng "BVL", nên lệnh DoCmd.TransferSpreadsheet không tìm thấy bảng "BVL" để import ạ.
Nó sẽ xóa bảng BVL cũ và thay thế bằng bảng BVL mới chứ làm gì có chuyện báo lỗi không tìm thấy bảng BVL để import? Có chăng là không tìm thấy BVL để xóa thôi, cho nên tôi mới có dòng On error resume next đó.Anh ơi, lệnh DoCmd.DeleteObject sẽ bị xóa cả bảng "BVL", nên lệnh DoCmd.TransferSpreadsheet không tìm thấy bảng "BVL" để import ạ.
Sai cú pháp nhé.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "\\10.33.132.218\ktts\Doi soat\12. POS-BVL\THANG 09.17\28.09\28.09.xlsx", True, "DetailOfCreditTotalTransaction!A6:Z19"
e chạy riêng lệnh này vẫn báo lỗi ạ View attachment 183841
Sub importfile()
Dim tblefilename, tblename As String
tblefilename = Access.CurrentProject.Path
tblename = tblefilename & "\28.09.xlsx"
DoCmd.DeleteObject acTable, "BVL"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "BVL", tblename, True, "DetailOfCreditTotalTransaction!A6:Z19"
DoCmd.RunSavedImportExport "chi tiet gui bvl.xlsx"
End Sub
Túm lại bạn đã đưa dữ liệu vào được chưa?anh kiểm tra giúp em dòng code (DoCmd.RunSavedImportExport "chi tiet gui bvl.xlsx"), e muốn export bảng "chi tiet gui bvl" mà báo lỗi, e ko hiểu ạ.Mã:Sub importfile() Dim tblefilename, tblename As String tblefilename = Access.CurrentProject.Path tblename = tblefilename & "\28.09.xlsx" DoCmd.DeleteObject acTable, "BVL" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "BVL", tblename, True, "DetailOfCreditTotalTransaction!A6:Z19" DoCmd.RunSavedImportExport "chi tiet gui bvl.xlsx" End Sub
DoCmd.RunSavedImportExport "chi tiet gui bvl.xlsx"
IMPORT ĐƯỢC RỒI A Ạ, NHƯNG E CÓ THÊM YÊU CẦU MUỐN EXPORT QUERY "chi tiet gui bvl.xlsx" THÌ CÂU LỆNH TRÊN KHÔNG ĐC Ạ.Túm lại bạn đã đưa dữ liệu vào được chưa?
Câu lệnh
Mục đích của bạn làm gì?Mã:DoCmd.RunSavedImportExport "chi tiet gui bvl.xlsx"
View attachment 183858
Bạn có làm động tác trên khi Import dữ liệu không?
Câu lệnh trên đâu phải Export Query?IMPORT ĐƯỢC RỒI A Ạ, NHƯNG E CÓ THÊM YÊU CẦU MUỐN EXPORT QUERY "chi tiet gui bvl.xlsx" THÌ CÂU LỆNH TRÊN KHÔNG ĐC Ạ.
VẬY PHẢI LÀM THẾ NÀO HẢ A?Câu lệnh trên đâu phải Export Query?
Bạn thử như sau nhé.
DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="TenQueryCuaBan", OutputFormat:=acFormatXLSX
được rồi anh ạ, chỗ import vào bảng "BVL" ý anh, vì mỗi ngày 1 file dữ liệu khác nhau, nếu em muốn chọn đến dòng có dữ liệu (trừ dòng tổng cộng cuối cùng) thì có cách nào không anh, vì khi e tăng số dòng lên cao để đảm bảo dữ liệu luôn import vào hết thì lại bị dòng tổng cộng dính vào.Bạn thử như sau nhé.
Mã:DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="TenQueryCuaBan", OutputFormat:=acFormatXLSX
Import bình thường thì phải chịu thôi bạn, muốn theo ý phải dùng ADO.được rồi anh ạ, chỗ import vào bảng "BVL" ý anh, vì mỗi ngày 1 file dữ liệu khác nhau, nếu em muốn chọn đến dòng có dữ liệu (trừ dòng tổng cộng cuối cùng) thì có cách nào không anh, vì khi e tăng số dòng lên cao để đảm bảo dữ liệu luôn import vào hết thì lại bị dòng tổng cộng dính vào.
Dim cn As Object
Dim SourcePath As String
Set cn = CreateObject("ADODB.Connection")
SourcePath = "DuongDanDenFile\DetailOfCreditTotalTransaction_20170926_105939.xlsx"
Set cn = CurrentProject.Connection
cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & SourcePath & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
e sửa thế này nhưng vẫn bị báo lỗi, và thoát luôn access ạ, a xem giúp em sai chỗ nào với:Dim cn As Object
SourcePath As String Set cn = CreateObject("ADODB.Connection") SourcePath = "DuongDanDenFile\DetailOfCreditTotalTransaction_20170926_105939.xlsx" Set cn = CurrentProject.Connection cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & SourcePath & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")Mã:Sub importfile() On Error Resume Next Dim tblefilename, tblename As String tblefilename = Access.CurrentProject.Path FName = "\29.09.XLSX" tblename = tblefilename & FName DoCmd.DeleteObject acTable, "BVL" Dim cn As Object Set cn = CreateObject("ADODB.Connection") Set cn = CurrentProject.Connection cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & tblename & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null") DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="chi tiet gui bvl", OutputFormat:=acFormatXLSX, Outputfile:=tblefilename & "\chi tiet gui bvl.xlsx" DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="BVL", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\BVL.pdf" DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="VTB", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\VTB.pdf" End Sub
Bạn thử từng thủ tục xem nó lỗi ở dòng nào nhé.e sửa thế này nhưng vẫn bị báo lỗi, và thoát luôn access ạ, a xem giúp em sai chỗ nào với:
View attachment 183942
Bạn thử từng thủ tục xem nó lỗi ở dòng nào nhé.
cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & tblename & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
Bạn kiểm tra lại tiêu đề cột coi có đúng với tiêu đề cột trong bảng BVL không nhé. Mà trước khi báo lỗi hình trên nó có thông báo lỗi gì không bạn?đến dòng này thì báo lỗi và thoát luôn access ạ.Mã:cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & tblename & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
tiêu đề cột đúng a ạ, chạy qua dòngBạn kiểm tra lại tiêu đề cột coi có đúng với tiêu đề cột trong bảng BVL không nhé. Mà trước khi báo lỗi hình trên nó có thông báo lỗi gì không bạn?
Set cn = CurrentProject.Connection
Máy tôi chạy bình thường, bạn thử chạy code này từ file Excel coi nó có bị gì không nhétiêu đề cột đúng a ạ, chạy qua dòngthì báo lôĩ và thoát luôn access.Mã:Set cn = CurrentProject.Connection
cái chỗ "insert in to BVL..." liệu nó có hiểu insert vào bảng BVL ko anh?
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\POS.accdb")
cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & ThisWorkbook.FullName & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
e chạy từ excel thì được ạ. nhưng khi e sửa code như này vào accessMáy tôi chạy bình thường, bạn thử chạy code này từ file Excel coi nó có bị gì không nhé
Mã:Dim cn As Object Set cn = CreateObject("ADODB.Connection") cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\POS.accdb") cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & ThisWorkbook.FullName & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
Sub importfile()
Dim tblefilename, tblename As String
tblefilename = Access.CurrentProject.Path
FName = "\BVL.XLSX"
tblename = tblefilename & FName
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblename)
cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE= [DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="chi tiet gui bvl", OutputFormat:=acFormatXLSX, Outputfile:=tblefilename & "\chi tiet gui bvl.xlsx"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="BVL", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\BVL.pdf"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="VTB", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\VTB.pdf"
End Sub
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblename)
Bạn thử test code sau:e chạy từ excel thì được ạ. nhưng khi e sửa code như này vào access
thì báo lỗi "unreconigze database fomat" từ dòngMã:Sub importfile() Dim tblefilename, tblename As String tblefilename = Access.CurrentProject.Path FName = "\BVL.XLSX" tblename = tblefilename & FName Dim cn As Object Set cn = CreateObject("ADODB.Connection") cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblename) cn.Execute ("insert into BVL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE= [DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null") DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="chi tiet gui bvl", OutputFormat:=acFormatXLSX, Outputfile:=tblefilename & "\chi tiet gui bvl.xlsx" DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="BVL", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\BVL.pdf" DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="VTB", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\VTB.pdf" End Sub
Mã:cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblename)
Private Sub Command0_Click()
Dim tblefilename, tblename As String
tblefilename = Access.CurrentProject.Path
FName = "\DetailOfCreditTotalTransaction_20170926_105939.xlsx"
tblename = tblefilename & FName
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblefilename & "\POS.accdb")
cn.Execute ("insert into [BVL] SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & tblename & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="chi tiet gui bvl", OutputFormat:=acFormatXLSX, Outputfile:=tblefilename & "\chi tiet gui bvl.xlsx"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="BVL", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\BVL.pdf"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="VTB", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\VTB.pdf"
End Sub
Đã chạy oki rồi anh ạ. Em hỏi chút là dictionary có dùng được trong access không anh?em search google mà không thấy nói đến, em muốn query từng MiD và xuất ra các file excel 1 cách tự động (như query "chi tiet gui bvl" của em nhưng có bao nhiêu MID thì bấy nhiêu file chứ ko phải 1 file tổng hợp như hiện tại ạ)Bạn thử test code sau:
Có sẵn Query thì chỉ duyệt qua nó thôi, đâu cần dùng dic làm gì bạn.Đã chạy oki rồi anh ạ. Em hỏi chút là dictionary có dùng được trong access không anh?em search google mà không thấy nói đến, em muốn query từng MiD và xuất ra các file excel 1 cách tự động (như query "chi tiet gui bvl" của em nhưng có bao nhiêu MID thì bấy nhiêu file chứ ko phải 1 file tổng hợp như hiện tại ạ)
A giúp em để em học tập với ạ. Em chỉ nghĩ đến dic, nhưng ở excel thì e biết làm còn access e mới học nên chưa nghĩ ra cách ạ.Có sẵn Query thì chỉ duyệt qua nó thôi, đâu cần dùng dic làm gì bạn.
Tạo 1 recordset với câu truy vấn là select distinct MID..., rồi sau đó dùng vòng lặp duyệt qua từng dòng của field MID này, mỗi lần duyệt qua lấy giá trị gán vào điều kiện lọc và xuất file. LÀm như vậy sẽ gọn và linh hoạt hơn.A giúp em để em học tập với ạ. Em chỉ nghĩ đến dic, nhưng ở excel thì e biết làm còn access e mới học nên chưa nghĩ ra cách ạ.
A kiểm tra đoạn sau của e giúp e với sao recordcount chỉ có 1 record nhỉ? em có sai chỗ nào không ạ?Tạo 1 recordset với câu truy vấn là select distinct MID..., rồi sau đó dùng vòng lặp duyệt qua từng dòng của field MID này, mỗi lần duyệt qua lấy giá trị gán vào điều kiện lọc và xuất file. LÀm như vậy sẽ gọn và linh hoạt hơn.
Dim rcs As Recordset
Dim qry As QueryDef
Set qry = CurrentDb.QueryDefs("chi tiet gui bvl")
Set rcs = qry.OpenRecordset
MsgBox (rcs.RecordCount)
Bạn thêm dòng này trước Msgbox:A kiểm tra đoạn sau của e giúp e với sao recordcount chỉ có 1 record nhỉ? em có sai chỗ nào không ạ?
Mã:Dim rcs As Recordset Dim qry As QueryDef Set qry = CurrentDb.QueryDefs("chi tiet gui bvl") Set rcs = qry.OpenRecordset MsgBox (rcs.RecordCount)
E TẠO 1 QUERY "MID" VÀ LÀM NHƯ SAU MÀ BÁO LỖI, A XEM GIÚP EM THEO LINK SAU NHÉ (E KO POST ĐC FILE) https://drive.google.com/drive/folders/0By-1v-3ovcUWWWtrQzVyOTRmRGcTạo 1 recordset với câu truy vấn là select distinct MID..., rồi sau đó dùng vòng lặp duyệt qua từng dòng của field MID này, mỗi lần duyệt qua lấy giá trị gán vào điều kiện lọc và xuất file. LÀm như vậy sẽ gọn và linh hoạt hơn.
Làm cho bạn luôn.E TẠO 1 QUERY "MID" VÀ LÀM NHƯ SAU MÀ BÁO LỖI, A XEM GIÚP EM THEO LINK SAU NHÉ (E KO POST ĐC FILE) https://drive.google.com/drive/folders/0By-1v-3ovcUWWWtrQzVyOTRmRGc
Private Sub Command1_Click()
Dim db As DAO.Database
Dim rs, rs1 As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim mypath As String
mypath = Access.CurrentProject.Path
Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT DISTINCT MID FROM BVL", dbOpenDynaset)
Label3.Visible = True
txtMid.Visible = True
Do While Not rs.EOF
txtMid = rs("MID")
With DoCmd
.OpenReport "rptBVL", acViewPreview, , "[BVL].[MID]='" & txtMid & "'"
.OutputTo acOutputReport, "rptBVL", acFormatPDF, mypath & "\" & txtMid & ".pdf"
.Close acReport, "rptBVL"
Set qdf = db.QueryDefs("chi tiet gui bvl")
qdf.Parameters(0) = txtMid
Set rs1 = qdf.OpenRecordset
.OutputTo acOutputQuery, "chi tiet gui bvl", acFormatXLSX, mypath & "\" & txtMid & ".xlsx"
End With
rs.MoveNext
Loop
Label3.Visible = False
txtMid.Visible = False
Set rs = Nothing
Set rs1 = Nothing
Set db = Nothing
MsgBox "Da thuc hien xong viec xuat du lieu.", vbExclamation
End Sub
Em cảm ơn anh Hai Lúa ạ. Em đọc code của anh và đã hiểu tương đối ạ, nhưng anh có thể xem giúp em vì sao em dùng filter thì bị lỗi là do sai chỗ nào ạ? Em muốn học hỏi thêm cách này nữa. anh giúp em nhé.Làm cho bạn luôn.
Mã:Private Sub Command1_Click() Dim db As DAO.Database Dim rs, rs1 As DAO.Recordset Dim qdf As DAO.QueryDef Dim mypath As String mypath = Access.CurrentProject.Path Set db = CurrentDb() Set rs = db.OpenRecordset("SELECT DISTINCT MID FROM BVL", dbOpenDynaset) Label3.Visible = True txtMid.Visible = True Do While Not rs.EOF txtMid = rs("MID") With DoCmd .OpenReport "rptBVL", acViewPreview, , "[BVL].[MID]='" & txtMid & "'" .OutputTo acOutputReport, "rptBVL", acFormatPDF, mypath & "\" & txtMid & ".pdf" .Close acReport, "rptBVL" Set qdf = db.QueryDefs("chi tiet gui bvl") qdf.Parameters(0) = txtMid Set rs1 = qdf.OpenRecordset .OutputTo acOutputQuery, "chi tiet gui bvl", acFormatXLSX, mypath & "\" & txtMid & ".xlsx" End With rs.MoveNext Loop Label3.Visible = False txtMid.Visible = False Set rs = Nothing Set rs1 = Nothing Set db = Nothing MsgBox "Da thuc hien xong viec xuat du lieu.", vbExclamation End Sub
Giải nén và chạy file Access nhé.
xin lỗi anh, e vừa sharing rồi ạ.Tôi không tải file được vì không có quyền
View attachment 184510
Private Sub Command2_Click()
Dim tblefilename, tblename As String
tblefilename = Access.CurrentProject.Path
FName = "\BVL.xlsx"
tblename = tblefilename & FName
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & tblefilename & "\POS.accdb")
cn.Execute ("DELETE * FROM BVL")
cn.Execute ("insert into [BVL] SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & tblename & "].[DetailOfCreditTotalTransaction$A6:Z100] Where MID is not null")
Set cn = Nothing
End Sub
Private Sub Command3_Click()
Dim tblefilename, tblename As String
tblefilename = Access.CurrentProject.Path
FName = "\BVL.xlsx"
tblename = tblefilename & FName
DoCmd.OutputTo ObjectType:=acOutputQuery, ObjectName:="chi tiet gui bvl", OutputFormat:=acFormatXLSX, Outputfile:=tblefilename & "\chi tiet gui bvl.xlsx"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="BVL", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\BVL.pdf"
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:="VTB", OutputFormat:=acFormatPDF, Outputfile:=tblefilename & "\VTB.pdf"
Dim rcs, rcs1 As Recordset
Dim qry, qry1 As QueryDef
Set qry = CurrentDb.QueryDefs("chi tiet gui bvl")
Set qry1 = CurrentDb.QueryDefs("mid")
Set rcs = qry.OpenRecordset
rcs.MoveLast
rcs.Move first
Set rcs1 = qry1.OpenRecordset
For I = 0 To rcs1.RecordCount - 1
With rcs
.Filter = "[Mid] =" & rcs1!Mid
Set orcs = .OpenRecordset
.Close
orcs.MoveLast
orcs.MoveFirst
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, orcs, tblefilename & "\" & I & ".xlsx", True
End With
Next
Set rcs = Nothing
Set rcs1 = Nothing
Set cn = Nothing
End Sub
Bạn chỉnh code sau và chạy thử nhé
Mã:On Error Resume Next DoCmd.DeleteObject acTable, "BVL" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "BVL", "DuongDanDenFile", True, "DetailOfCreditTotalTransaction!A6:Z17"
DoCmd.TransferSpreadsheet(acImport, _
acSpreadsheetTypeExcel12Xml, "D:\data1.accdb\Sales", vFileSourceLink, _
False, "A2:K50000")