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

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ơ ạ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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ả

Cảm ơn ndu96081631, đúng như bạn đã nhận xét vì là bất đắc dĩ lên Oanh Thơ mới thay công thức bằng code.
Bất đắc dĩ là vì tệp tin thật của Oanh Thơ cũng khá nặng nhiều công thức trong sheet (nhiều thều viên) nhiều sheet (nhiều bộ phận - tổ) và bao gồm các sheet khác nữa, nhiều định dạng điều kiện v.v... khiến cho tệp tin sử dụng chậm chạp.
Vì vậy Oanh Thơ muốn sử dụng 1 phần code để thay cho công thức mục đích làm nhẹ tệp tin đi ạ.
 
Upvote 0
(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?


Xin chào befaint,
Vấn đề 1 thì bạn HieuCD và Ba Tê đã trả lời giúp Oanh Thơ.:-= công việc chỉ là đưa dữ liệu từ sheet data2 sang các sheet bộ phận trong cùng 1 tệp tin bạ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 đó ạ.
Không thể bỏ qua bước này được bạn ah vì vẫn phải cần 1 sheet để tổng hợp tất cả dữ liệu của các tổ và bộ phận vào chung lại làm một.
Nếu bỏ qua bước này thì dữ liệu sẽ không còn lấy từ sheet data2 vào các sheet bộ phận và cũng không phải là đưa dữ liệu từ 1 sheet sang nhiều sheet như chủ đề của Oanh Thơ đã nêu nữa ạ.
Mà lúc này sẽ là đưa dữ liệu từ nhiều tệp tin vào từng sheet theo điề kiện ví dụ (lấy dữ liệu từ tệp tin "SX.xls!Sheet1" vào tệp tin "Cap nhat danh sach (R).xls!SX" , từ tệp tin "KT.xls!Sheet1" vào tệp tin "Cap nhat danh sach (R).xls!KT"....) như vậy bài toán sẽ rất phức tạp và không đúng với chủ đề Oanh Thơ đã nêu ạ.

Cảm ơn bạn rất nhiều!
Oanh Thơ
 
Upvote 0
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 đó ạ.
...
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 đó...
 
Upvote 0
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ơ ạ.
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
 
Upvote 0
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 đó...

Xin chào befaint, cảm ơn bạn đã quan tâm ạ.

Như Oanh Thơ đã giải thích ở bài 42 đây là 1 bài toán khác đó:lấy dữ liệu từ rất nhiều tệp tin vào 1 tệp tin theo nhiều điều kiện
Bài toán này Oanh Thơ đã nhận được sự trợ giúp của một thành viên của diễn đàn code cho rồi ạ.
Hiện code đó chạy rất OK và trong code có các comment hướng dẫn rất chi tiết nên Oanh Thơ cũng chưa có nhu cầu muốn thay đổi ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
@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)
Mã:
filename = ThisWorkbook.Path & [COLOR=#0000ff]"" [/COLOR]& bo_phan(index) & ".xls"
Hình như thiếu cái gì đó \
 
Upvote 0
@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)
Mã:
filename = ThisWorkbook.Path & [COLOR=#0000ff]"" [/COLOR]& bo_phan(index) & ".xls"
Hình như thiếu cái gì đó \

Xin chào befaint,
Đúng rồi ạ,hiện Oanh Thơ đã copy lại code đưa thẳng vào Web, khi nãy Oanh Thơ đã copy ra notepad rồi mới pase vào web không hiểu sao lại bị lỗi thiếu \ như vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
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

Xin chào HieuCD,
Oanh Thơ đã chạy code trên của bạn trong file thật kết quả đã OK rồi ạ, cảm ơn bạn rất nhiều.
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 ạ.

Còn cầu hỏi bên dưới này của bạn:
trên từng sheet có đủ dữ liệu để xử lý, tại sao phải lấy dữ liệu từ Data2?
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 ạ.
Vì là trên từng sheet bộ phận chưa có dữ liệu nên Oanh Thơ mới sử dụng công thức VLOOKUP để lấy từ Sheet Data2 sang ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
....................
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 ạ.
................

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
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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

Xin chào Ba Tê cảm ơn bạn rất nhiều vì đã hỗ trợ ạ!
Hihi,không phải là do Oanh Thơ không khoái cái
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 ạ.

Nhưng với bài viết này của bạn sau khi đã được bạn chỉnh sửa thì Oanh Thơ đã ứng dụng được vào file thật của mình rồi bạn ạ, kết quả rất OK đúng với mong muốn của Oanh Thơ.
Vậy Oanh Thơ sẽ sử dụng cả 2 code của bạn và bạn HieuCD cho tệp tin của mình ạ. (trong trường hợp lấy 3 Item sử dụng code bài 45. lấy 2 Item sử dụng code bài 50) :-=
(Cả 2 code Oanh Thơ test trong file thật chậm hơn chút xíu so với file mẫu, về số lượng sheet Oanh Thơ vẫn để giống nhau còn về số lượng thành viên trong Sheet Data2 file thật thì nhiều hơn hẳn, có lẽ là vì lý do này mà code chạy chậm hơn).
Oanh Thơ cảm ơn 2 bạn rất nhiều.Nhờ sự nhiệt tình của 2 bạn mà Oanh Thơ đã hoàn thiện được bài toán 3 rồi ạ, ahihihihi.-=.,,

Chỉ còn vài tiếng đồng hồ nữa là chúng ta bước sang năm mới rồi,
Nhân đây Oanh Thơ xin kính chúc tất cả mọi người đón chào một năm mới thật rực rỡ ạ.
Kính chúc diễn đàn ngày một phát triển.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo yêu cầu của bạn Thơ tôi xóa nội dung bài viết này.
Nếu có thể nhờ anh ptm0412 xóa hộ bài này. Cám ơn anh trước.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom