Kết nối giữa các file Excel bằng ADODC.

Liên hệ QC
Thật ấn tượng về tốc đô và kết quả phải không các bạn?. Cám ơn Ca da_fi cung cấp tài liệu giúp anh em.
 
Không ai trả lời mình ở bài #52 sao?
 
Mình thử nghiên cứu ADO về lọc duy nhất và thống kê theo mã lọc.
Qua sự hướng dẫn của Ptm012 mình làm thử file sau
Tính sotien theo ngày của từng Makh và gán tên KH (Vlookup). Nghĩa là vừa lọc duy nhất theo ngày, theo MaKH, cộng số tiền và gán thông tin KH và report.
PHP:
Sub TongHop()
Dim FName As String
Dim cnnEx As New ADODB.Connection
Dim RecEx As New ADODB.Recordset
Dim endR As Long, mySQL As String
With Sheet2
  endR = .Cells(65000, 1).End(xlUp).Row
  .Range(.Cells(1, 1), .Cells(endR, 3)).Name = "MyData"
End With
With Sheet1
  endR = .Cells(65000, 1).End(xlUp).Row
  .Range(.Cells(1, 1), .Cells(endR, 3)).Name = "dmkh"
End With

FName = ThisWorkbook.FullName
cnnEx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FName & _
                            ";Persist Security Info=False; Extended Properties=Excel 8.0;"
mySQL = "select Mydata.MaKH,  dmkh.TenKH, mydata.NgayGD, sum(Mydata.sotien) from [dmkh] "
mySQL = mySQL & "inner join [Mydata] on dmkh.MaKH = Mydata.MaKH "
mySQL = mySQL & "group by Mydata.MaKH,  dmkh.TenKH, mydata.ngaygd "
RecEx.Open mySQL, cnnEx, adOpenKeyset, adLockOptimistic
      With Sheet3
        .[A2:L1000].ClearContents
        .[a2].CopyFromRecordset RecEx
      End With
        RecEx.Close: Set RecEx = Nothing
        cnnEx.Close: Set cnEx = Nothing
        Sheet3.Activate
End Sub
Các bạn triển khai tiếp thêm gán theo định mức.
Cám ơn.
 

File đính kèm

  • ViDuADORelation.xls
    49 KB · Đọc: 149
Bài này, mình đề xuất 1 phương án trích tạo sổ sách báo cáo sao cho thật linh hoạt và code ngăn nhất. Đông thời cũng là code tạo danh sách duy nhất khá gọn ( 3 trong 1:Các ngày có PS, Các TK có PS, Các Đối tương có PS). Đây chỉ là phương án thôi nên còn hạn chế và lỗi. Chỉ yêu cầu người dùng biết chút về viết SQL là chủ động tạo sổ sách, báo cáo rồi. Xin lỗi mình chưa trang trí tạo tiêu đề cho sổ.
Riêng phần kết nối mình đưa vào biến công cộng, khi cần dùng cứ việc gọi. Ta dùng loạt bài đầu để rút dữ liệu từ các file khác nhau là có thể tạo file sosach dùng chung. Như vậy, ta loại được sổ sách báo cáo ra khỏi file nhập dữ liệu làm cho file dữ liệu hoàn toàn tự do và nhẹ nhàng phục vụ mục đính chính là nhập dữ liệu.
Các bạn xem và góp ý cho mình với.
 

File đính kèm

  • SO KE TOAN 2.rar
    100.8 KB · Đọc: 297
Lần chỉnh sửa cuối:
Bài này, mình đề xuất 1 phương án trích tạo sổ sách báo cáo sao cho thật linh hoạt và code ngăn nhất. Đông thời cũng là code tạo danh sách duy nhất khá gọn ( 3 trong 1:Các ngày có PS, Các TK có PS, Các Đối tương có PS). Đây chỉ là phương án thôi nên còn hạn chế và lỗi. Chỉ yêu cầu người dùng biết chút về viết SQL là chủ động tạo sổ sách, báo cáo rồi. Xin lỗi mình chưa trang trí tạo tiêu đề cho sổ.
Riêng phần kết nối mình đưa vào biến công cộng, khi cần dùng cứ việc gọi. Ta dùng loạt bài đầu để rút dữ liệu từ các file khác nhau là có thể tạo file sosach dùng chung. Như vậy, ta loại được sổ sách báo cáo ra khỏi file nhập dữ liệu làm cho file dữ liệu hoàn toàn tự do và nhẹ nhàng phục vụ mục đính chính là nhập dữ liệu.
Các bạn xem và góp ý cho mình với.

