Vấn đề lấy dữ liệu từ sheet tổng

Liên hệ QC

binhnguyenthanh

Thành viên chính thức
Tham gia
18/8/09
Bài viết
79
Được thích
9
Em đang gặp bài toán như sau:
Sheet đặt hàng là các sản phẩm A,B,C được đặt và mỗi mặt hàng có thể được đặt nhiều lần. Ứng với mỗi mặt hàng thì sẽ có thành phần của mặt hàng đó như mặt hàng A thì có thành phần A1,A2..., Em cần phải lấy dữ liệu từ sheet đặt hàng để đưa ra được kết quả như sheet kết quả (file đính kèm). Em chưa tìm ra giải pháp nào hợp lý vì trong thực tế file dữ liệu của em rất lớn nên không làm thủ công được.
Mong cả nhà giúp đỡ
 

File đính kèm

Em đang gặp bài toán như sau:
Sheet đặt hàng là các sản phẩm A,B,C được đặt và mỗi mặt hàng có thể được đặt nhiều lần. Ứng với mỗi mặt hàng thì sẽ có thành phần của mặt hàng đó như mặt hàng A thì có thành phần A1,A2..., Em cần phải lấy dữ liệu từ sheet đặt hàng để đưa ra được kết quả như sheet kết quả (file đính kèm). Em chưa tìm ra giải pháp nào hợp lý vì trong thực tế file dữ liệu của em rất lớn nên không làm thủ công được.
Mong cả nhà giúp đỡ
Cái này chắc VBA cho nhanh. Bạn gửi file đang làm lên để làm luôn.
 
VBA em cũng biết một tí, bác giúp em ỏ file này sau đó em chuyển ạ vì file bảo mật nên em không dám đưa lên ạ.
Thanks bác!
 
VBA em cũng biết một tí, bác giúp em ỏ file này sau đó em chuyển ạ vì file bảo mật nên em không dám đưa lên ạ.
Thanks bác!
Chẳng có cái gì là mật cả, chỉ có không biết đưa đủ tiêu đề với nội dung giả định thì mới gọi là mật.
 
VBA em cũng biết một tí, bác giúp em ỏ file này sau đó em chuyển ạ vì file bảo mật nên em không dám đưa lên ạ.
Thế bây giờ chọn phương án nào:
1 - Chọn mật ong: Tiếp tục khóc lóc dữ liệu rất lớn, làm thủ công.
2 - Gửi cái file đó lên: Có người làm sẵn cho, click 1 phát rồi chơi cho sướng.
 
Bạn biết VBA rồi thì tôi gợi ý cho file của bạn và áp dụng nhé
Mã:
Sub Test()
Dim aDatHang, aDuLieu, aKetQua
Dim i As Long, j As Long, k As Long
aDatHang = Sheets("Dat hang").Range("A2:B" & Sheets("Dat hang").[A65536].End(3).Row)
aDuLieu = Sheets("Du lieu").Range("A2:B" & Sheets("Du lieu").[A65536].End(3).Row)
ReDim aKetQua(1 To UBound(aDatHang, 1) * UBound(aDuLieu, 1), 1 To 3)

For i = 1 To UBound(aDatHang, 1)
    For j = 1 To UBound(aDuLieu, 1)
        If aDatHang(i, 1) = aDuLieu(j, 1) Then
            k = k + 1
            aKetQua(k, 1) = aDatHang(i, 1)
            aKetQua(k, 2) = aDuLieu(j, 2)
            aKetQua(k, 3) = aDatHang(i, 2)
        End If
    Next
Next
Sheets("Ket qua").Range("A2").Resize(UBound(aKetQua, 1), 3) = aKetQua
End Sub
 
Thanks bác dhn46. Em sẽ test thử và báo cáo bác ạ.
 
Code bài trên nên:
- Sau khi tìm thấy hết cái cần tìm thì thoát vòng lặp, hiện tại mã nào cũng chạy từ đầu tới cuối.
- Đặt thêm biến gán mấy cái ubound() vào để không phải tính lại nhiều lần.
 
Code bài trên nên:
- Sau khi tìm thấy hết cái cần tìm thì thoát vòng lặp, hiện tại mã nào cũng chạy từ đầu tới cuối.
- Đặt thêm biến gán mấy cái ubound() vào để giảm số lần gọi nó.
Bạn hãy cứ để chủ Topic áp dụng cái đã, họ biết VBA (#3) thì hãy gợi ý trước, sai sẽ sửa.
Bài #5 của bạn cũng đã nói tới mật ong với khóc lóc đó thôi. Dữ liệu lớn, chỉ ngay việc đặt cái Redim aKetQua thôi cũng sẽ phát sinh vấn đề.
 
Bạn hãy cứ để chủ Topic áp dụng cái đã, họ biết VBA (#3) thì hãy gợi ý trước, sai sẽ sửa.
Bài #5 của bạn cũng đã nói tới mật ong với khóc lóc đó thôi. Dữ liệu lớn, chỉ ngay việc đặt cái Redim aKetQua thôi cũng sẽ phát sinh vấn đề.
Redim aKetQua đúng là có vấn đề (không hiểu?)
Và ghi kết quả thì .resize (k,3) thì hợp lý.
 
Thanks bác Ba Tê nhưng dữ liệu em không muốn tổng hợp như vậy. Theo hướng dẫn của bác dhn46 (#6) em cũng đã làm được cơ bản công việc rồi ạ. Vấn đề của em là bác dhn46 chèn 65536 hàng nên các hàng không được copy dữ liệu trong vùng đó sẽ mặc định có giá trị rỗng. Có cách nào chỉ copy đúng vùng dữ liệu cần thiết thôi được không ạ.
 
Thanks bác Ba Tê nhưng dữ liệu em không muốn tổng hợp như vậy. Theo hướng dẫn của bác dhn46 (#6) em cũng đã làm được cơ bản công việc rồi ạ. Vấn đề của em là bác dhn46 chèn 65536 hàng nên các hàng không được copy dữ liệu trong vùng đó sẽ mặc định có giá trị rỗng. Có cách nào chỉ copy đúng vùng dữ liệu cần thiết thôi được không ạ.
Không hiểu bạn nói gì. Code bài #6 đâu có chỗ nào mặc định 65536 dòng?
Bạn cũng nói dữ liệu của bạn rất lớn mà.
Nếu bạn muốn liệt kê tất cả từng đơn hàng thì xem lại file này. Thử với kết quả khoảng 100.000 dòng xem sao.
"Du lieu" & "Dat hang" mà có dòng trống xen kẻ là tại bạn nhé.
 

File đính kèm

Vậy thì em không hiểu các tham số của dòng lệnh này ạ. Bác giải thích giúp em. Phần ví dụ (#13) em test thử và cũng rất OK ạ.
Bạn vào Google gõ từ .[A65536].End(3).Row là gì để tìm hiểu. Mình học VBA là dùng F8 duyệt qua từng dòng lệnh trong Code xem nó chạy như thế nào. Có cái gì không biết thì Copy đưa vào Google tra và tìm hiểu về nó (Trong quá trình viết Code thì Google là bạn của mình mà :D)
 
Web KT

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

Back
Top Bottom