Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Cách tăng tốc độ Copy Paste Excel sang Access
#1
Em chào các bác ạ, em có vấn đề muốn hỏi thế này, đây là code em sưu tầm, áp dụng vào chương trình:
Mã PHP:
Private Sub cmdTongHop_Click()
   Dim Ex As Object
   Dim Wb 
As Object
   Dim Ws 
As Object
   Dim DuongDan 
As Recordset
   Dim TongHop 
As Recordset
   Dim i 
As LongAs Long
   Set DuongDan 
CurrentDb.OpenRecordset("tblDuongDan"dbOpenTable)
   Set TongHop CurrentDb.OpenRecordset("tblTongHop"dbOpenTable)
   If TongHop.RecordCount 0 Then Call XoaTable("tblTongHop")
   DuongDan.MoveFirst
   Do Until DuongDan
.EOF
   
       Set Ex 
CreateObject("Excel.Application")
       Set Wb Ex.Workbooks.Open(DuongDan.Fields(0))
       Set Ws Wb.Sheets("G035841")
           
       For i 
19 To 833
           TongHop
.AddNew
           TongHop
.Fields(0) = Ws.Range("C3")
           TongHop.Fields(1) = Ws.Range("H" i)
           TongHop.Fields(2) = Ws.Range("I" i)
           TongHop.Fields(3) = Ws.Range("B" i)
           TongHop.Fields(4) = Ws.Range("C" i)
           TongHop.Update
       Next
       Wb
.Close
       Set Ex 
Nothing
       DuongDan
.MoveNext
   Loop
   MsgBox 
"Xong"
End Sub 

Mục đích chọn file exel trong 1 folder bất kỳ rồi lặp mở từng đường dẫn và Copy Range cố định các cột H,I,B,C và các dòng từ dòng 19 đến 833 vào Table access (tblTongHop). 1 2 file Excel test thử thì nhanh, nhưng thực tế là copy 100 file excel thì nó cứ next next từng dòng vậy hơi lâu. Cho em hỏi có cách nào tăng tốc copy không ạ. Mảng kia là cố định, 1 cột tương ứng 1 Field, và chỉ có ngần kia dòng (19 to 833)
Em xin cảm ơn các bác ạ!
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn
#2
Dùng Mảng hoặc ADODB đi
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#3
(18-04-19, 05:24 PM)Xuân Thanh Đã viết: Dùng Mảng hoặc ADODB đi

Dạ, bác cho em hướng dẫn với, em cũng mang máng hiểu dùng mảng nhưng không biết áp dụng, sử dụng
Chữ ký của vuthaiha90 vuthaiha90,gia nhập Thủ Thuật Access từ 26-02 -16.
Reply
Những người đã cảm ơn
#4
Bạn nên viết Code đưa Excel sang Table tạm thời. Sau đó dùng dữ liệu của bảng tạm này thao tác với Query sẽ nhanh hơn rất nhiều so với bạn dùng Open Workbook. Sau khi bạn lấy dữ liệu xong thì xóa bảng đó đi.
Mỗi một vòng lặp là một quy trình như trên. Không khó đâu mà

Xóa Table
If TableExists("tableName") Then
DoCmd.DeleteObject acTable, "tableName"
End If

Add Table
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "tableName", "filePath", True
Chữ ký của duynamvnn1208 duynamvnn1208,gia nhập Thủ Thuật Access từ 25-06 -17.
Reply
Những người đã cảm ơn
#5
(19-04-19, 04:45 PM)duynamvnn1208 Đã viết: Bạn nên viết Code đưa Excel sang Table tạm thời. Sau đó dùng dữ liệu của bảng tạm này thao tác với Query sẽ nhanh hơn rất nhiều so với bạn dùng Open Workbook. Sau khi bạn lấy dữ liệu xong thì xóa bảng đó đi.
Mỗi một vòng lặp là một quy trình như trên. Không khó đâu mà

Xóa Table
If TableExists("tableName") Then
   DoCmd.DeleteObject acTable, "tableName"
End If

Add Table
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "tableName", "filePath", True

Đây cũng là một cách.
Dùng ADODB thì không cần mở file nguồn nhé.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#6
(19-04-19, 08:53 PM)ongke0711 Đã viết:
(19-04-19, 04:45 PM)duynamvnn1208 Đã viết: Bạn nên viết Code đưa Excel sang Table tạm thời. Sau đó dùng dữ liệu của bảng tạm này thao tác với Query sẽ nhanh hơn rất nhiều so với bạn dùng Open Workbook. Sau khi bạn lấy dữ liệu xong thì xóa bảng đó đi.
Mỗi một vòng lặp là một quy trình như trên. Không khó đâu mà

Xóa Table
If TableExists("tableName") Then
   DoCmd.DeleteObject acTable, "tableName"
End If

Add Table
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "tableName", "filePath", True

Đây cũng là một cách.
Dùng ADODB thì không cần mở file nguồn nhé.

