Ghi Dữ Liệu Vào File Đóng Bằng ADO

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,033
Giới tính
Nam
Mình có viết một chương trình Bán hàng...sử dụng VBA để ghi dữ liệu từ file chuơngTrinh.xlsb vào File Data.xlsb hiện tại sử dụng tốt ...
Nhưng khi dữ liệu File Data càng lớn thì thấy nó hơi chậm lại...vì vậy mình muốn chuyển qua sử dụng ADO với code có chức năng tương tự nhưng kẹt chưa làm được ...Vậy úp lên nhờ các Bạn trợ giúp

1/ vùng dữ liệu cần ghi từ File chuongTrinh là [A6:J82]

2/ điều kiện ghi là từ [C6:C82] nếu Cells nào có dữ liệu thì lọc ghi theo dòng đó (khó khúc này ADO là mình Tịt...Nếu ghi nguyên vùng thì OK)

3/ Ghi vào Sheets("Data_Ban")File Data.xlsb nối tiếp xuống dưới tương tự như Code VBA mình viết....sau khi ghi xong thì chay Sub Auto_Open trong File Data.xlsb
Xin cảm ơn các Bạn đã trợ giúp...
Code VBA
PHP:
Public Sub LuuData_Ban()
Application.ScreenUpdating = False
Dim Nguon(), Kq(), i&, j&, k&
Nguon = ActiveSheet.Range("A6:J82").Value
ReDim Kq(1 To UBound(Nguon, 1), 1 To UBound(Nguon, 2))
For i = 1 To UBound(Nguon, 1)
    If Nguon(i, 3) <> "" Then 
       k = k + 1
        For j = 1 To UBound(Nguon, 2)
            Kq(k, j) = Nguon(i, j)
        Next
    End If
Next
With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsb", 0)
    .Sheets("Data_Ban").Range("A65536").End(3)(2).Resize(k, UBound(Nguon, 2)) = Kq
    .RunAutoMacros (xlAutoOpen) ''Chay Sub Auto_Open Trong File Data
    .Close True
End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Hoi Bai.rar
    38.8 KB · Đọc: 71
code dưới đây thực hiện các nhiệm vụ
chèn dữ liệu vào sheet Data_Ban
cập nhật lại sheet NGUON
Cập nhật toàn bộ bảng Sheet XNT
gán ngược lại kết quả cho vùng M:N
muốn xài được code này cần phải :
Xóa hết code đang có trong file Data.xlsb
Xóa hết công thức hàng 1 của sheet XNT
Tuyệt đối đóng file Data.xlsb khi chạy code
Mã:
Public Sub GotoHell()
Dim Cn As Object, rs As Object, arrNHAP As Variant, arrBAN As Variant
Dim r As Long, c As Integer, arrSUM(1 To 9) As Double, arrView As Variant
Set Cn = CreateObject("ADODB.Connection")
Cn.Open ("provider=Microsoft.ACE.OLEDB.12.0; data source=" & _
        ThisWorkbook.Path & "\data.xlsb" & _
                 ";extended properties=""Excel 12.0;hdr=no"";")
Cn.Execute ("insert into [Data_Ban$A2:J] " & _
"select * from [" & ThisWorkbook.FullName & ";hdr=no].[BanHang$A6:J] where f3 is not null")


Cn.Execute ("insert into [NGUON$B3:B] select a.f1 from " & _
"(select distinct f1 from [Data_Nhap$B2:B] where f1 is not null) a left join " & _
"(select f1 from [NGUON$B3:B] where f1 is not null) b on a.f1 = b.f1 where b.f1 is null")


Set rs = Cn.Execute("select b.f1,a.sf2,a.sf5 from " & _
"(select f1,sum(f2) as sf2,sum(f5) as sf5 from [Data_Nhap$B2:F] " & _
"where f1 is not null group by f1 ) a " & _
"right join (select f1 from [NGUON$B3:B] where f1 is not null) b " & _
"on a.f1 = b.f1 order by b.f1")
arrNHAP = rs.GetRows
rs.Close


