Chuyển dữ liệu từ 1 sheet sang nhiều sheet theo điều kiện? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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
Xin chào tất cả các bạn,
Như tiêu đề Oanh Thơ đã nêu, cụ thể bài toán Oanh Thơ đã viết trong file đính kèm ạ.
Rất mong nhận được sự giúp đỡ từ các bạn.
xin cảm ơn.
 

File đính kèm

Bài toán 2

Oanh Thơ xin cảm ơn hai bạn: VetMini & HieuCD đã góp ý và giúp đỡ cho Oanh Thơ ạ.
Oanh Thơ đã chạy thử code trên của bạn HieuCD kết quả cũng đã OK rồi ạ. Cảm ơn bạn nhé!

Oanh Thơ đang vướng mắc 1 trường hợp nữa (bài toán 2) cũng tương tự như bài toán Oanh Thơ đã nêu ở bài 1.
Cũng là lấy dữ liệu từ Sheet Data đưa vào các sheet có sẵn ạ.
bài toán 2 những điểm khác so với bài toán 1 như sau ạ.
+ Dữ liệu lấy từ các Sheet Data đưa vào các sheet bộ phận điều kiện là tên của các Sheet bộ phận có thay đổi không trùng với tên trong trường bộ phận tại sheet Data nữa vì có thêm "ABC " đằng trước.
+ Dữ liệu lấy từ bảng theo dòng nhưng đưa vào các sheet bộ phận theo cột.
+ Số cột của mỗi người là 1 cột không phải như 8 cột như bài toán 1

Cụ thể câu hỏi và kết quả Oanh Thơ xin nêu cụ thể trong file kèm.
Kính mong nhận thêm được sự giúp đỡ của các bạn ạ.
Trân trọng cảm ơn.
Oanh Thơ
 

File đính kèm

Upvote 0
Oanh Thơ xin cảm ơn hai bạn: VetMini & HieuCD đã góp ý và giúp đỡ cho Oanh Thơ ạ.
Oanh Thơ đã chạy thử code trên của bạn HieuCD kết quả cũng đã OK rồi ạ. Cảm ơn bạn nhé!

Oanh Thơ đang vướng mắc 1 trường hợp nữa (bài toán 2) cũng tương tự như bài toán Oanh Thơ đã nêu ở bài 1.
Cũng là lấy dữ liệu từ Sheet Data đưa vào các sheet có sẵn ạ.
bài toán 2 những điểm khác so với bài toán 1 như sau ạ.
+ Dữ liệu lấy từ các Sheet Data đưa vào các sheet bộ phận điều kiện là tên của các Sheet bộ phận có thay đổi không trùng với tên trong trường bộ phận tại sheet Data nữa vì có thêm "ABC " đằng trước.
+ Dữ liệu lấy từ bảng theo dòng nhưng đưa vào các sheet bộ phận theo cột.
+ Số cột của mỗi người là 1 cột không phải như 8 cột như bài toán 1

