Tổng hợp thông tin từ nhiều Sheet (1 người xem)

  • Thread starter Thread starter huy vu
  • Ngày gửi Ngày gửi

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

huy vu

Thành viên hoạt động
Tham gia
29/2/12
Bài viết
164
Được thích
1
Em chào các anh/chị trên GPE
Em có tổng hợp thông tin của khách hàng theo File đính kèm. File gồm 4 sheet:
- General: Chứa thông tin chung của khách hàng.
- Detail: Thông tin tổng hợp của khách hàng (đang được thiết kế dạng Sheet Form).
- I: Thông tin chi tiết của từng khách hàng và từng lần mua hàng I
- II: Thông tin chi tiết của từng khách hàng và từng lần mua hàng II
Tất cả các khách hàng đều có 1 CODE
Sheet General chứa thông tin của khách hàng là duy nhất (không có dữ liệu trùng)
Sheet I, II, từng khách hàng có nhiều lần mua hàng với mã số đơn hàng NO và MONEY khác nhau.
Sheet Detail, Nội dung bao gồm:
- Mục General: căn cứ theo CODE ở [D2], e kết hợp sử dụng INDEX và MATCH để tìm thông tin khách hàng.
- Mục I, II, căn cứ Số thứ tự từ [D21:D23] e cũng sử dụng INDEX và MATCH để tìm theo cột phụ ở Sheet I, II.

Đọc thêm nội dung trong File anh/chị sẽ hiểu rõ hơn.

Tuy nhiên dữ liệu nhiều, thay đổi liên tục, dùng hàm nhiều khi bất tiện và chậm. Do đó em muốn sang sử dụng CODE
Thông tin GENERAL thì không vấn đề gì vì là duy nhất. (e có thể làm được, nếu ko làm được thì dùng hàm cũng được).
Nhưng thông tin ở sheet I, II có khá nhiều. Hiện e mới làm test 1 khách có 6 lần mua hàng, giờ 1 khách có 7, 8 lần mua hàng thì bảng ở Detail không tự mở rộng được.
Em có làm thử phương thức Find, tuy nhiên thì chỉ tìm được dòng đầu tiên xuất hiện.
Em có copy thêm sheet Detail 2. Trước tiên, chỉ cần làm thông tin ở sheet I tổng hợp về Detail 2, từ đó em có thể chế từ sheet II
Mong các anh chị giúp đỡ để có giải pháp khoa học và nhanh chóng hơn !!!
 

File đính kèm

Em chào các anh/chị trên GPE
Em có tổng hợp thông tin của khách hàng theo File đính kèm. File gồm 4 sheet:
- General: Chứa thông tin chung của khách hàng.
- Detail: Thông tin tổng hợp của khách hàng (đang được thiết kế dạng Sheet Form).
- I: Thông tin chi tiết của từng khách hàng và từng lần mua hàng I
- II: Thông tin chi tiết của từng khách hàng và từng lần mua hàng II
Tất cả các khách hàng đều có 1 CODE
Sheet General chứa thông tin của khách hàng là duy nhất (không có dữ liệu trùng)
Sheet I, II, từng khách hàng có nhiều lần mua hàng với mã số đơn hàng NO và MONEY khác nhau.
Sheet Detail, Nội dung bao gồm:
- Mục General: căn cứ theo CODE ở [D2], e kết hợp sử dụng INDEX và MATCH để tìm thông tin khách hàng.
- Mục I, II, căn cứ Số thứ tự từ [D21:D23] e cũng sử dụng INDEX và MATCH để tìm theo cột phụ ở Sheet I, II.

Đọc thêm nội dung trong File anh/chị sẽ hiểu rõ hơn.

Tuy nhiên dữ liệu nhiều, thay đổi liên tục, dùng hàm nhiều khi bất tiện và chậm. Do đó em muốn sang sử dụng CODE
Thông tin GENERAL thì không vấn đề gì vì là duy nhất. (e có thể làm được, nếu ko làm được thì dùng hàm cũng được).
Nhưng thông tin ở sheet I, II có khá nhiều. Hiện e mới làm test 1 khách có 6 lần mua hàng, giờ 1 khách có 7, 8 lần mua hàng thì bảng ở Detail không tự mở rộng được.
Em có làm thử phương thức Find, tuy nhiên thì chỉ tìm được dòng đầu tiên xuất hiện.
Em có copy thêm sheet Detail 2. Trước tiên, chỉ cần làm thông tin ở sheet I tổng hợp về Detail 2, từ đó em có thể chế từ sheet II
Mong các anh chị giúp đỡ để có giải pháp khoa học và nhanh chóng hơn !!!
Copy code cho vào sheet Detail. Chỉ code cho sheet General và sheet I, để lại sheet II cho bạn nghiên cứu đó
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [D4]) Is Nothing Then
    Dim Tim As Range, Data1(), Data2(), i, j, k, NO(), MONEY()
    Set Tim = Sheets("General").[F:F].Find(Target, , , 1)
    If Not Tim Is Nothing Then
        [D7].Resize(, 5).Value = Tim.Offset(, -5).Resize(, 5).Value
    End If
    With Sheets("I")
        Data1 = .Range(.[D2], .[M65536].End(3)).Value
        ReDim NO(1 To UBound(Data1), 1 To 1)
        ReDim MONEY(1 To UBound(Data1), 1 To 1)
    End With
    For i = 1 To UBound(Data1)
        If Data1(i, 1) = Target Then
            k = k + 1
            NO(k, 1) = Data1(i, 2)
            MONEY(k, 1) = Data1(i, 10)
        End If
    Next
    [E17].Resize(6) = NO
    [I17].Resize(6) = MONEY
End If
End Sub
 
Upvote 0
Copy code cho vào sheet Detail. Chỉ code cho sheet General và sheet I, để lại sheet II cho bạn nghiên cứu đó
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [D4]) Is Nothing Then
    Dim Tim As Range, Data1(), Data2(), i, j, k, NO(), MONEY()
    Set Tim = Sheets("General").[F:F].Find(Target, , , 1)
    If Not Tim Is Nothing Then
        [D7].Resize(, 5).Value = Tim.Offset(, -5).Resize(, 5).Value
    End If
    With Sheets("I")
        Data1 = .Range(.[D2], .[M65536].End(3)).Value
        ReDim NO(1 To UBound(Data1), 1 To 1)
        ReDim MONEY(1 To UBound(Data1), 1 To 1)
    End With
    For i = 1 To UBound(Data1)
        If Data1(i, 1) = Target Then
            k = k + 1
            NO(k, 1) = Data1(i, 2)
            MONEY(k, 1) = Data1(i, 10)
        End If
    Next
    [E17].Resize(6) = NO
    [I17].Resize(6) = MONEY
End If
End Sub
E cũng phải ghiền cái này.. rất hay cho báo cáo chi tiết từng khách hàng
 
Upvote 0
Copy code cho vào sheet Detail. Chỉ code cho sheet General và sheet I, để lại sheet II cho bạn nghiên cứu đó
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [D4]) Is Nothing Then
    Dim Tim As Range, Data1(), Data2(), i, j, k, NO(), MONEY()
    Set Tim = Sheets("General").[F:F].Find(Target, , , 1)
    If Not Tim Is Nothing Then
        [D7].Resize(, 5).Value = Tim.Offset(, -5).Resize(, 5).Value
    End If
    With Sheets("I")
        Data1 = .Range(.[D2], .[M65536].End(3)).Value
        ReDim NO(1 To UBound(Data1), 1 To 1)
        ReDim MONEY(1 To UBound(Data1), 1 To 1)
    End With
    For i = 1 To UBound(Data1)
        If Data1(i, 1) = Target Then
            k = k + 1
            NO(k, 1) = Data1(i, 2)
            MONEY(k, 1) = Data1(i, 10)
        End If
    Next
    [E17].Resize(6) = NO
    [I17].Resize(6) = MONEY
End If
End Sub
Em cảm ơn anh QUANGHAI, code đang chạy rất nhanh
Tuy nhiên em có một nội dung là giả sử ở sheet I có thêm CODE khách hàng (ko chỉ xuất hiện 6 lần như ví dụ) mà còn 7, 8... lần. Trong khi sheet Detail ko tự động mở rộng hoặc thu hẹp lại (Thu hẹp lại có thể ko cần nhưng mở rộng ra chắc chắn cần).
Nội dung ở cột này không cần đánh số thứ tự tự động, vì do e đang phải dùng cột phụ nên mới đặt số thứ tự vào đây
 

File đính kèm

  • 2014-08-01_21-53-16.jpg
    2014-08-01_21-53-16.jpg
    63.6 KB · Đọc: 60
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Anh QUANGHAI đã đặt sẵn biến Data2, j để e ngâm cứu nốt ở Sheet II ạ

[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [D4]) Is Nothing Then
Dim Tim As Range, Data1(), Data2(), i, j, k, NO(), MONEY()
Set Tim = Sheets("General").[F:F].Find(Target, , , 1)
If Not Tim Is Nothing Then
[D7].Resize(, 5).Value = Tim.Offset(, -5).Resize(, 5).Value
End If
With Sheets("I")
Data1 = .Range(.[D2], .[M65536].End(3)).Value
ReDim NO(1 To UBound(Data1), 1 To 1)
ReDim MONEY(1 To UBound(Data1), 1 To 1)
End With
For i = 1 To UBound(Data1)
If Data1(i, 1) = Target Then
k = k + 1
NO(k, 1) = Data1(i, 2)
MONEY(k, 1) = Data1(i, 10)
End If

Next
[E17].Resize(6) = NO
[I17].Resize(6) = MONEY
'______________________________________________________________
With Sheets("II")
Data2 = .Range(.[B2], .[AA65536].End(3)).Value
ReDim NO(1 To UBound(Data2), 1 To 1)
ReDim MONEY(1 To UBound(Data2), 1 To 1)
End With
For i = 1 To UBound(Data2)
If Data2(i, 1) = Target Then
j = j + 1
NO(j, 1) = Data2(i, 2)
MONEY(j, 1) = Data2(i, 26)
End If
Next
[E24].Resize(6) = NO
[I24].Resize(6) = MONEY
End If
End Sub[/GPECODE]
Hơi nông dân 1 tí, chế thành 2 vòng lặp, có gì anh/chị trên GPE chỉ bảo thêm nội dung chỗ tự động mở rộng (insert thêm dòng) khi CODE ở sheet I, II tăng thêm
E cảm ơn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Không thì cứ để Max là 10 đi, rồi resize(10). Vì dữ liệu ở II còn liên quan đến I sợ tương đối phức tạp, vòng lặp 2 biết paste NO, MONEY vào đâu ?
 
Upvote 0
Có giải pháp rất nhanh, chính xác là sử dụng Advance Filter với điều kiện lọc là CODE.
Chỉ có điều phải xoay form Detail các mục General, I, II sang ngang chứ ko nằm dọc như của của chủ thớt
 
Upvote 0
Hy vọng sẽ có giải pháp vì cái form này e cũng lượm lặt trên gpe xuống, chỉnh lại theo ý mình thấy cũng đèm đẹp nên ko muốn thay đổi.
Code của a QUANGHAI quá nhanh rùi ạ. Trước mắt e sẽ cho resize hẳn 20 dòng, cần in báo cáo thì tạm ẩn tay các dòng thừa đi cũng được.
Xin cảm ơn.
 
Upvote 0
Copy code cho vào sheet Detail. Chỉ code cho sheet General và sheet I, để lại sheet II cho bạn nghiên cứu đó
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [D4]) Is Nothing Then
    Dim Tim As Range, Data1(), Data2(), i, j, k, NO(), MONEY()
    Set Tim = Sheets("General").[F:F].Find(Target, , , 1)
    If Not Tim Is Nothing Then
        [D7].Resize(, 5).Value = Tim.Offset(, -5).Resize(, 5).Value
    End If
    With Sheets("I")
        Data1 = .Range(.[D2], .[M65536].End(3)).Value
        ReDim NO(1 To UBound(Data1), 1 To 1)
        ReDim MONEY(1 To UBound(Data1), 1 To 1)
    End With
    For i = 1 To UBound(Data1)
        If Data1(i, 1) = Target Then
            k = k + 1
            NO(k, 1) = Data1(i, 2)
            MONEY(k, 1) = Data1(i, 10)
        End If
    Next
    [E17].Resize(6) = NO
    [I17].Resize(6) = MONEY
End If
End Sub
Anh QuangHai ạ. Dùng for next rất dễ hình dung ra hoạt động của code, tuy nhiên dữ liệu của e đang phải dùng tới 5 (co thể hơn nữa) cái for next mà oải quá. Có cách nào hay hơn không các anh/chi.
Một nội dung e muốn hỏi nữa là đoạn code set data1 là cả mảng rộng thế sau đó duyệt qua từng ô, trong khi cột lấy ra thực tế ít hơn thì có giảm tốc độ code?
Em cảm ơn!!!
 
Upvote 0
Dùng for next rất dễ hình dung ra hoạt động của code, tuy nhiên dữ liệu của e đang phải dùng tới 5 (co thể hơn nữa) cái for next mà oải quá. Có cách nào hay hơn không các anh/chi.
Em cảm ơn!!!
Không có file thực tế thì sẽ không bao giờ có câu trả lời đúng

Một nội dung e muốn hỏi nữa là đoạn code set data1 là cả mảng rộng thế sau đó duyệt qua từng ô, trong khi cột lấy ra thực tế ít hơn thì có giảm tốc độ code?
Có nhanh hay chậm thì cũng trong nháy mắt. Chẳng đáng để phải nhức đầu
 
Upvote 0

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

Back
Top Bottom