Set rs = Cn.Execute("select b.f1,a.sf2,a.sf5 from " & _
"(select f1,sum(f2) as sf2,sum(f5) as sf5 from [Data_Ban$B2:F] " & _
"where f1 is not null group by f1 ) a " & _
"right join (select f1 from [NGUON$B3:B] where f1 is not null) b " & _
"on a.f1 = b.f1 order by b.f1")
arrBAN = rs.GetRows
rs.Close


rs.Open "select * from [XNT$B1:K" & UBound(arrBAN, 2) + 3 & "]", Cn, , 3
rs.MoveNext
rs.MoveNext
ReDim arrView(1 To UBound(arrBAN, 2) + 1, 1 To 2)
For r = 0 To UBound(arrBAN, 2) Step 1
    arrView(r + 1, 1) = arrNHAP(0, r)
    rs("f1") = arrNHAP(0, r)
    rs("f2") = arrNHAP(1, r)
    rs("f3") = arrNHAP(2, r)
    rs("f4") = arrBAN(0, r)
    rs("f5") = arrBAN(1, r)
    rs("f6") = arrBAN(2, r)
    rs("f7") = arrBAN(0, r)
    If IsNumeric(arrNHAP(1, r)) And IsNumeric(arrNHAP(2, r)) And _
       IsNumeric(arrBAN(1, r)) And IsNumeric(arrBAN(2, r)) Then
        rs("f8") = arrNHAP(1, r) - arrBAN(1, r)
        rs("f9") = (arrBAN(2, r) / arrBAN(1, r) - arrNHAP(2, r) / arrNHAP(1, r)) * arrBAN(1, r)
        rs("f10") = arrNHAP(2, r) - arrBAN(2, r) + rs("f9")
    Else
        rs("f8") = 0
        rs("f9") = 0
        rs("f10") = 0
    End If
    arrView(r + 1, 2) = rs("f8")
    For c = 2 To 10 Step 1
        If IsNumeric(rs("f" & c)) Then arrSUM(c - 1) = arrSUM(c - 1) + rs("f" & c)
    Next
    rs.MoveNext
Next
rs.MoveFirst
For c = 2 To 10 Step 1
    If arrSUM(c - 1) > 0 Then rs("f" & c) = arrSUM(c - 1)
Next
rs.MoveLast
rs.Close
Cn.Close
Sheet1.Range("M6:N1000").ClearContents
Sheet1.Range("M6").Resize(UBound(arrView), 2).Value = arrView
End Sub
Code dài quá, có thể rút ngắn và viết cho dễ hiểu được không?
 
Upvote 0
Mình dùng Exc2003 nên không thể Test nên chưa biết mục tiêu có đạt không? Đã so sánh với các phương pháp khác chưa? Mong chủ Topic thông tin cho tham khảo cùng.
 
Upvote 0
Mình dùng Exc2003 nên không thể Test nên chưa biết mục tiêu có đạt không? Đã so sánh với các phương pháp khác chưa? Mong chủ Topic thông tin cho tham khảo cùng.
1/ Hiện tại cách Bài #1 của mình sử dụng VBA rất tốt ...code dễ hiểu, mình viết được và đồng bộ với code ở File Data. nhưng có nhược điểm là File Data Càng lớn thì Tốc độ chậm lại

2/ Còn Code doveandrose Viết cho có một code bấm cái là xong Nhưng code đó mức độ khó và phức tạp quá nên mình lưu lại để nghiên cứu (Vì mình chưa đủ khả năng tùy chỉnh code đó mà phải lệ thuộc hoàn toàn...nếu Mình ko biết gì về code thì Ok ... còn mình vẫn viết được = VBA)

3/ Mong Muốn của mình là nhờ trợ giúp viết một code bằng ADo có chức năng tương tự code VBA Bài #1 Khi Ghi dữ liệu vào File Data xong Thì Chạy sub Auto_open() File Data....có như vậy thì mình mới làm chủ hoàn toàn được chương trình của mình và mình tùy biến các kiểu được