đẩy qua ADODB không phải mở file nguồn nhưng bản chất vẫn là đẩy dữ liệu qua ADO.
Lợi điểm cách của mình là dùng luôn query trực tiếp chứ không phải thao tác với Recordset. Với một thanh niên ngại lắm mới dùng đến Code như mình thì dùng Query thích hơn laughing
Chữ ký của duynamvnn1208 duynamvnn1208,gia nhập Thủ Thuật Access từ 25-06 -17.
Reply
Những người đã cảm ơn
#7
(20-04-19, 10:10 PM)duynamvnn1208 Đã viết: đẩy qua ADODB không phải mở file nguồn nhưng bản chất vẫn là đẩy dữ liệu qua ADO.
Lợi điểm cách của mình là dùng luôn query trực tiếp chứ không phải thao tác với Recordset. Với một thanh niên ngại lắm mới dùng đến Code như mình thì dùng Query thích hơn laughing

- Tôi có nói ADODB không phải là ADO đâu đồng chí?
- ADO recordset nó lưu trực tiếp trên bộ nhớ (memory) và xử lý trên đó nên không có chuyện chậm đâu nhé.
- Tôi không phản đối tạo table tạm nhưng ứng dụng nên thiết kế thêm tính Compact dữ liệu định kỳ vì việc tạo, xoá table cũng sẽ có tạo file rác trong table hệ thống.
Phải phân biệt cho rõ trường hợp trong bài của chủ thớt là dùng mảng, ADO Recordset hay Table tạm để xử lý. Còn việc tạo table tạm thì lại  có mấy cách như bạn đề xuất là dùng TransfrerSpreadsheet hoặc dùng ADO kết nối lấy dữ liệu về Table tạm

ADO là công cụ mạnh và phổ biến để Access kết nối, thao tác với các nguồn dữ liệu khác ngoài AccessL: SQL Server, Excel, Text file ...
Khi lấy dữ liệu bằng ADO, bạn có thể chủ động chọn các trường dữ liệu, số dòng dữ liệu để import vào Access chứ không phải như lệnh "TransferSpreadsheet" là phải import toàn bộ file Excel. Ví dụ: bạn chỉ cần import một cái range nào đó trong Sheet chỉ định nào đó của Workbook Excel thì ADO sẽ làm được thông qua khai báo Name hoặc Range. Tại sao chỉ cần import hoặc lấy dữ liệu một cái range nào đó thôi vì trong thực tế file dữ liệu excel của người ta thường có định dạng mấy dòng đầu là dành cho thông tin giứoi thiệu, tiêu đề, ngày tháng v.v.v.. sau đó đến mấy dòng kế tiếp mới là dữ liệu theo hàng/cột. Hơn nữa có khi ta cũng không cần nạp hết các cột có trong sheet Excel nên ADO làm được chuyện này.
Đối với lệnh TransferSpreadsheet, file excel của bạn phải bỏ hết mấy dòng tiêu đề linh tinh mà tiêu đề cột phải bắt đầu ngay dòng số 1 thì dữ liệu mới import chuẩn và buộc phải import toàn bộ, chứ không có chọn lọc cột như dùng ADO.

Nói chung tuỳ trường hợp mà dùng các cách trên, quan trọng là hiểu rõ thế mạnh, yếu của từng cách mà dùng thôi.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan
#8
Mình hiểu ý bạn nói mà. Chắc do mình nói không rõ.
Về tốc độ thì nguyên lý của ADO sẽ nhanh hơn là chắc rồi, nhưng cần Code xong code cũng khó hơn việc dùng Query thông thường.
Thật ra một bài toán thì có nhiều cách giải, còn tùy vào dữ liệu đầu bài cho mà chọn cách nào.
Chữ ký của duynamvnn1208 duynamvnn1208,gia nhập Thủ Thuật Access từ 25-06 -17.
Reply
Những người đã cảm ơn maidinhdan


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Chuyển nhiều file Word sang PDF jeck09nt 3 247 25-04-19, 03:52 PM
Bài mới nhất: jeck09nt
  [Hỏi] Trộn văn bản Word từ dữ liệu trong table Access vuthaiha90 15 601 17-04-19, 10:02 AM
Bài mới nhất: Xuân Thanh
  Hướng Dẫn Demo tổng hợp xuất Table, Query sang Excel có điều kiện ở vị trí nào cũng được maidinhdan 20 8,463 15-04-19, 03:48 PM
Bài mới nhất: Xuân Thanh
  Kết nối Access với Database Oracle trong mạng LAN macd 3 225 12-04-19, 12:59 PM
Bài mới nhất: Xuân Thanh
  [Hỏi] Import nhiều file Excel vào Table Access vuthaiha90 33 4,706 16-01-19, 11:45 PM
Bài mới nhất: khuuquytrung

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line| Phần mềm quản lý bán hàng, công nợ- tồn kho- nhà phân phối