Lấy dữ liệu từ 2 file tính toán rồi gán lên listbox userform

Liên hệ QC

tranthemai

Thành viên mới
Tham gia
18/11/16
Bài viết
25
Được thích
4
Em chào các anh chị trên diễn đàn thân mến!
Em có một thắc mắc mà không nghĩ ra cách khắc phục, mong các anh chị chỉ dạy hướng đi:
Để tính toán đưa dữ liệu lên 1 listbox thì thường ta lấy dữ liệu trực tiếp của file đưa lên, để làm được điều đó thì ta phải load các dữ liệu từ các file data về các sheet (nhược điểm phải tạo khá nhiều sheet trong file thực thi rối mắt, file tăng dung lượng).
Vậy có cách nào bỏ qua bước load data về các sheet mà ta có thể tính toán rồi up trực tiếp lên listbox được không ạ
Mong anh chị chỉ bảo giúp em ạ!
em cám ơn
 
Em chào các anh chị trên diễn đàn thân mến!
Em có một thắc mắc mà không nghĩ ra cách khắc phục, mong các anh chị chỉ dạy hướng đi:
Để tính toán đưa dữ liệu lên 1 listbox thì thường ta lấy dữ liệu trực tiếp của file đưa lên, để làm được điều đó thì ta phải load các dữ liệu từ các file data về các sheet (nhược điểm phải tạo khá nhiều sheet trong file thực thi rối mắt, file tăng dung lượng).
Vậy có cách nào bỏ qua bước load data về các sheet mà ta có thể tính toán rồi up trực tiếp lên listbox được không ạ
Mong anh chị chỉ bảo giúp em ạ!
em cám ơn
Tôi chỉ đoán mò. Bạn có thể kết nối đến file dữ liệu, thực hiện phép tính rồi đưa dữ liệu vào listbox nhé bạn.
 
Upvote 0
Tôi chỉ đoán mò. Bạn có thể kết nối đến file dữ liệu, thực hiện phép tính rồi đưa dữ liệu vào listbox nhé bạn.
em chưa hiểu cách của anh ạ. vì em phải lấy dữ liệu từ 2 file trở lên rồi đưa chúng vào 1 quy tắc tính toán rồi thu được kết quả đưa lên listbox. Em mới chỉ biết cách getdata về file hoạt động rồi dùng adobd SQL tính toán up lên listbox. em vẫn chưa biết cách bỏ qua thao tác getdata ạ
 

File đính kèm

  • lay du lieu.rar
    86.1 KB · Đọc: 12
Upvote 0
em chưa hiểu cách của anh ạ. vì em phải lấy dữ liệu từ 2 file trở lên rồi đưa chúng vào 1 quy tắc tính toán rồi thu được kết quả đưa lên listbox. Em mới chỉ biết cách getdata về file hoạt động rồi dùng adobd SQL tính toán up lên listbox. em vẫn chưa biết cách bỏ qua thao tác getdata ạ
Bạn miêu tả mà không có dữ liệu hoặc kết quả mong muốn thì khả năng của tôi chỉ có thể trả lời như trên thôi bạn.
 
Upvote 0
Bạn miêu tả mà không có dữ liệu hoặc kết quả mong muốn thì khả năng của tôi chỉ có thể trả lời như trên thôi bạn.
dạ em có đưa thêm file đính kèm, mong anh chỉ giúp em ạ
kết quả là listbox đơn hàng chưa tạo kế hoạch ạ
mục tiêu của em là loại bỏ sheet "KH" và sheet "Styles" ạ
 
Upvote 0
dạ em có đưa thêm file đính kèm, mong anh chỉ giúp em ạ
kết quả là listbox đơn hàng chưa tạo kế hoạch ạ
mục tiêu của em là loại bỏ sheet "KH" và sheet "Styles" ạ

1. 2 Sheets KH và Styles này là toàn bộ dữ liệu của 2 files KHSX.xlsm và Styles.xlsm phải không bạn?
2. Bạn muốn lấy cột nào cộng cột nào của 2 sheets trên vào ListBox.

Bạn phải diễn tả từng cái 1 ở trên chứ bạn đưa lên "một nùi" thì tôi làm sao dò đây?
 
Upvote 0
1. 2 Sheets KH và Styles này là toàn bộ dữ liệu của 2 files KHSX.xlsm và Styles.xlsm phải không bạn?
2. Bạn muốn lấy cột nào cộng cột nào của 2 sheets trên vào ListBox.

