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
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 ạ
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 ạ
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" ạ
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?
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 ạ
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) ạ.
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 ạ
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 ạ?
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 ạ?
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?
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 ạ?
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 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 ạ?
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:
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
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!
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
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 ạ