Nếu trường hợp Data mà số dòng > 65.536 thì chuyển sang Excel 2007 sẽ bị lỗi kết nối.
PHP:
cnex.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
FName & ";Persist Security Info=False; Extended Properties=Excel 8.0;"
cnex.Open
Và câu kết nối trên em nghĩ nếu thay bằng câu sau cho dễ hiểu

PHP:
Dim ConnectionString
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FName & ""
ConnectionString = ConnectionString & ";Persist Security Info=False; Extended Properties=Excel 8.0;"""
cnex.Open ConnectionString

Bác khắc phục giúp. Cám ơn Bác!
 
Mình không có Excel2007 nên không test được, Thu Nghi tham khảo ở đây xem
 
Mình không có Excel2007 nên không test được, Thu Nghi tham khảo ở đây xem

Sau khi tham khảo link và có sự HD của Bác Mỹ (PTM0412) em đã làm OK rồi.
Các Bác giỏi thật.
Chỉ cần thay
PHP:
Provider=Microsoft.Jet.OLEDB.4.0

PHP:
Extended Properties=Excel 8.0

Thành
PHP:
Provider=Microsoft.ACE.OLEDB.12.0

PHP:
Extended Properties=Excel 12.0

Em đang cân nhắc các tham số HDR=Yes/No hay IMEX=1.
Các Bác demo cho các em học hỏi.
Xin cám ơn chân thành!
 
HDR = 1 để xác định dòng đầu là tên field

HDR = 0 để lấy luôn dòng đâu như là 1 record, khi copy kết quả xuống sheet.

Nếu dùng HDR = 0 thì với dữ liệu kiểu số, mà record đầu là tên filed, là text, nguyên field sẽ bị coi là text.

Do đó phải dùng IMEX = 1, mục đích để Excel nhận dạng lại type của dữ liệu trên cả field, không chỉ căn cứ trên dòng đầu.

Nói thêm, khuyến cáo nên dùng IMEX = 1 dù cho HDR = Yes hay No, để ADO không nhận dạng type dữ liệu bị sai, nhất là khi bảng tính định dạng General, và/ hoặc field dữ liệu bỏ trống record đầu.

Lý do là ADO khi đọc dòng dầu thấy ô trống, nó sẽ đoán (guess) 1 trong các kiểu là:
- Numeric và giá trị zero
- Text và giá trị blank
- DateTime và giá trị blank

Mà không phải lúc nào cũng đoán đúng.
 
Tôi có 2 Sheet:
Sheet1: Mua

[NGAY_CT], [SO_CT], [NGAYMUA], [MA_KHCC], [TEN_NGUOIBAN], [Địa chỉ], [MA_HH], [TENHANG], [SOLUONG], [DONGIA], [THANHTIEN], . . .

Sheet2: Trả tiền
[NGAY_CT], [SO_CT], [NGAYTRA], [DIENGIAI], [SOTIEN], [GHICHU]

Tôi muốn Tổng hợp số liệu từ 2 bảng trên vào Sheet_TONGHOP
có các tiêu đề sau:

[NGAY_VS], [SO_CT], [NGAY_CT], [MA_KHCC], [DIENGIAI], [PHAITRA], [DATRA], CONLAI]

Vậy tôi phải viết code ra sao Chỉ giùm với các bác ơi !!!!!!
 
Chỉnh sửa lần cuối bởi điều hành viên:
NGAY_VS là ngày gì?
SO_CT là số CT của mua hay trả tiền?
NGAY_CT là ngày CT mua hay ngày trả tiền?
 
Web KT
Back
Top Bottom