Bạn phải diễn tả từng cái 1 ở trên chứ bạn đưa lên "một nùi" thì tôi làm sao dò đây?
1. 2 sheet "KH" va "Styles" là toàn bộ dữ liệu của 2 file "KHSX" và "Styles" ạ
2. em muốn lấy Số lượng của đơn hàng (ORDERQTY) trừ đi số lượng đã tạo kế hoạch (PLANQTY) ạ.
loại bỏ những kết quả =0
Sau đó nạp kết quả vào listboxKHST ạ
 
Upvote 0
1. 2 sheet "KH" va "Styles" là toàn bộ dữ liệu của 2 file "KHSX" và "Styles" ạ
2. em muốn lấy Số lượng của đơn hàng (ORDERQTY) trừ đi số lượng đã tạo kế hoạch (PLANQTY) ạ.
Còn những cột hiển thị là cột nào bạn?
 
Upvote 0
Để chèn vào ListBox thì bạn chỉ cần có một mảng dữ liệu - dulieu(). Sau đó thì
Mã:
ListBox1.List = dulieu

Dữ liệu trong mảng có thể lấy từ Sheet, nhưng cũng có thể lấy từ đâu đó không nhất thiết là từ sheet. Thậm chí dữ liệu từ tập tin khác có thể lấy trực tiếp vào mảng, vd. dùng ADO. Khi có dữ liệu trong các mảng thì có thể "pha trộn", tính toán, gộp chúng, xào nấu, để có mảng dulieu cuối cùng để chèn vào ListBox.

Việc lấy dữ liệu từ tập tin ngoài, vd. dùng ADO, thì người ta đã viết rất rất nhiều trên GPE, chẳng lý gì lại sao chép và nhân bản lên cho bạn.
 
Upvote 0
Để chèn vào ListBox thì bạn chỉ cần có một mảng dữ liệu - dulieu(). Sau đó thì
Mã:
ListBox1.List = dulieu

Dữ liệu trong mảng có thể lấy từ Sheet, nhưng cũng có thể lấy từ đâu đó không nhất thiết là từ sheet. Thậm chí dữ liệu từ tập tin khác có thể lấy trực tiếp vào mảng, vd. dùng ADO. Khi có dữ liệu trong các mảng thì có thể "pha trộn", tính toán, gộp chúng, xào nấu, để có mảng dulieu cuối cùng để chèn vào ListBox.

Việc lấy dữ liệu từ tập tin ngoài, vd. dùng ADO, thì người ta đã viết rất rất nhiều trên GPE, chẳng lý gì lại sao chép và nhân bản lên cho bạn.
Dạ anh nói rất đúng suy nghĩ của em.
Em có thể lấy dữ liệu trực tiếp từ 1 file khác vào 1 listbox .
Nhưng em chỉ biết mở 1 kết nối chứ chưa biết cách mở nhiều kết nối để xào nấu dữ liệu rồi up lên list.
Em tìm hiểu nhiều ngày nhưng không thấy có bài nào trên các diễn đàn cả trong và ngoài nước nhắc đến việc lấy dữ liệu từ nhiều file cùng 1 lúc để tính toán.
Lấy dữ liệu từ nhiều file để gộp thành 1 file thì em cũng đọc rồi, nhưng đều chỉ để gộp dữ liệu, còn mở kết nối để tính toán từng dữ liệu thì em vẫn chưa tìm được.
Đó là cái em thắc mắc nhưng không biết cách làm ạ.
Rất mong được anh và mọi người giúp ạ
Liệu có cách nào lấy dữ liệu rồi đặt tên là 1 bảng tạm, sau đó gọi bảng tạm ra tính toán được không ạ?
 