Xin cảm ơn Các Bạn rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
1/ Hiện tại cách Bài #1 của mình sử dụng VBA rất tốt ...code dễ hiểu, mình viết được và đồng bộ với code ở File Data. nhưng có nhược điểm là File Data Càng lớn thì Tốc độ chậm lại

2/ Còn Code doveandrose Viết cho có một code bấm cái là xong Nhưng code đó mức độ khó và phức tạp quá nên mình lưu lại để nghiên cứu (Vì mình chưa đủ khả năng tùy chỉnh code đó mà phải lệ thuộc hoàn toàn...nếu Mình ko biết gì về code thì Ok ... còn mình vẫn viết được = VBA)

3/ Mong Muốn của mình là nhờ trợ giúp viết một code bằng ADo có chức năng tương tự code VBA Bài #1 Khi Ghi dữ liệu vào File Data xong Thì Chạy sub Auto_open() File Data....có như vậy thì mình mới làm chủ hoàn toàn được chương trình của mình và mình tuy biến các kiểu được

Xin cảm ơn Các Bạn rất nhiều
Sắp xếp lại CSDL, file data thì chỉ để lưu trữ dữ liệu, muốn cần tồn kho thì lấy thẳng ra file báo cáo. Ai lại ghi ngược lại Data cái tồn kho đó làm chi cho tốn bộ nhớ.
 
Upvote 0
Sắp xếp lại CSDL, file data thì chỉ để lưu trữ dữ liệu, muốn cần tồn kho thì lấy thẳng ra file báo cáo. Ai lại ghi ngược lại Data cái tồn kho đó làm chi cho tốn bộ nhớ.
Mình thiết kế một Sheet Vùa Bán hàng và Vừa nhập hàng chung Một Sheet chỉ khác nhau Nút lưu bán và lưu Nhập và code khác

Bạn nhìn cái hình mình úp là hiểu ý đồ của mình

1/ Khi mình nhập hay bán hàng cũng từ Form đó nó lưu vào File data sau khi lưu xong Xuất kết quả tồn lên File chương trình cho mình Hai cột Hàng Còn Tồn bên tay Phải hình [M:N]

2/ Mình thiết kế như vậy tiện cho mình bán hàng và nhập hàng khi mình nhập số lượng bán hay nhập thì mình nhìn qua hai cột Hàng Còn Tồn thì biết còn bao nhiêu mà nhập và bán

3/ Trong Private Sub Worksheet_Change(ByVal Target As Range) Mình viết code Check điều kiện Cột [C6:C82] với cột số lượng tồn [M:N] nếu số lượng vượt Quá tồn thì không cho xuất

4/ Tóm lại mình vừa bán hàng, nhập hàng mà kiểm soát được hết số lượng nhập vào và bán ra theo hai cột Hàng Còn Tồn bên tay phải hình [M:N]

 

File đính kèm

  • Capture.jpg
    Capture.jpg
    24 KB · Đọc: 85
Lần chỉnh sửa cuối:
Upvote 0
Mình thiết kế một Sheet Vùa Bán hàng và Vừa nhập hàng chung Một Sheet chỉ khác nhau Nút lưu bán và lưu Nhập và code khác

Bạn hình cái hình mình úp là hiểu ý đồ của mình

1/ khi mình nhập hàng vào cũng từ Form đó nó lưu vào File data sau khi lưu xong Xuất kết quả tồn lên File chương trình cho mình Hai cột hàng còn tồn bên tay Phải hình [M:N]

2/ Mình thiết kế như vậy tiện cho mình bán hàng và nhập hàng khi mình nhập số lượng bán hay nhập thì mình nhìn qua hai cột Hàng còn tồn thì biết còn bao nhiêu mà nhập và bán

3/ Trong Private Sub Worksheet_Change(ByVal Target As Range) Mình viết code Check điều kiện Cột [C6:C82] với cột số lượng tồn nếu số lượng vượt Quá tồn thì không cho xuất

4/ Tóm lại mình vừa bán hàng, nhập hàng mà kiểm soát được hết số lượng nhập vào và bán ra theo hai cột Hàng Còn Tồn bên tay phải hình

Thì chỉ việc ghi data nhập hoặc xuất vào file data để lưu trữ, sau khi nhập hoặc xuất = 1 file khác vào data thì tính toán số tồn kho thực tế đưa vào bên phải hay ở đâu đó tuỳ bạn. Sao phải nhất thiết là ghi số tồn kho đó vào file data rồi lấy ngược ra lại?
 
Upvote 0
Thì chỉ việc ghi data nhập hoặc xuất vào file data để lưu trữ, sau khi nhập hoặc xuất = 1 file khác vào data thì tính toán số tồn kho thực tế đưa vào bên phải hay ở đâu đó tuỳ bạn. Sao phải nhất thiết là ghi số tồn kho đó vào file data rồi lấy ngược ra lại?
Bởi vì trên file Data có Sheet Nhập và xuất thì mới tính được hàng tồn và Tiền lãi còn File chương trình thì không có ( nó chỉ thực hiện lưu mọi cái vào File Data thôi khi cần thì lấy lên..)

Vì vậy mình bắt buột phải chạy Sub Auto_Open trong file Data để cho nó tính toán nhiều cái khác liên Quan nữa (File Data mình úp lên đã xóa đi rất nhiều code trong đó và Sheet..)

Mọi cái từ File chương trình khi cần thì lấy dữ liệu từ File Data lên...
 
Lần chỉnh sửa cuối:
Upvote 0
Thì chỉ việc ghi data nhập hoặc xuất vào file data để lưu trữ, sau khi nhập hoặc xuất = 1 file khác vào data thì tính toán số tồn kho thực tế đưa vào bên phải hay ở đâu đó tuỳ bạn. Sao phải nhất thiết là ghi số tồn kho đó vào file data rồi lấy ngược ra lại?

Hi, GPE mình được cái thằng sheet dễ tính, bảo làm gì nó cũng làm. Bảo về An Giang cấy lúa nó cũng về, bảo về Sài Gòn trông thóc nó cũng nghe, bảo về giúp vợ Hai Lúa thổi cơm nó cũng ừ. Hai Lúa lo phòng bếp phụ nha kẻo có ngày nửa cơm nửa thóc.
Đùa chút thôi, anh em mình sao cứ thích thằng data ra tính tính trình bày. Nó vừa loằng ngoằng, lòe loẹt khó khai thác và nguy hiểm đến sự an toàn của dữ liệu. Trong khi có thể lấy tất cả những gì nó có ra muốn làm gì thì làm.
 
Upvote 0
Bởi vì trên file Data có Sheet Nhập và xuất thì mới tính được hàng tồn còn File chương trình thì không có ( nó chỉ thực hiện lưu mọi cái vào File Data thôi khi cần thì lấy lên..)

Vì vậy mình bắt buột phải chạy Sub Auto_Open trong file Data để cho nó tính toán nhiều cái khác liên Quan nữa (File Data mình úp lên đã xóa đi rất nhiều code trong đó và Sheet..)

Mọi cái từ File chương trình khi cần thì lấy dữ liệu từ File Data lên...
Tôi đã diễn đạt ở trên mà bạn không đọc kỹ, có nghĩa là:
File data chỉ dùng để lưu nhập và xuất. Ta ở 1 file khác (file chuongtrinh) truy vấn vào file data, tính toán số nhập và xuất để lấy kết quả ra file chuongtrinh. Đâu cần tính tồn kho ở file data đâu bạn. Không ai làm thế đâu. Như vậy trong file data chỉ có lưu 1 sheet là sheet nhập + xuất, hoặc bạn có thể tách làm 2, tuy nhiên theo tôi thì nên gom 2 sheet nhập và xuất vào 1 sheet. Trong file chương trình sẽ là file xử lý dữ liệu.
 
Lần chỉnh sửa cuối:
Upvote 0
Hi, GPE mình được cái thằng sheet dễ tính, bảo làm gì nó cũng làm. Bảo về An Giang cấy lúa nó cũng về, bảo về Sài Gòn trông thóc nó cũng nghe, bảo về giúp vợ Hai Lúa thổi cơm nó cũng ừ. Hai Lúa lo phòng bếp phụ nha kẻo có ngày nửa cơm nửa thóc.
Đùa chút thôi, anh em mình sao cứ thích thằng data ra tính tính trình bày. Nó vừa loằng ngoằng, lòe loẹt khó khai thác và nguy hiểm đến sự an toàn của dữ liệu. Trong khi có thể lấy tất cả những gì nó có ra muốn làm gì thì làm.
Nếu dữ liệu lớn và nhiều người dùng thì nên đi theo hướng này anh à, để sau này dể chuyển đổi từ excel data sang những csdl khác nếu có nhu cầu.
 
Upvote 0
Đây là bài học cho việc tham gia trên GPE, không ai dám phủ định kiến thức và công lao của Doveandrose nhưng chỉ vì theo yêu cầu của người hỏi về cách làm mà chưa tìm hiểu về cách làm đã phù hợp chưa. Nhất là Topic này còn phát triển thì cách làm này còn sa đà. Mình cũng từng bị thế này rồi nên trước khi trả lời mình thường xem qua còn cách nào ngon hơn không. Giúp nhau thì giúp cho trót phải không?
Nếu dữ liệu lớn và nhiều người dùng thì nên đi theo hướng này anh à, để sau này dể chuyển đổi từ excel data sang những csdl khác nếu có nhu cầu.

Rất đúng nếu sau chuyển sang Access chẳng hạn, chỉ cần Link cái Data là ngon. Để mấy ô tính toán thì đố Access biết là cái gì? Mặt khác, Exc chưa thấy được gọi là Exc data đâu nha, nó chỉ là dạng bảng tính linh hoạt và data cũng chỉ là anh em mình ngầm hiểu với nhau thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã diễn đạt ở trên mà bạn không đọc kỹ, có nghĩa là:
File data chỉ dùng để lưu nhập và xuất. Ta ở 1 file khác (file chuongtrinh) truy vấn vào file data, tính toán số nhập và xuất để lấy kết quả ra file chuongtrinh. Đâu cần tính tồn kho ở file data đâu bạn. Không ai làm thế đâu. Như vậy trong file data chỉ có lưu 1 sheet là sheet nhập + xuất, hoặc bạn có thể tách làm 2, tuy nhiên theo tôi thì nên gom 2 sheet nhập và xuất vào 1 sheet. Trong file chương trình sẽ là file xử lý dữ liệu.
ý đó mình thấy hơi khó để mình tính lại xem....
Nhưng ý của mình là File Data lưu mọi cái vào đó ... xử lý hết ở đó....Còn File Chương Trình thì thao tác lưu và lấy dữ liệu đã xử lý lên thôi....
 
Upvote 0
Đây là bài học cho việc tham gia trên GPE, không ai dám phủ định kiến thức và công lao của Doveandrose nhưng chỉ vì theo yêu cầu của người hỏi về cách làm mà chưa tìm hiểu về cách làm đã phù hợp chưa. Nhất là Topic này còn phát triển thì cách làm này còn sa đà. Mình cũng từng bị thế này rồi nên trước khi trả lời mình thường xem qua còn cách nào ngon hơn không. Giúp nhau thì giúp cho trót phải không?
Code Doveandrose Viết rất hay vượt qua khả năng vận dụng và hiểu biết của mình....
Cảm ơn Bạn Hiền rất nhiều.... 1 năm nữa mình sẽ hiểu hết code đó
 
Upvote 0
Đây là bài học cho việc tham gia trên GPE, không ai dám phủ định kiến thức và công lao của Doveandrose nhưng chỉ vì theo yêu cầu của người hỏi về cách làm mà chưa tìm hiểu về cách làm đã phù hợp chưa. Nhất là Topic này còn phát triển thì cách làm này còn sa đà. Mình cũng từng bị thế này rồi nên trước khi trả lời mình thường xem qua còn cách nào ngon hơn không. Giúp nhau thì giúp cho trót phải không?