Cụ thể câu hỏi và kết quả Oanh Thơ xin nêu cụ thể trong file kèm.
Kính mong nhận thêm được sự giúp đỡ của các bạn ạ.
Trân trọng cảm ơn.
Oanh Thơ
Chỉnh lại code bài #3, cho nó chạy "vớ vẫn" một chút chắc cũng không lâu.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, sArr(), dArr(), I As Long, Col As Long, R As Long, Txt As String
With Sheets("Data")
    sArr = .Range("C9", .Range("C65536").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
End With
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Data" Then
        With Ws
            Txt = UCase(.Name): Col = 0
            ReDim dArr(1 To 2, 1 To R)
            For I = 1 To R
                If "ABC " & UCase(sArr(I, 2)) = Txt Then
                    Col = Col + 1
                    dArr(1, Col) = sArr(I, 4)
                    dArr(2, Col) = sArr(I, 1)
                End If
            Next I
            .Range("D3:D4").Resize(, 1000).ClearContents
            If Col > 0 Then .Range("D3:D4").Resize(, Col) = dArr
        End With
    End If
Next Ws
End Sub
 
Upvote 0
Chỉnh lại code bài #3, cho nó chạy "vớ vẫn" một chút chắc cũng không lâu.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, sArr(), dArr(), I As Long, Col As Long, R As Long, Txt As String
With Sheets("Data")
    sArr = .Range("C9", .Range("C65536").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
End With
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Data" Then
        With Ws
            Txt = UCase(.Name): Col = 0
            ReDim dArr(1 To 2, 1 To R)
            For I = 1 To R
                If "ABC " & UCase(sArr(I, 2)) = Txt Then
                    Col = Col + 1
                    dArr(1, Col) = sArr(I, 4)
                    dArr(2, Col) = sArr(I, 1)
                End If
            Next I
            .Range("D3:D4").Resize(, 1000).ClearContents
            If Col > 0 Then .Range("D3:D4").Resize(, Col) = dArr
        End With
    End If
Next Ws
End Sub

ơn Trời, bạn đây rồi }}}}}
Oanh Thơ đã thử code, kết quả dữ liệu trả về ở các sheet bộ phận đã ưng ý rồi bạn ạ.:-=
Nhưng dữ liệu ở các sheet không liên quan như sheet1 bị mất dữ liệu.
Bạn chỉnh lại giúp mình với ạ, có phải lại chỉnh cái phần code dưới Next I giống ở trên phải không bạn,hihi

Cảm ơn bạn nhiều nhé,
Oanh Thơ.
 
Upvote 0
Ahihi, Tuyệt cú mèo rồi!
Ah bài toán 2 này của Oanh Thơ các cột liền nhau xin hỏi bạn ndu96081631 có thể áp dụng được phương pháp giống bài13 của bạn được không ạ?

Cảm ơn các bạn nhiều nhiều.
Oanh Thơ
 
Upvote 0
Oanh Thơ xin cảm ơn hai bạn: VetMini & HieuCD đã góp ý và giúp đỡ cho Oanh Thơ ạ.
Oanh Thơ đã chạy thử code trên của bạn HieuCD kết quả cũng đã OK rồi ạ. Cảm ơn bạn nhé!

Oanh Thơ đang vướng mắc 1 trường hợp nữa (bài toán 2) cũng tương tự như bài toán Oanh Thơ đã nêu ở bài 1.
Cũng là lấy dữ liệu từ Sheet Data đưa vào các sheet có sẵn ạ.
bài toán 2 những điểm khác so với bài toán 1 như sau ạ.
+ Dữ liệu lấy từ các Sheet Data đưa vào các sheet bộ phận điều kiện là tên của các Sheet bộ phận có thay đổi không trùng với tên trong trường bộ phận tại sheet Data nữa vì có thêm "ABC " đằng trước.
+ Dữ liệu lấy từ bảng theo dòng nhưng đưa vào các sheet bộ phận theo cột.
+ Số cột của mỗi người là 1 cột không phải như 8 cột như bài toán 1

Cụ thể câu hỏi và kết quả Oanh Thơ xin nêu cụ thể trong file kèm.
Kính mong nhận thêm được sự giúp đỡ của các bạn ạ.
Trân trọng cảm ơn.
Oanh Thơ
bạn chạy code mới
Mã:
Sub GPE()
Dim Ws As Worksheet, Darr(), Dic As Object, i As Long, C As Long, Tmp As String
Darr = Sheets("Data").Range("C8:F" & Sheets("Data").Range("C65500").End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(Darr)
  If Darr(i, 2) <> "" Then
    Tmp = "ABC " & Darr(i, 2)
    If Not Dic.exists(Tmp) Then
      Dic.Add Tmp, 1
      Dic.Add Tmp & "#" & 1, Array(Darr(i, 1), Darr(i, 4))
    Else
      Dic.Item(Tmp) = Dic.Item(Tmp) + 1
      Tmp = Tmp & "#" & Dic.Item(Tmp)
      Dic.Add Tmp, Array(Darr(i, 1), Darr(i, 4))
    End If
  End If
Next i
For Each Ws In ThisWorkbook.Worksheets
  Tmp = Ws.Name
  If Dic.exists(Tmp) Then
    C = Dic.Item(Tmp)
    ReDim Darr(1 To 2, 1 To C)
    For i = 1 To C
      Darr(1, i) = Dic.Item(Tmp & "#" & i)(1)
      Darr(2, i) = Dic.Item(Tmp & "#" & i)(0)
    Next i
    Ws.Range("D3").Resize(2, 1000).ClearContents
    Ws.Range("D3").Resize(2, C) = Darr
  End If
Next Ws
Set Dic = Nothing:  Set Ws = Nothing:  Erase Darr
End Sub
 
Upvote 0
Ahihi, Tuyệt cú mèo rồi!
Ah bài toán 2 này của Oanh Thơ các cột liền nhau xin hỏi bạn ndu96081631 có thể áp dụng được phương pháp giống bài13 của bạn được không ạ?

Cảm ơn các bạn nhiều nhiều.
Oanh Thơ

Câu trả lời là ĐƯỢC!
Cũng giống như cách làm bằng tay thôi: Lọc bằng Advanced Filter sang vùng tạm, copy/paste transpose sang các sheet
Xong!
 
Upvote 0
bạn chạy code mới
Mã:
Sub GPE()
Dim Ws As Worksheet, Darr(), Dic As Object, i As Long, C As Long, Tmp As String
Darr = Sheets("Data").Range("C8:F" & Sheets("Data").Range("C65500").End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(Darr)
  If Darr(i, 2) <> "" Then
    Tmp = "ABC " & Darr(i, 2)
    If Not Dic.exists(Tmp) Then
      Dic.Add Tmp, 1
      Dic.Add Tmp & "#" & 1, Array(Darr(i, 1), Darr(i, 4))
    Else
      Dic.Item(Tmp) = Dic.Item(Tmp) + 1
      Tmp = Tmp & "#" & Dic.Item(Tmp)
      Dic.Add Tmp, Array(Darr(i, 1), Darr(i, 4))
    End If
  End If
Next i
For Each Ws In ThisWorkbook.Worksheets
  Tmp = Ws.Name
  If Dic.exists(Tmp) Then
    C = Dic.Item(Tmp)
    ReDim Darr(1 To 2, 1 To C)
    For i = 1 To C
      Darr(1, i) = Dic.Item(Tmp & "#" & i)(1)
      Darr(2, i) = Dic.Item(Tmp & "#" & i)(0)
    Next i
    Ws.Range("D3").Resize(2, 1000).ClearContents
    Ws.Range("D3").Resize(2, C) = Darr
  End If
Next Ws
Set Dic = Nothing:  Set Ws = Nothing:  Erase Darr
End Sub
Hi, vẫn là cái tên chưa thân nhưng quen quen, Xin cảm ơn bạn HieuCD rất nhiều ạ.
Oanh Thơ đã thử code bạn, chuẩn và không có thêm thắc gì nữa ạ. hihi


Câu trả lời là ĐƯỢC!
Cũng giống như cách làm bằng tay thôi: Lọc bằng Advanced Filter sang vùng tạm, copy/paste transpose sang các sheet
Xong!

@@!Hic,
Chàng viết như cho em khác gì đàn gảy tai Trâu chứ.**~**-+*/
Nếu có thời gian,Chàng code cho em điiiiii ạ (T_T) ....
Chắc chàng vẫn nhớ vụ này chứ ạ: -\\/.
https://www.giaiphapexcel.com/forum/showthread.php?121612-Lọc-duy-nhất&p=761301#post761301

Hihihi, nếu Oanh Thơ có gì đắc tội, ndu96081631 bỏ qua nhé.
Cảm ơn bạn nhiều!
Oanh Thơ.
 
Upvote 0
Bài toán 3 -

Oanh Thơ xin trân trọng cảm ơn các bạn và diễn đàn đã giúp đỡ Oanh Thơ thực hiện được bài toán 1 và 2 trong chủ đề này ạ.
Hiện tại với chủ đề này Oanh Thơ vẫn còn một vướng mắc nữa đó bài toán 3 này ạ... -\\/.hic ngại quá
Câu hỏi và kết quả mong muốn Oanh Thơ đã nêu trong file đính kèm ạ.-\\/.

Kính mong các bạn tiếp tục giúp đỡ ạ.-\\/.
Trân trọng cảm ơn.
Oanh Thơ
 

File đính kèm

Upvote 0
Oanh Thơ xin trân trọng cảm ơn các bạn và diễn đàn đã giúp đỡ Oanh Thơ thực hiện được bài toán 1 và 2 trong chủ đề này ạ.
Hiện tại với chủ đề này Oanh Thơ vẫn còn một vướng mắc nữa đó bài toán 3 này ạ... -\\/.hic ngại quá
Câu hỏi và kết quả mong muốn Oanh Thơ đã nêu trong file đính kèm ạ.-\\/.

Kính mong các bạn tiếp tục giúp đỡ ạ.-\\/.
Trân trọng cảm ơn.
Oanh Thơ
Không làm mất dữ liệu ở các vùng và các sheet không liên quan (không làm mất chữ a)
"a" ở file thật là giống nhau hay khác nhau? và đã có sẵn dữ liệu "a" ứng với 31 ngày? Đã tạo 31 ngày ứng với tháng đó? Có cần tạo tự động số ngày tương ứng với tháng chỉ định?

Các sheet bộ phận (KT,SX,Kho,QC) có sẵn? Đã lập sẵn Họ Tên | Bộ Phận | Mã Số | Item?

Với mỗi mã số luôn có 8 dòng và 3 items?
 
Upvote 0
"a" ở file thật là giống nhau hay khác nhau? và đã có sẵn dữ liệu "a" ứng với 31 ngày? Đã tạo 31 ngày ứng với tháng đó? Có cần tạo tự động số ngày tương ứng với tháng chỉ định?

Các sheet bộ phận (KT,SX,Kho,QC) có sẵn? Đã lập sẵn Họ Tên | Bộ Phận | Mã Số | Item?

Với mỗi mã số luôn có 8 dòng và 3 items?

Cảm ơn befaint đã quan tâm ạ,rất xin lỗi các bạn vì điều kiện không cho phép nên Oanh Thơ không gửi đc file thật lên đây rất mong các bạn thông cảm.
Oanh Thơ xin giải thích từng trường hợp của bạn ạ:
+ "a" mục đích chỉ là hiển thị các vùng đó có dữ liệu,các dữ liệu có khác nhau, thay đổi có hoặc không tùy theo từng ngày.
+ 31 ngày này là cố định 31 cột, form mẫu có sẵn 31 cột tương ứng với 31 ngày. nếu tháng nào có 30 ngày thì form mẫu vẫn có đủ 31 cột nhưng cột thứ 30 để trắng không có gì.
+ Các sheet bộ phận (KT,SX,Kho,QC) có sẵn Đã lập sẵn Họ Tên | Bộ Phận | Mã Số | Item.
+ Với mỗi mã số luôn có 8 dòng tương ứng với 8 hạng mục mà Oanh Thơ đã nêu ở bài16 trong cùng chủ đề.
https://www.giaiphapexcel.com/forum...hiều-sheet-theo-điều-kiện&p=764148#post764148
3Item(3 dòng) 1,2,3 sẽ tự động lấy từ Sheet Data2 sang còn lại các 5 dòng còn lại là dữ liệu nhập tay theo ngày.

Rất mong nhận được sự trợ giúp của bạn và diễn đàn.
Trân trọng cảm ơn.
Oanh Thơ.
 
Upvote 0
Cảm ơn befaint đã quan tâm ạ,rất xin lỗi các bạn vì điều kiện không cho phép nên Oanh Thơ không gửi đc file thật lên đây rất mong các bạn thông cảm.
Oanh Thơ xin giải thích từng trường hợp của bạn ạ:
+ "a" mục đích chỉ là hiển thị các vùng đó có dữ liệu,các dữ liệu có khác nhau, thay đổi có hoặc không tùy theo từng ngày.
+ 31 ngày này là cố định 31 cột, form mẫu có sẵn 31 cột tương ứng với 31 ngày. nếu tháng nào có 30 ngày thì form mẫu vẫn có đủ 31 cột nhưng cột thứ 30 để trắng không có gì.
+ Các sheet bộ phận (KT,SX,Kho,QC) có sẵn Đã lập sẵn Họ Tên | Bộ Phận | Mã Số | Item.
+ Với mỗi mã số luôn có 8 dòng tương ứng với 8 hạng mục mà Oanh Thơ đã nêu ở bài16 trong cùng chủ đề.
https://www.giaiphapexcel.com/forum...hiều-sheet-theo-điều-kiện&p=764148#post764148
3Item(3 dòng) 1,2,3 sẽ tự động lấy từ Sheet Data2 sang còn lại các 5 dòng còn lại là dữ liệu nhập tay theo ngày.

Rất mong nhận được sự trợ giúp của bạn và diễn đàn.
Trân trọng cảm ơn.
Oanh Thơ.
Không cần file thật, dữ liệu minh họa tương tự file thật là được (minh họa "a" hết thì khó hiểu)

Có thể nói rõ hơn về quy trình nhập dữ liệu vào sheet "Data2" và sheet bộ phận không? Ban đầu gồm dữ liệu nào? Nhập dữ liệu tiếp vào như nào? Cái nào trước/ sau? (vì nếu còn cập nhật dữ liệu vào các sheet bộ phận nhiều hơn 1 lần?)
 
Lần chỉnh sửa cuối:
Upvote 0
Không cần file thật, dữ liệu minh họa tương tự file thật là được (minh họa "a" hết thì khó hiểu)

Có thể nói rõ hơn về quy trình nhập dữ liệu vào sheet "Data2" và sheet bộ phận không? Ban đầu gồm dữ liệu nào? Nhập dữ liệu tiếp vào như nào? Cái nào trước/ sau? (vì nếu còn cập nhật dữ liệu vào các sheet bộ phận nhiều hơn 1 lần?)

Hi befaint,
Về quy trình nhập dữ liệu thì là thế này. Mỗi thành viên ở các sheet bộ phận có 8 dòng. 4 dòng đầu là nhập dữ liệu cho từng người theo ngày.
Sau đấy cứ 1 tuần hoặc nửa tháng (không cụ thể là bao nhiêu ngày thậm trí là cuối tháng cũng được) dữ liệu sẽ tổng hợp từ nhiều tệp tin bên ngoài khác đưa hết vào tệp tin đính kèm trong sheet data2 với các trường mã số và các dữ liệu của 5item như đã minh họa.
Bước cuối cùng là từ sheet data2 đưa dữ liệu của 3item vào các dòng màu vàng trong sheet bộ phận.
Sheet data2 gọi là sheet trung gian để tổng hợp dữ liệu từ nhiều tệp tin. Nghĩa là bước này thực hiện xong thì sheet data2 mới có dữ liệu để đưa đến những sheet bộ phận được bạn ạ.
 
Upvote 0
Hi befaint,
Về quy trình nhập dữ liệu thì là thế này. Mỗi thành viên ở các sheet bộ phận có 8 dòng. 4 dòng đầu là nhập dữ liệu cho từng người theo ngày. (1)
Sau đấy cứ 1 tuần hoặc nửa tháng (không cụ thể là bao nhiêu ngày thậm trí là cuối tháng cũng được) dữ liệu sẽ tổng hợp từ nhiều tệp tin bên ngoài khác (2) đưa hết vào tệp tin đính kèm trong sheet data2 với các trường mã số và các dữ liệu của 5item như đã minh họa.
Bước cuối cùng là từ sheet data2 đưa dữ liệu của 3item vào các dòng màu vàng trong sheet bộ phận.
Sheet data2 gọi là sheet trung gian để tổng hợp dữ liệu từ nhiều tệp tin. Nghĩa là bước này thực hiện xong thì sheet data2 mới có dữ liệu để đưa đến những sheet bộ phận được bạn ạ.
(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?
 
Upvote 0
Oanh Thơ xin trân trọng cảm ơn các bạn và diễn đàn đã giúp đỡ Oanh Thơ thực hiện được bài toán 1 và 2 trong chủ đề này ạ.
Hiện tại với chủ đề này Oanh Thơ vẫn còn một vướng mắc nữa đó bài toán 3 này ạ... -\\/.hic ngại quá
Câu hỏi và kết quả mong muốn Oanh Thơ đã nêu trong file đính kèm ạ.-\\/.

Kính mong các bạn tiếp tục giúp đỡ ạ.-\\/.
Trân trọng cảm ơn.
Oanh Thơ
code chỉ thay thế Hàm Vlookup như trong file mẩu
Mã:
Sub GPE()
Dim Darr(), Sarr(), Arr(), Tarr(), Dic As Object, Ws, i As Long, k As Byte, j As Byte
Darr = Sheets("Data2").Range("F9:FE" & Sheets("Data2").Range("F65500").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
Tarr = Sheets(Ws(0)).Range("H3:AL3").Value
For k = LBound(Ws) To UBound(Ws)
  ReDim Arr(1 To 3, 1 To 31)
  Sarr = Sheets(Ws(k)).Range("E1:E" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row).Value
  For i = 4 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)), (Tarr(1, j) - 1) * 5 + n + 1)
        Next j
      Next n
      Sheets(Ws(k)).Range("H" & i + 3).Resize(3, 31) = Arr
    End If
  Next i
Next k
Set Dic = Nothing
End Sub
 
Upvote 0
Anh HieuCD,

Sao anh không chuyển dòng
Mã:
ReDim Arr(1 To 3, 1 To 31)
ra ngoài vòng lặp.
 
Upvote 0
Oanh Thơ xin trân trọng cảm ơn các bạn và diễn đàn đã giúp đỡ Oanh Thơ thực hiện được bài toán 1 và 2 trong chủ đề này ạ.
Hiện tại với chủ đề này Oanh Thơ vẫn còn một vướng mắc nữa đó bài toán 3 này ạ... -\\/.hic ngại quá
Câu hỏi và kết quả mong muốn Oanh Thơ đã nêu trong file đính kèm ạ.-\\/.

Kính mong các bạn tiếp tục giúp đỡ ạ.-\\/.
Trân trọng cảm ơn.
Oanh Thơ

Bạn phải tạo 1 vùng tùy chọn các sheet cần lấy dữ liệu (G1 -->sang phải)
 

File đính kèm

Upvote 0
Anh HieuCD,
Sao anh không chuyển dòng
Mã:
ReDim Arr(1 To 3, 1 To 31)
ra ngoài vòng lặp.
Bạn nhận xét quá chuẩn, mình không rỏ dữ liệu ở sheet Data2 và cột ngày từng sheet như thế nào nên lưỡng lự và code không hợp lý,
nếu dữ liệu đầy đủ và đồng nhất thì Redim Arr nên đưa ra khỏi vòng lập
Mã:
Tarr = Sheets(Ws(0)).Range("H3:AL3").Value
ReDim Arr(1 To 3, 1 To 31)
For k = LBound(Ws) To UBound(Ws)
  Sarr = Sheets(Ws(k)).Range("E1:E" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row).Value
  For i = 4 To UBound(Sarr) Step 8 [COLOR=#000000]   
  If Sarr(i, 1) <> "" And Dic.exists(Sarr(i, 1)) Then[/COLOR]

còn nếu dữ liệu các sheet lung tung lúc có lúc không thì phải cẩn thận hơn
Mã:
For k = LBound(Ws) To UBound(Ws)
  Tarr = Sheets(Ws(k)).Range("H3:AL3").Value
  ReDim Arr(1 To 3, 1 To 31)
  Sarr = Sheets(Ws(k)).Range("E1:E" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row).Value
  For i = 4 To UBound(Sarr) Step 8 
[COLOR=#000000]    If Sarr(i, 1) <> "" And Dic.exists(Sarr(i, 1)) Then[/COLOR]
nếu dữ liệu thật chuẩn như file mẩu thì có thể ăn gian
Mã:
Sub GPE1()
Dim Darr(), Arr(), Ws, i As Long, n As Byte, k As Integer, j As Byte
Ws = Array("SX", "QC", "Kho", "KT")   'Khai báo tên các Sheet
For k = LBound(Ws) To UBound(Ws)
  Darr = Sheets(Ws(k)).Range("E1:AL" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row + 7).Value
  For i = 4 To UBound(Darr) Step 8
    If Darr(i, 1) <> "" Then
      ReDim Arr(1 To 3, 1 To 31)
      For n = 1 To UBound(Arr)
        For j = 1 To UBound(Arr, 2)
          If Darr(3, j + 3) > 0 Then Arr(n, j) = Darr(i, 1) & "/Itiem" & n & "-" & Darr(3, j + 3)
        Next j
      Next n
      Sheets(Ws(k)).Range("H" & i + 3).Resize(3, 31) = Arr
    End If
  Next i
Next k
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nhận xét quá chuẩn, mình không rỏ dữ liệu ở sheet Data2 và cột ngày từng sheet như thế nào nên lưỡng lự và code không hợp lý,
nếu dữ liệu đầy đủ và đồng nhất thì Redim Arr nên đưa ra khỏi vòng lập
Mã:
Tarr = Sheets(Ws(0)).Range("H3:AL3").Value
ReDim Arr(1 To 3, 1 To 31)
For k = LBound(Ws) To UBound(Ws)
  Sarr = Sheets(Ws(k)).Range("E1:E" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row).Value
  For i = 4 To UBound(Sarr) Step 8 [COLOR=#000000]   
  If Sarr(i, 1) <> "" And Dic.exists(Sarr(i, 1)) Then[/COLOR]

còn nếu dữ liệu các sheet lung tung lúc có lúc không thì phải cẩn thận hơn
Mã:
For k = LBound(Ws) To UBound(Ws)
  Tarr = Sheets(Ws(k)).Range("H3:AL3").Value
  ReDim Arr(1 To 3, 1 To 31)
  Sarr = Sheets(Ws(k)).Range("E1:E" & Sheets(Ws(k)).Range("E65500").End(xlUp).Row).Value
  For i = 4 To UBound(Sarr) Step 8 
[COLOR=#000000]    If Sarr(i, 1) <> "" And Dic.exists(Sarr(i, 1)) Then[/COLOR]


Redim có 2 mục đích, 1 là để đổi số phần tử của mảng động (dynamic array), 2 là để chuyển giá trị về mặc định (trong trường hợp này là trống vì dữ liệu variant)

Đặt Redim trong vòng lặp bảo đảm không bị ảnh hưởng tàn dư của những lần trước.

Trong trường hợp không cần reset mảng, và nếu số phần tử cũng cố định. Thì dùng mảng tĩnh (static array) là đúng hơn.
Dim Arr(1 to 3, 1 to 31)
 
Lần chỉnh sửa cuối:
Upvote 0
Redim có 2 mục đích, 1 là để đổi số phần tử của mảng động (dynamic array), 2 là để chuyển giá trị về mặc định (trong trường hợp này là trống vì dữ liệu variant)
Đặt Redim trong vòng lặp bảo đảm không bị ảnh hưởng tàn dư của những lần trước.
Trong trường hợp không cần reset mảng, và nếu số phần tử cũng cố định. Thì dùng mảng tĩnh (static array) là đúng hơn.
Dim Arr(1 to 3, 1 to 31)
cám ơn bạn, vụ khai báo dim, redim mình còn lúng túng, các kiểu dữ liệu chưa hiểu hết, đặc biệt là dùng ReDim Preserve để thay đổi kích thước mảng lúc được lúc không
 
Upvote 0
Oanh Thơ xin trân trọng cảm ơn các bạn và diễn đàn đã giúp đỡ Oanh Thơ thực hiện được bài toán 1 và 2 trong chủ đề này ạ.
Hiện tại với chủ đề này Oanh Thơ vẫn còn một vướng mắc nữa đó bài toán 3 này ạ... -\\/.hic ngại quá
Câu hỏi và kết quả mong muốn Oanh Thơ đã nêu trong file đính kèm ạ.-\\/.

Kính mong các bạn tiếp tục giúp đỡ ạ.-\\/.
Trân trọng cảm ơn.
Oanh Thơ
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ả
 
Upvote 0
Web KT

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

Back
Top Bottom