Upvote 0
Dạ anh nói rất đúng suy nghĩ của em.
Em có thể lấy dữ liệu trực tiếp từ 1 file khác vào 1 listbox .
Nhưng em chỉ biết mở 1 kết nối chứ chưa biết cách mở nhiều kết nối để xào nấu dữ liệu rồi up lên list.
Em tìm hiểu nhiều ngày nhưng không thấy có bài nào trên các diễn đàn cả trong và ngoài nước nhắc đến việc lấy dữ liệu từ nhiều file cùng 1 lúc để tính toán.
Lấy dữ liệu từ nhiều file để gộp thành 1 file thì em cũng đọc rồi, nhưng đều chỉ để gộp dữ liệu, còn mở kết nối để tính toán từng dữ liệu thì em vẫn chưa tìm được.
Đó là cái em thắc mắc nhưng không biết cách làm ạ.
Rất mong được anh và mọi người giúp ạ
Liệu có cách nào lấy dữ liệu rồi đặt tên là 1 bảng tạm, sau đó gọi bảng tạm ra tính toán được không ạ?
Tôi không hiểu. Để lấy dữ liệu từ tập tin 1 thì bạn thực hiện thao tác: mở kết nối -> lấy dữ liệu vào mảng dulieu1 -> đóng kết nối. Vậy thì tiếp theo bạn có thề lặp lại thao tác: mở kết nối -> lấy dữ liệu vào mảng dulieu2 -> đóng kết nối. Sau 2 bước này thì dữ liệu đã có trong 2 mảng dulieu1 và dulieu2. Đâu có chỗ nào cần cái gọi là "mở nhiều kết nối" đâu. Bây giờ xào nấu, tính toán từ 2 mảng này để có mảng dulieu thôi. Có thể mở lần lượt 10 kết nối và lấy dữ liệu vào 10 mảng tạm thời dulieu1, ..., dulieu10. Có ai đó cấm?
 
Upvote 0
Tôi không hiểu. Để lấy dữ liệu từ tập tin 1 thì bạn thực hiện thao tác: mở kết nối -> lấy dữ liệu vào mảng dulieu1 -> đóng kết nối. Vậy thì tiếp theo bạn có thề lặp lại thao tác: mở kết nối -> lấy dữ liệu vào mảng dulieu2 -> đóng kết nối. Sau 2 bước này thì dữ liệu đã có trong 2 mảng dulieu1 và dulieu2. Đâu có chỗ nào cần cái gọi là "mở nhiều kết nối" đâu. Bây giờ xào nấu, tính toán từ 2 mảng này để có mảng dulieu thôi. Có thể mở lần lượt 10 kết nối và lấy dữ liệu vào 10 mảng tạm thời dulieu1, ..., dulieu10. Có ai đó cấm?
Em vẫn chưa biết cách tạo mảng như vậy. anh có thể cho em 1 code để em thử trên file của em được không ạ!
 
Upvote 0
Em vẫn chưa biết cách tạo mảng như vậy. anh có thể cho em 1 code để em thử trên file của em được không ạ!
Thì trên GPE có đầy code dùng ADO đó thôi. Có code lấy dữ liệu vào sheet, có code lấy vào mảng mà.

Vd. hàm GetDataFromExcel trả về mảng dữ liệu

Mã:
Function GetDataFromExcel(ByVal filename As String, ByVal sheetname As String, ByVal myRange As String, _
        Optional header As Boolean = False)
'    filename: duong dan day du toi tap tin Excel
'    sheetname: ten sheet. Neu ta muon sheet dau tien bat luan no co ten gi thi sheetname = ""
'    myRange: vung du lieu
'    header = True: tra ve ket qua - mang khong chua dong dau tien cua vung myRange do coi do la dong tieu de
'    header = FALSE: tra ve ket qua - mang chua toan bo vung myRange
Dim ConnStr As String, query As String, hdr As String, rs As Object, result(), DataTable()
Dim r As Long, c As Long
    On Error GoTo end_
    If header Then
        hdr = "Yes"
    Else
        hdr = "No"
    End If
    If Val(Application.Version) < 12 Then
        ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 8.0;HDR=" & hdr & ";IMEX=1"";"
    Else
        ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 12.0;HDR=" & hdr & ";IMEX=1"";"
    End If
    If InStr(myRange, ":") = 0 Then myRange = myRange & ":" & myRange
    query = "SELECT * FROM [" & sheetname & "$" & myRange & "]"
  
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open query, ConnStr, 2, 4      '   adOpenStatic, adLockReadOnly '  2, 4    adOpenDynamic, adLockBatchOptimistic
    DataTable = rs.getRows
    ReDim result(1 To UBound(DataTable, 2) - LBound(DataTable, 2) + 1, 1 To UBound(DataTable) - LBound(DataTable) + 1)
    For c = 0 To UBound(DataTable, 2)
        For r = 0 To UBound(DataTable)
            result(c + 1, r + 1) = DataTable(r, c)
        Next
    Next
    GetDataFromExcel = result
end_:
    If rs.State = 1 Then
        rs.Close
        Set rs = Nothing
    End If
End Function

Sub test()
Dim arr()
    arr = GetDataFromExcel("D:\siwtom\nhap.xlsx", "Sheet1", "C4:I12")  '    "A:D"
'    làm gì đó với mảng arr
End Sub

Còn những code không lấy ra một vùng liên tục mà lấy ra những cột đơn lẻ. Trên GPE có đầy, bạn cũng có tay chân như tôi sao bạn không tìm được? Chả nhẽ nhân bản sao vô hạn lần?
 
Lần chỉnh sửa cuối:
Upvote 0
Thì trên GPE có đầy code dùng ADO đó thôi. Có code lấy dữ liệu vào sheet, có code lấy vào mảng mà.

Vd. hàm GetDataFromExcel trả về mảng dữ liệu

Mã:
Function GetDataFromExcel(ByVal filename As String, ByVal sheetname As String, ByVal myRange As String, _
        Optional header As Boolean = False)
'    filename: duong dan day du toi tap tin Excel
'    sheetname: ten sheet. Neu ta muon sheet dau tien bat luan no co ten gi thi sheetname = ""
'    myRange: vung du lieu
'    header = True: tra ve ket qua - mang khong chua dong dau tien cua vung myRange do coi do la dong tieu de
'    header = FALSE: tra ve ket qua - mang chua toan bo vung myRange
Dim ConnStr As String, query As String, hdr As String, rs As Object, result(), DataTable()
Dim r As Long, c As Long
    On Error GoTo end_
    If header Then
        hdr = "Yes"
    Else
        hdr = "No"
    End If
    If Val(Application.Version) < 12 Then
        ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 8.0;HDR=" & hdr & ";IMEX=1"";"
    Else
        ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 12.0;HDR=" & hdr & ";IMEX=1"";"
    End If
    If InStr(myRange, ":") = 0 Then myRange = myRange & ":" & myRange
    query = "SELECT * FROM [" & sheetname & "$" & myRange & "]"
 
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open query, ConnStr, 2, 4      '   adOpenStatic, adLockReadOnly '  2, 4    adOpenDynamic, adLockBatchOptimistic
    DataTable = rs.getRows
    ReDim result(1 To UBound(DataTable, 2) - LBound(DataTable, 2) + 1, 1 To UBound(DataTable) - LBound(DataTable) + 1)
    For c = 0 To UBound(DataTable, 2)
        For r = 0 To UBound(DataTable)
            result(c + 1, r + 1) = DataTable(r, c)
        Next
    Next
    GetDataFromExcel = result
end_:
    If rs.State = 1 Then
        rs.Close
        Set rs = Nothing
    End If
End Function

Sub test()
Dim arr()
    arr = GetDataFromExcel("D:\siwtom\nhap.xlsx", "Sheet1", "C4:I12")  '    "A:D"
End Sub

[/QUOTE]
[/QUOTE]

arr1 = GetDataFromExcel(ThisWorkbook.Path & "\KHSX.xlsm", "addKH", "A:O")

arr2 = GetDataFromExcel(ThisWorkbook.Path & "\Styles.xlsm", "addStyles", "A:K")

em vẫn chưa hiểu cái arr này em add vào listbox không được:
Listbox1.list = arr1
em dùng arr1 và arr2 đưa vào SQL nó cũng không nhận
em đã thay bằng cả đường dẫn cố định cũng không được "C:\Users\Admin\Desktop\KHSX.xlsm"

Sub getSQLKHST()
' Tao du lieu kiem tra hang chua co ke hoach
Application.ScreenUpdating = False
Dim cn As Object, rs As Object
Dim mySQL As String
Dim i
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
      If Val(Application.Version) < 12 Then
      .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"
     Else
      .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"
     End If
    .Open
End With

mySQL = "Select * From(Select PDD,PO,SO,Styles,ten_styles,Color,size_,units,sum(ORDERQTY) as Order_Qty,sum(PLANQTY) as PLAN_Qty,(sum(ORDERQTY)-sum(PLANQTY)) as Bland_Qty,Buyer from(" & _
"Select distinct PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer,ORDERQTY,0 as PLANQTY from arr2 as A" & _
" Union all " & _
"select distinct PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer,0 as ORDERQTY,PLANQTY from arr1 as B" & _
"WHERE PDD is not null group by PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer) where Bland_Qty <> 0"