anh nặng lời rồi . giúp người khác theo cách nào đó là tùy vào tính tình mỗi người
tôi không có thói quen tham gia ý kiến về cách người dùng xây dựng CSDL của họ
tôi dễ lắm . thích xôi cho ăn xôi . còn khi nào cảm thấy code không được tôi bỏ chạy trước
đoạn code ở trên có gì đáng để gọi là công lao ? đối với tôi viết những đoạn như thế quá dễ
@Kiều Mạnh : góp ý của anh Hai Lúa Miền Tây làm cho công việc gọn hơn nhiều đấy . anh nên cân nhắc
 
Upvote 0
ý đó mình thấy hơi khó để mình tính lại xem....
Nhưng ý của mình là File Data lưu mọi cái vào đó ... xử lý hết ở đó....Còn File Chương Trình thì thao tác lưu và lấy dữ liệu đã xử lý lên thôi....
Nếu mọi cái làm ở Data thì chắc chắn 1 điều là CSDL sẽ bị phìn to, code sẽ bị ì ịch. Tôi chỉ góp ý thế còn việc bạn vận dụng theo cách nào thì tùy bạn thôi.
 
Upvote 0
Tôi chỉ làm ví dụ để chứng minh việc tôi gợi ý cho bạn ở trên.

Tạo chuổi kết nối khi mở file chuongtrinh:

Mã:
Option Explicit

Private Sub Workbook_Open()
Sheet1.Range("A1") = "provider=Microsoft.ACE.OLEDB.12.0; data source=" & _
               ThisWorkbook.Path & "\data.xlsb" & _
              ";extended properties=""Excel 12.0;hdr=no"";"
End Sub
Trong file chương trình tôi tạo 1 module mới như sau:
Mã:
Option Explicit

Dim cnn As Object, rst As Object
'Code ghi du lieu hang ban vao file data
Sub Ghi_Xuat_DuLieu()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    cnn.Execute ("insert into [Data_Ban$] select * from [" & ThisWorkbook.FullName & ";hdr=no].[BanHang$A6:J] where F3 is not null")
    Lay_TonKho
End Sub
'Code tong hop nhap xuat ton tu file data
Sub Tong_Nhap_Xuat_Ton()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    Set rst = cnn.Execute("select F2, sum(F3), Sum(F6),Sum(F12),Sum(F13),sum(F3)-sum(F12) from (select F2,F3,F6,0 as F12 ,0 as F13 from [Data_Nhap$] union all select F2,0,0,F3,F6 from [Data_Ban$]) group by F2 ")
    Sheet2.Range("a2").CopyFromRecordset rst
    
End Sub
'Code lay so luong ton kho tu file data
Sub Lay_TonKho()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    Set rst = cnn.Execute("select F2, sum(F3)-sum(F12) from (select F2,F3,F6,0 as F12 ,0 as F13 from [Data_Nhap$] union all select F2,0,0,F3,F6 from [Data_Ban$]) group by F2 ")
    Sheet1.Range("M6").CopyFromRecordset rst
    
End Sub

Bạn xem ví dụ nhé.
 

File đính kèm

  • Hoi Bai.rar
    119.7 KB · Đọc: 70
Lần chỉnh sửa cuối:
Upvote 0
anh nặng lời rồi . giúp người khác theo cách nào đó là tùy vào tính tình mỗi người
tôi không có thói quen tham gia ý kiến về cách người dùng xây dựng CSDL của họ
tôi dễ lắm . thích xôi cho ăn xôi . còn khi nào cảm thấy code không được tôi bỏ chạy trước
đoạn code ở trên có gì đáng để gọi là công lao ? đối với tôi viết những đoạn như thế quá dễ
@Kiều Mạnh : góp ý của anh Hai Lúa Miền Tây làm cho công việc gọn hơn nhiều đấy . anh nên cân nhắc

Tập trung vào chuyên môn đi !!! Ý tôi là trước khi tham gia cũng nên xem xét tránh cả 2 đều chui vào đường cụt không ngờ thôi. Làm gì có chuyện nặng nhẹ mà cứ toáng lên nhỉ, anh em ai giúp được nhau là tốt rồi.
Giờ xem code của HaiLuaMT thấy nó ổn và nó mở cho mình hàng tỷ code trên file chuong trình tùy ý chứ. Có phải dùng tất đâu, làm đến đâu lôi ra đến đấy. Những cái này mình dùng phần mềm kế toán thấy dân IT họ viết quá khoa học và chỉn chu nên nhiều lần tham gia với anh em nên tham khảo. Một ý nữa mình cũng đã nhiều lần tham gia với anh em, Exc chỉ là Data (CSDL) nghiệp dư mà thôi, muốn nó khỏe , chơi được với thiên hạ thì phải bảo nó học theo dân chuyên nghiệp.
Chỉ vậy thôi nha đừng nói chi thêm việc ý tứ.
 
Upvote 0
Tôi chỉ làm ví dụ để chứng minh việc tôi gợi ý cho bạn ở trên.

Tạo chuổi kết nối khi mở file chuongtrinh:

Mã:
Option Explicit

Private Sub Workbook_Open()
Sheet1.Range("A1") = "provider=Microsoft.ACE.OLEDB.12.0; data source=" & _
               ThisWorkbook.Path & "\data.xlsb" & _
              ";extended properties=""Excel 12.0;hdr=no"";"
End Sub
Trong file chương trình tôi tạo 1 module mới như sau:
Mã:
Option Explicit

Dim cnn As Object, rst As Object
'Code ghi du lieu hang ban vao file data
Sub Ghi_Xuat_DuLieu()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    cnn.Execute ("insert into [Data_Ban$] select * from [" & ThisWorkbook.FullName & ";hdr=no].[BanHang$A6:J] where F3 is not null")
    Lay_TonKho
End Sub
'Code tong hop nhap xuat ton tu file data
Sub Tong_Nhap_Xuat_Ton()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    Set rst = cnn.Execute("select F2, sum(F3), Sum(F6),Sum(F12),Sum(F13),sum(F3)-sum(F12) from (select F2,F3,F6,0 as F12 ,0 as F13 from [Data_Nhap$] union all select F2,0,0,F3,F6 from [Data_Ban$]) group by F2 ")
    Sheet2.Range("a2").CopyFromRecordset rst
    
End Sub
'Code lay so luong ton kho tu file data
Sub Lay_TonKho()
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open (Sheet1.Range("A1"))
    Set rst = cnn.Execute("select F2, sum(F3)-sum(F12) from (select F2,F3,F6,0 as F12 ,0 as F13 from [Data_Nhap$] union all select F2,0,0,F3,F6 from [Data_Ban$]) group by F2 ")
    Sheet1.Range("M6").CopyFromRecordset rst
    
End Sub

Bạn xem ví dụ nhé.
Vậy là quá OK ........Từ đó mình muốn làm gì thì làm
Còn một chút nữa nhờ Bạn Xử lý cho
Khi lấy hàng tồn lên thì Sắp Xếp tên Hàng cố định theo Cột B để mình Tiện kiểm soát và theo dõi
File kèm
 

File đính kèm

  • Book1.xlsx
    11.4 KB · Đọc: 11
Upvote 0
Vậy là quá OK ........Từ đó mình muốn làm gì thì làm
Còn một chút nữa nhờ Bạn Xử lý cho
Khi lấy hàng tồn lên thì Sắp Xếp tên Hàng cố định theo Cột B để mình Tiện kiểm soát và theo dõi
File kèm
Theo tôi được biết thì ADO sẽ không làm được việc đó, nó chỉ sort dữ liệu theo dạng chuẩn. Nếu như theo ý bạn thì tôi nghĩ chỉ có cách là dùng update kết quả sang thôi.
 
Upvote 0
Web KT
Back
Top Bottom