Hoàng Nhật Phương
Thành viên gắn bó



- Tham gia
- 5/11/15
- Bài viết
- 1,895
- Được thích
- 1,219
Với dữ liệu + yêu cầu như trong file, tôi thấy bạn dùng VLOOKUP vậy là quá ổn rồi (với lại hàm này cũng khá "nhẹ"). Code trong trường hợp này vô cùng nguy hiểm, bởi chỉ sai 1 chút là xem như bạn hết cơ hội quay đầu
Nói chung code hay công thức, chọn cái nào là tùy vào chuyện ta kiểm soát được mức độ chính xác của kết quả
-------------------------
Kinh nghiệm của tôi là vậy, có gì không đúng xem như tôi chưa nói gì cả
(1) Nhập vào file mà bạn đã đính kèm phải không? Hay mỗi bộ phận một file để tự nhập dữ liệu vào?
(2) Gửi file đó lên xem như nào?
Mỗi bộ phận có một danh sách "Mã số" tương ứng? Có sẵn danh sách này rồi chứ?
Có thể bỏ qua bước trung gian không? Hay nhất thiết phải có bước này?
Không biết bạn tổng hợp từ các file đó vào sheet "Data2" như nào? Hỏi vậy để định làm luôn cả phần đó...Còn vấn đề 2. Bước trung gian ở đây là Oanh Thơ đã lấy dữ liệu từ nhiều tệp tin mỗi tệp tin là dữ liệu của 1 tổ hoặc 1 bộ phận (có rất nhiều tệp tin) và dữ liệu được đưa hết vào sheet data2 đó ạ.
...
trên từng sheet có đủ dữ liệu để xử lý, tại sao phải lấy dữ liệu từ Data2?Hi, thật bất ngờ!
Oanh Thơ xin cảm ơn tất cả các bạn rất nhiều vì những ngày cuối năm bộn rộn mà các bạn vẫn dành thời gian để tham gia diễn đàn giúp đỡ Oanh Thơ và mọi người.
Hôm nay Oanh Thơ phải dọn dẹp nhà cửa nên giờ mới thông tin đến các bạn được kính mong các bạn thông cảm ạ.
Oanh Thơ đã thử code của bài 34 và bài 36 code chạy trên file mẫu gửi lên lẹ quá , kết quả rất đúng với ý của Oanh Thơ.
Nhưng khi áp dụng vào file thật thì Oanh Thơ không sử dụng được do có một chút thay đổi về thứ tự dòng cột
và tiêu đề ngày 1 đến 31 trong các sheet bộ phận là định dạng ngày tháng năm.
Oanh Thơ xin gửi file đã sửa lại thứ tự dòng cột và định dạng tiêu đề ngày tháng ở các sheet bộ phận để các bạn xem giúp Oanh Thơ ạ.
Sub GPE_1()
Dim dArr(), sArr(), Arr(), tArr(), Dic As Object, Ws, I As Long, k As Byte, J As Byte, N
dArr = Sheets("Data2").Range("B14:FC" & Sheets("Data2").Range("B65500").End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For I = 1 To UBound(dArr)
If dArr(I, 1) <> "" And Not Dic.Exists(dArr(I, 1)) Then Dic.Add dArr(I, 1), I
Next I
Ws = Array("SX", "QC", "Kho", "KT") 'Khai báo tên các Sheet
For k = LBound(Ws) To UBound(Ws)
tArr = Sheets(Ws(k)).Range("J14:AN14").Value
ReDim Arr(1 To 3, 1 To 31)
sArr = Sheets(Ws(k)).Range("G1:G" & Sheets(Ws(k)).Range("G65500").End(xlUp).Row).Value
For I = 15 To UBound(sArr) Step 8
If sArr(I, 1) <> "" And Dic.Exists(sArr(I, 1)) Then
For N = 1 To UBound(Arr)
For J = 1 To UBound(Arr, 2)
If tArr(1, J) > 0 Then Arr(N, J) = dArr(Dic.Item(sArr(I, 1)), (Day(tArr(1, J)) - 1) * 5 + N + 3)
Next J
Next N
Sheets(Ws(k)).Range("J" & I + 3).Resize(3, 31) = Arr
End If
Next I
Next k
Set Dic = Nothing
End Sub
Không biết bạn tổng hợp từ các file đó vào sheet "Data2" như nào? Hỏi vậy để định làm luôn cả phần đó...
@Nguyễn Hoàng Oanh Thơ,
(1) Vậy mọi thứ đã đầy đủ rồi
(2) hình như lỗi chính tả...
(3)Hình như thiếu cái gì đó \Mã:filename = ThisWorkbook.Path & [COLOR=#0000ff]"" [/COLOR]& bo_phan(index) & ".xls"
trên từng sheet có đủ dữ liệu để xử lý, tại sao phải lấy dữ liệu từ Data2?Mã:Sub GPE_1() Dim dArr(), sArr(), Arr(), tArr(), Dic As Object, Ws, I As Long, k As Byte, J As Byte, N dArr = Sheets("Data2").Range("B14:FC" & Sheets("Data2").Range("B65500").End(xlUp).Row).Value Set Dic = CreateObject("scripting.dictionary") For I = 1 To UBound(dArr) If dArr(I, 1) <> "" And Not Dic.Exists(dArr(I, 1)) Then Dic.Add dArr(I, 1), I Next I Ws = Array("SX", "QC", "Kho", "KT") 'Khai báo tên các Sheet For k = LBound(Ws) To UBound(Ws) tArr = Sheets(Ws(k)).Range("J14:AN14").Value ReDim Arr(1 To 3, 1 To 31) sArr = Sheets(Ws(k)).Range("G1:G" & Sheets(Ws(k)).Range("G65500").End(xlUp).Row).Value For I = 15 To UBound(sArr) Step 8 If sArr(I, 1) <> "" And Dic.Exists(sArr(I, 1)) Then For N = 1 To UBound(Arr) For J = 1 To UBound(Arr, 2) If tArr(1, J) > 0 Then Arr(N, J) = dArr(Dic.Item(sArr(I, 1)), (Day(tArr(1, J)) - 1) * 5 + N + 3) Next J Next N Sheets(Ws(k)).Range("J" & I + 3).Resize(3, 31) = Arr End If Next I Next k Set Dic = Nothing End Sub
Oanh Thơ chưa hiểu ý bạn lắm ạ, nếu Oanh Thơ trả lời không đúng ý bạn mong bạn giải thích thêm ạ.trên từng sheet có đủ dữ liệu để xử lý, tại sao phải lấy dữ liệu từ Data2?
....................
Bạn cho hỏi thêm trong trường hợp Oanh Thơ chỉ lấy dữ liệu của Item2 và Item3 thôi mà không lấy dữ liệu của Item1 nữa thì code phải thay đổi chỗ nào ạ.
Sở dĩ Item1 là dữ liệu có thể phải sửa lại bằng tay nên sau khi điều chỉnh lại Oanh Thơ không cho cập nhật từ sheet data2 sang nữa bạn ạ.
................
Public Sub GPE_2()
Dim Dic As Object, sArr(), dArr(), tArr(), Tem As Long, iTm As Long
Dim I As Long, iK As Long, J As Long, Col As Long, N As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Data2")
tArr = .Range("G1", .Range("G1").End(xlToRight)).Value
sArr = .Range("B14", .Range("B65536").End(xlUp)).Resize(, 158).Value
End With
For I = 1 To UBound(sArr)
Dic.Item(sArr(I, 1)) = I
Next I
For N = 1 To UBound(tArr, 2)
With Sheets(tArr(1, N))
Rws = .Range("G65536").End(xlUp).Row
For iK = 15 To Rws Step 8
Tem = .Range("G" & iK): Col = 0
If Dic.Exists(Tem) Then
iTm = Dic.Item(Tem)
ReDim dArr(1 To 2, 1 To 31)
For J = 5 To 158 Step 5
Col = Col + 1
dArr(1, Col) = sArr(iTm, J)
dArr(2, Col) = sArr(iTm, J + 1)
Next J
.Range("J" & iK + 4).Resize(2, 31) = dArr
End If
Next iK
End With
Next N
Set Dic = Nothing
MsgBox "Da thuc hien xong.", , "GiaiPhapExcel"
End Sub
Hình như bạn không khoái cái Sub dài "thoòng" này.
Nó không dình liếu gì với cái tiêu đề là Number hay Date. Cứ từ cột 1 đến 31 mà "phang".
PHP:Public Sub GPE_2() Dim Dic As Object, sArr(), dArr(), tArr(), Tem As Long, iTm As Long Dim I As Long, iK As Long, J As Long, Col As Long, N As Long, Rws As Long Set Dic = CreateObject("Scripting.Dictionary") With Sheets("Data2") tArr = .Range("G1", .Range("G1").End(xlToRight)).Value sArr = .Range("B14", .Range("B65536").End(xlUp)).Resize(, 158).Value End With For I = 1 To UBound(sArr) Dic.Item(sArr(I, 1)) = I Next I For N = 1 To UBound(tArr, 2) With Sheets(tArr(1, N)) Rws = .Range("G65536").End(xlUp).Row For iK = 15 To Rws Step 8 Tem = .Range("G" & iK): Col = 0 If Dic.Exists(Tem) Then iTm = Dic.Item(Tem) ReDim dArr(1 To 2, 1 To 31) For J = 5 To 158 Step 5 Col = Col + 1 dArr(1, Col) = sArr(iTm, J) dArr(2, Col) = sArr(iTm, J + 1) Next J .Range("J" & iK + 4).Resize(2, 31) = dArr End If Next iK End With Next N Set Dic = Nothing MsgBox "Da thuc hien xong.", , "GiaiPhapExcel" End Sub
của bạn ,như đã nêu ở bài 41 vì Oanh Thơ chưa biết cách vận dụng cho file thật của mình thôi ạ.Sub dài "thoòng"