Set rs = cn.Execute(mySQL)

If Not (rs.bof And rs.EOF) Then
For i = 0 To Me.ListBoxKHST.ListCount - 1
If Dic.Exists(Me.ListBoxKHST.List(i, 0)) Then Me.ListBoxKHST.Selected(i) = True
Next
Me.ListBoxKHST.ColumnCount = rs.Fields.Count
Me.ListBoxKHST.Column = rs.getRows()
rs.Close

End If
cn.Close
Set rs = Nothing: Set cn = Nothing
Application.ScreenUpdating = True
End Sub
Bác có thể giúp em thử trên file em gửi được không ạ?
Bài đã được tự động gộp:

Thì trên GPE có đầy code dùng ADO đó thôi. Có code lấy dữ liệu vào sheet, có code lấy vào mảng mà.

Vd. hàm GetDataFromExcel trả về mảng dữ liệu

Mã:
Function GetDataFromExcel(ByVal filename As String, ByVal sheetname As String, ByVal myRange As String, _
        Optional header As Boolean = False)
'    filename: duong dan day du toi tap tin Excel
'    sheetname: ten sheet. Neu ta muon sheet dau tien bat luan no co ten gi thi sheetname = ""
'    myRange: vung du lieu
'    header = True: tra ve ket qua - mang khong chua dong dau tien cua vung myRange do coi do la dong tieu de
'    header = FALSE: tra ve ket qua - mang chua toan bo vung myRange
Dim ConnStr As String, query As String, hdr As String, rs As Object, result(), DataTable()
Dim r As Long, c As Long
    On Error GoTo end_
    If header Then
        hdr = "Yes"
    Else
        hdr = "No"
    End If
    If Val(Application.Version) < 12 Then
        ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 8.0;HDR=" & hdr & ";IMEX=1"";"
    Else
        ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filename & _
                  ";Extended Properties=""Excel 12.0;HDR=" & hdr & ";IMEX=1"";"
    End If
    If InStr(myRange, ":") = 0 Then myRange = myRange & ":" & myRange
    query = "SELECT * FROM [" & sheetname & "$" & myRange & "]"
 
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open query, ConnStr, 2, 4      '   adOpenStatic, adLockReadOnly '  2, 4    adOpenDynamic, adLockBatchOptimistic
    DataTable = rs.getRows
    ReDim result(1 To UBound(DataTable, 2) - LBound(DataTable, 2) + 1, 1 To UBound(DataTable) - LBound(DataTable) + 1)
    For c = 0 To UBound(DataTable, 2)
        For r = 0 To UBound(DataTable)
            result(c + 1, r + 1) = DataTable(r, c)
        Next
    Next
    GetDataFromExcel = result
end_:
    If rs.State = 1 Then
        rs.Close
        Set rs = Nothing
    End If
End Function

Sub test()
Dim arr()
    arr = GetDataFromExcel("D:\siwtom\nhap.xlsx", "Sheet1", "C4:I12")  '    "A:D"
'    làm gì đó với mảng arr
End Sub

Còn những code không lấy ra một vùng liên tục mà lấy ra những cột đơn lẻ. Trên GPE có đầy, bạn cũng có tay chân như tôi sao bạn không tìm được? Chả nhẽ nhân bản sao vô hạn lần?
em lam 2 mảng này
arr1 = GetDataFromExcel(ThisWorkbook.Path & "\KHSX.xlsm", "addKH", "A:O")

arr2 = GetDataFromExcel(ThisWorkbook.Path & "\Styles.xlsm", "addStyles", "A:K")

em vẫn chưa hiểu cái arr này em add vào listbox không được:
Listbox1.list = arr1
em dùng arr1 và arr2 đưa vào SQL nó cũng không nhận
em đã thay bằng cả đường dẫn cố định cũng không được "C:\Users\Admin\Desktop\KHSX.xlsm"

Sub getSQLKHST()
' Tao du lieu kiem tra hang chua co ke hoach
Application.ScreenUpdating = False
Dim cn As Object, rs As Object
Dim mySQL As String
Dim i
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
If Val(Application.Version) < 12 Then
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"
Else
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"
End If
.Open
End With

mySQL = "Select * From(Select PDD,PO,SO,Styles,ten_styles,Color,size_,units,sum(ORDERQTY) as Order_Qty,sum(PLANQTY) as PLAN_Qty,(sum(ORDERQTY)-sum(PLANQTY)) as Bland_Qty,Buyer from(" & _
"Select distinct PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer,ORDERQTY,0 as PLANQTY from arr2 as A" & _
" Union all " & _
"select distinct PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer,0 as ORDERQTY,PLANQTY from arr1 as B" & _
"WHERE PDD is not null group by PDD,PO,SO,Styles,ten_styles,Color,size_,units,Buyer) where Bland_Qty <> 0"

Set rs = cn.Execute(mySQL)

If Not (rs.bof And rs.EOF) Then
For i = 0 To Me.ListBoxKHST.ListCount - 1
If Dic.Exists(Me.ListBoxKHST.List(i, 0)) Then Me.ListBoxKHST.Selected(i) = True
Next
Me.ListBoxKHST.ColumnCount = rs.Fields.Count
Me.ListBoxKHST.Column = rs.getRows()
rs.Close

End If
cn.Close
Set rs = Nothing: Set cn = Nothing
Application.ScreenUpdating = True
End Sub
Bác có thể giúp em thử trên file em gửi được không ạ?
 
Upvote 0
em lam 2 mảng này
arr1 = GetDataFromExcel(ThisWorkbook.Path & "\KHSX.xlsm", "addKH", "A:O")
arr2 = GetDataFromExcel(ThisWorkbook.Path & "\Styles.xlsm", "addStyles", "A:K")
em vẫn chưa hiểu cái arr này em add vào listbox không được:
Bạn có code hơi ấn tượng, sub lồng trong sub
Private Sub CbKHST_Click()
Private Sub RefreshListboxKHold()
Call GetKH
Me.ListBoxKHold.Clear
Me.ListBoxKHold.List = ThisWorkbook.Sheets("KH").Range("dataKHold").Value
End Sub
End Sub

Trước hết xóa toàn bộ code trong Form. Khi mở Form thì Page2 đang được mở. Trong design-time Page2 cũng đang được chọn. Hãy đúp chuột vào nút Reset, sẽ có
Mã:
Private Sub CbKHST_Click()

End Sub

Hãy điền code để có
Mã:
Private Sub CbKHST_Click()
Dim arr1()
   arr1 = GetDataFromExcel(ThisWorkbook.Path & "\KHSX.xlsm", "addKH", "A:O")
   Me.ListBoxKHST.List = arr1
End Sub

Bây giờ mở Form -> nhấn Reset ở Page2 rồi nhìn ListBoxKHST ở Page2

Có code đưa tận "bàn" mà không biết "dùng". Tôi dừng ở đây.
 
Upvote 0
Cám ơn bác batman1 về code trên em đã áp dụng được vào trong các mục tìm kiếm, chạy rất nhanh, không phải thấy máy quay lag như em dùng lúc trước.
em vẫn chưa biết cách lồng các arr() để tính toán được.
Đúng là em rất mù về array, em không biết đưa nó vào để tính toán kiểu gì.
anh có thể hướng dẫn nốt cho em cái xử lý dữ liệu của 2 mảng được không ạ?
Trong dữ liệu của em thì trong "styles" có cột PDD,PO,SO,STYLES,TENSTYLES, COLOR,SIZE_, UNITS và cột ORDERQTY
Trong dữ liệu của KHSX có cột PDD,PO,SO,STYLES,TENSTYLES, COLOR,SIZE_, UNITS và cột PLANQTY
em không biết cách nào để lấy ra những cột đó để làm phép tính ORDERQTY - PLANQTY,lấy ra kết quả những giá trị >0
Rất mong nhận được sự giúp đỡ của anh!
 
Upvote 0
Muốn đọc ra từ mảng Arr giá trị ở hàng i cột j thì

gia_tri = Arr(i, j)

Muốn nhập giá trị vào mảng Arr, vào hàng i cột j thì

Arr(i, j) = gia_tri

Muốn duyệt qua tất cả các phần tử của mảng thì dùng vòng For.

Như vậy vd. có thể đọc từ 2 mảng 2 giá trị rồi tính tổng +, hoặc nối chuỗi &, kết quả nhập vào mảng thứ 3.

Tôi chỉ hướng dẫn về thao tác với mảng thế thôi. Tôi không dạy về VBA cơ bản, không dạy về mảng (cấu trúc dữ liệu), về For (cấu trúc ngôn ngữ).
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn đọc ra từ mảng Arr giá trị ở hàng i cột j thì

gia_tri = Arr(i, j)

Muốn nhập giá trị vào mảng Arr, vào hàng i cột j thì

Arr(i, j) = gia_tri

Muốn duyệt qua tất cả các phần tử của mảng thì dùng vòng For.

Như vậy vd. có thể đọc từ 2 mảng 2 giá trị rồi tính tổng +, hoặc nối chuỗi &, kết quả nhập vào mảng thứ 3.

Tôi chỉ hướng dẫn về thao tác với mảng thế thôi. Tôi không dạy về VBA cơ bản, không dạy về mảng (cấu trúc dữ liệu), về For (cấu trúc ngôn ngữ).
Phương án của anh các thứ từ getdata đến cách giải quyết vấn đề rất hay và khoa học. em rất khâm phục các anh chị có kiến thức sâu về các lĩnh vực.
Kiến thức của em vẫn còn yếu nên chưa thể theo kịp cách làm này. em sẽ tìm cách để học về cách hợp nhất 2 mảng.
em cám ơn anh rất nhiều
 
Upvote 0
dạ hiển thị các cột của PDD,PO,SO,Styles,ten_styles,Color,size_,units,order, plan, outplan, buyer như ảnh của form ạ.
Rất mong bác chỉ giúp em ạ. Trong form của file mau.xlsm ạ
Bạn thử đưa code sau vào nơi nào đó bạn muốn nhé.

Mã:
Dim strSQL As String
    strSQL = ""
    strSQL = strSQL & "Select PDD, " & vbCrLf
    strSQL = strSQL & "       PO, " & vbCrLf
    strSQL = strSQL & "       SO, " & vbCrLf
    strSQL = strSQL & "       Styles, " & vbCrLf
    strSQL = strSQL & "       ten_styles, " & vbCrLf
    strSQL = strSQL & "       Color, " & vbCrLf
    strSQL = strSQL & "       size_, " & vbCrLf
    strSQL = strSQL & "       units, " & vbCrLf
    strSQL = strSQL & "       0       as [order], " & vbCrLf
    strSQL = strSQL & "       PLANQTY, " & vbCrLf
    strSQL = strSQL & "       -PLANQTY as outplan, " & vbCrLf
    strSQL = strSQL & "       buyer " & vbCrLf
    strSQL = strSQL & "From   [EXCEL 12.0;IMEX=1;Database=" & ThisWorkbook.Path & "\KHSX.xlsm].[AddKH$] " & vbCrLf
    strSQL = strSQL & "Union All " & vbCrLf
    strSQL = strSQL & "Select PDD, " & vbCrLf
    strSQL = strSQL & "       PO, " & vbCrLf
    strSQL = strSQL & "       SO, " & vbCrLf
    strSQL = strSQL & "       Styles, " & vbCrLf
    strSQL = strSQL & "       ten_styles, " & vbCrLf
    strSQL = strSQL & "       Color, " & vbCrLf
    strSQL = strSQL & "       size_, " & vbCrLf
    strSQL = strSQL & "       units, " & vbCrLf
    strSQL = strSQL & "       ORDERQTY  as [order], " & vbCrLf
    strSQL = strSQL & "       0         as PLANQTY, " & vbCrLf
    strSQL = strSQL & "       ORDERQTY as outplan, " & vbCrLf
    strSQL = strSQL & "       buyer " & vbCrLf
    strSQL = strSQL & "From " & vbCrLf
    strSQL = strSQL & "[EXCEL 12.0;IMEX=1;Database=" & ThisWorkbook.Path & "\Styles.xlsm].[AddStyles$]"
    With CreateObject("ADODB.Recordset")
         .Open ("Select PDD,PO,Styles,ten_styles,Color,size_,units,Sum([order]),Sum(PLANQTY),Sum(outplan),buyer From (" & strSQL & ") Group By PDD,PO,Styles,ten_styles,Color,size_,units,buyer Having Sum(outplan)>0"), "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0"""
        ListBoxKHST.ColumnCount = .Fields.Count
        ListBoxKHST.Column = .getrows
    End With
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom