Ghép dòng với cột có chứa giá trị theo yêu cầu

Liên hệ QC

sep_hatxel

Thành viên thường trực
Tham gia
24/5/10
Bài viết
217
Được thích
7
- Mình có một vấn đề như sau:
CSDL ở sheet1: tìm dòng dữ liệu ghép với nhau thành nhóm dòng sao cho cột dữ liệu nào của nhóm dòng được ghép vào đều xuất hiện giá trị nhỏ hơn hoặc bằng giá trị mình đưa ra là thoả mãn (ví dụ: nhỏ hơn hoặc bằng 1, nhỏ hơn hoặc bằng 2,..v.v..). Kết quả tìm được dán vào sheet2.
- Mình làm Ví dụ minh hoạ cho trường hợp ghép 2 dòng và điều kiện là các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 2 (kết quả dán sang sheet2)
- Mong GPE giúp cho mình Trường hợp ghép 2 dòng, 3 dòng: với 5 điều kiện lần lượt là các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 1, 2, 3, 4, 5
- Rất mong sự giúp đỡ của các bạn! Xin chân thành cảm ơn các bạn!
 

File đính kèm

  • Ghepdong_cotchuagiatritheoyeucau.xls
    42.5 KB · Đọc: 11
Câu hỏi của bạn chưa hiểu, kết quả bạn làm cũng không hiểu lắm, haizi ghép như thế nào, nhỏ hơn 2 thì kết quả bạn muốn là như thế nào, và bạn muốn điện vào đâu để tham chiếu, tôi đọc câu hỏi thấy rất khó hiểu @@
 
Câu hỏi của bạn chưa hiểu, kết quả bạn làm cũng không hiểu lắm, haizi ghép như thế nào, nhỏ hơn 2 thì kết quả bạn muốn là như thế nào, và bạn muốn điện vào đâu để tham chiếu, tôi đọc câu hỏi thấy rất khó hiểu @@

- Thành thật xin lỗi các bạn vì câu hỏi khó hiểu, mình xin nói rõ hơn như sau:
1/ Mình xin nói rõ cách tìm thủ công trường hợp ghép 2 dòng:
* Điều kiện là các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 2 như sau:
- Lấy dòng đầu tiên A1 ghép với dòng A2: rồi xem lần lượt các cột nếu cột nào cũng xuất hiện ít nhất 1 giá trị nhỏ hơn hoặc bằng 2 (xuất hiện giá trị 1 hoặc 2) thì là thoả mãn => dán sang sheet2 (ở ví dụ minh hoạ dòng ghép A1A2 là thoả mãn)
+ Tiếp tục lấy dòng A1 ghép với dòng A3: rồi xem lần lượt các cột nếu gặp cột không xuất hiện giá trị 1 hoặc 2 thì là không thoả mãn=> bỏ qua
+ Cứ như vậy ghép dòng A1 lần lượt với các dòng còn lại: ta có các dòng ghép: A1A2, A1A3, A1A4, A1A5,...v.v... dòng ghép nào thoả mãn điều kiện các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 2 thì các kết quả dán sang sheet2 (ở ví dụ minh hoạ mình lấy 2 trường hợp là A1A2, A1A5,..v..v..)
- Tiếp theo đến dòng A2 làm tương tự ghép lần lượt với dòng A3, A4, .v..v : ta có các dòng ghép: A2A3, A2A4,A2A5,..v.v... dòng ghép nào thoả mãn điều kiện các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 2 thì các kết quả dán sang sheet2
- Cứ ghép như vậy cho đến hết. Các kết quả dán sang sheet2 cách nhau 1 dòng
* Điều kiện là các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 1 (xuất hiện giá trị 1), các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 3 (xuất hiện giá trị 1 hoặc 2, 3), các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 4 (xuất hiện giá trị 1 hoặc 2, 3, 4), các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 5 (xuất hiện giá trị 1 hoặc 2, 3, 4, 5) làm tương tự như trên.
2/ Trường hợp ghép 3 dòng với các điều kiện các cột đều xuất hiện giá trị nhỏ hơn hoặc bằng 1, 2, 3, 4, 5 thì cách làm cũng giống như trên.
* Rất mong sự giúp đỡ của các bạn, xin chân thành cảm ơn!
 
Lần chỉnh sửa cuối:
Chẳng biết kết quả bạn muốn ra sao, nếu cho chạy từ 1 tới 5 kết quả sẽ bị nhắc lại ( thí dụ tìm 4 sẽ nhắc lại kết quả của 3,2,1)
Làm tạm thế này, ở A1 nhập số dòng muốn ghép ( 2 hoặc 3 ), ở A2 nhập số Min, xong bấm vào đầu con mèo, có gì nói sau
Thân
 

File đính kèm

  • Ghepdong_cotchuagiatritheoyeucau.rar
    38.2 KB · Đọc: 24
Chẳng biết kết quả bạn muốn ra sao, nếu cho chạy từ 1 tới 5 kết quả sẽ bị nhắc lại ( thí dụ tìm 4 sẽ nhắc lại kết quả của 3,2,1)
Làm tạm thế này, ở A1 nhập số dòng muốn ghép ( 2 hoặc 3 ), ở A2 nhập số Min, xong bấm vào đầu con mèo, có gì nói sau
Thân
Em xin cảm ơn thầy rất nhiều! Rất tuyệt thầy ạ! Em xin hỏi thêm thầy một chút được không ạ: Nếu CSDL của file có khoảng 1000000 dòng và 100 cột, thì có cách nào tính được thời gian chạy marco không ạ? Tức là xem chạy marco với dữ liệu đó mất khoảng bao lâu thời gian? (Tất nhiên là e chỉ cho kết quả đúng vài trường hợp là thoả mãn thôi ạ)
 
Tất nhiên là được thôi bạn ah. Bạn tìm trong điễn đàn cũng nhiều bài nói về cách tính thời gian chạy lắm đó
 
Option Explicit


Public Sub ChayChayChay()
Dim Vung, I, J, K, M, kK, Mg, iCot, DkSo, DkDong
Application.ScreenUpdating = False
iCot = Sheets("sheet1").Range(Sheets("sheet1").[B1], Sheets("sheet1").[B1].End(xlToRight)).Columns.Count
Set Vung = Sheets("sheet1").Range(Sheets("sheet1").[A4], Sheets("sheet1").[A1000].End(xlUp)).Resize(, iCot + 1)
[A5:AY50000].ClearContents
DkDong = [A1]: DkSo = [A2]
If DkDong = "" Or DkSo = "" Then
MsgBox "Nhap Du 2 cell A1 & A2 Di Cha Noi", , "Nhap So Dong & So Min"
Exit Sub
End If
If DkDong = 2 Then
For I = 1 To Vung.Rows.Count - 1
For J = I + 1 To Vung.Rows.Count
For K = 2 To Vung.Columns.Count
If Application.WorksheetFunction.Min(Vung(I, K), Vung(J, K)) > DkSo Then
Exit For
ElseIf K = Vung.Columns.Count Then
Sheets("sheet2").[B50000].End(xlUp)(3).Offset(, -1).Resize(, Vung.Columns.Count).Value = Vung.Rows(I).Value
Sheets("sheet2").[B50000].End(xlUp)(2).Offset(, -1).Resize(, Vung.Columns.Count).Value = Vung.Rows(J).Value
End If
Next K
Next J
Next I
ElseIf DkDong = 3 Then
For I = 1 To Vung.Rows.Count - 2
For J = I + 1 To Vung.Rows.Count - 1
For M = J + 1 To Vung.Rows.Count
For K = 2 To Vung.Columns.Count
If Application.WorksheetFunction.Min(Vung(I, K), Vung(J, K), Vung(M, K)) > DkSo Then
Exit For
ElseIf K = Vung.Columns.Count Then
Sheets("sheet2").[B50000].End(xlUp)(3).Offset(, -1).Resize(, Vung.Columns.Count).Value = Vung.Rows(I).Value
Sheets("sheet2").[B50000].End(xlUp)(2).Offset(, -1).Resize(, Vung.Columns.Count).Value = Vung.Rows(J).Value
Sheets("sheet2").[B50000].End(xlUp)(2).Offset(, -1).Resize(, Vung.Columns.Count).Value = Vung.Rows(M).Value
End If
Next K
Next M
Next J
Next I
End If
Application.ScreenUpdating = True
End Sub
Các bạn cho mình hỏi một chút, nếu mình xử lí với vùng dữ liệu ở sheet1 là 5500 dòng và 735 cột thì mình sẽ chỉnh sửa code ở giá trị nào? Xin cảm ơn!
 
Chỗ này:
Set Vung = Sheets("sheet1").Range(Sheets("sheet1").[A4], Sheets("sheet1").[A1000].End(xlUp)).Resize(, iCot + 1)
thành:
Set Vung = Sheets("sheet1").Range(Sheets("sheet1").[A4], Sheets("sheet1").[A50000].End(xlUp)).Resize(, iCot + 1)
Và chỗ này:
thành
[A5:A50000].Resize (,iCot+1).ClearContents
Chú ý, dữ liệu khủng khiếp quá coi chừng máy ......bốc khói vì phải chạy vòng lặp rất nhiều đấy, cái này bạn có thể tính được gần đúng đấy
Nếu quyết tâm chạy như thế có khi Diễn đàn tổ chức sinh nhật xong, tụi mình xỉn hết rồi thì bạn mới xong quá, hihi
Híc, sao không ngắt dữ liệu ra mà chạy hả bạn ???
Thân
 
Chỗ này:

thành:
Set Vung = Sheets("sheet1").Range(Sheets("sheet1").[A4], Sheets("sheet1").[A50000].End(xlUp)).Resize(, iCot + 1)
Và chỗ này:

thành

Chú ý, dữ liệu khủng khiếp quá coi chừng máy ......bốc khói vì phải chạy vòng lặp rất nhiều đấy, cái này bạn có thể tính được gần đúng đấy
Nếu quyết tâm chạy như thế có khi Diễn đàn tổ chức sinh nhật xong, tụi mình xỉn hết rồi thì bạn mới xong quá, hihi
Híc, sao không ngắt dữ liệu ra mà chạy hả bạn ???
Thân
Thầy ơi! Cảm ơn thầy! Thầy cho em hỏi tiếp được không ạ:
1/ Làm thế nào tính được giá trị gần đúng đó ạ?
2/ Ngắt dữ liệu ra mà chạy là như thế nào ạ và cách làm ra sao?
Thầy và các bạn GPE có thê chỉ giúp cho em được không?
 
Thầy ơi! Cảm ơn thầy! Thầy cho em hỏi tiếp được không ạ:
1/ Làm thế nào tính được giá trị gần đúng đó ạ?
2/ Ngắt dữ liệu ra mà chạy là như thế nào ạ và cách làm ra sao?
Thầy và các bạn GPE có thê chỉ giúp cho em được không?
1/ Làm thế nào tính được giá trị gần đúng đó ạ?
Gần đúng đây là mình nói về số lần vòng lặp chạy
Với đề bài của bạn, thí dụ ghép 2 dòng, ta có thể dùng hàm COMBIN để đếm số vòng chạy theo hàng * số cột= số lần lặp ( nếu số dòng ghép không thỏa càng nhiều thì số lần chạy càng giảm)
Với bài của bạn, code chạy mất 1 giậy ( còn tùy thuộc vào kết quả nhiều hay ít - càng ít chạy càng lẹ - & máy mạnh yếu nữa)
2/ Ngắt dữ liệu ra mà chạy là như thế nào ạ và cách làm ra sao?
Theo mình, dữ liệu lớn như thế, khi chạy code mình khai báo dòng dữ liệu giới hạn để chạy thôi, thí dụ có 5000 dòng, 500 cột, bấm phím nóng chạy code, hiện bảng chọn vùng, mình chỉ cho chạy từ hàng 1 tới 70 hay 100, 200......gì đó trong giới hạn thời gian mà mình ........chịu đựng được
Cứ thế tiếp tục chạy, chán thì đi ngủ, mai, mốt, hay lúc nào rảnh chạy tiếp cũng chẳng chết thằng tây nào cả. Híc
Thân
 
Gần đúng đây là mình nói về số lần vòng lặp chạy
Với đề bài của bạn, thí dụ ghép 2 dòng, ta có thể dùng hàm COMBIN để đếm số vòng chạy theo hàng * số cột= số lần lặp ( nếu số dòng ghép không thỏa càng nhiều thì số lần chạy càng giảm)
Thân

Số này tính được chính xác chứ bác?

Sao bác không cho code chạy nhanh lên cho nó nhanh
 
Thầy ơi cái này là sao hả thầy, cho e xin hỏi làm như thế nào ạ?
...khi chạy code mình khai báo dòng dữ liệu giới hạn để chạy thôi, thí dụ có 5000 dòng, 500 cột, bấm phím nóng chạy code, hiện bảng chọn vùng, mình chỉ cho chạy từ hàng 1 tới 70 hay 100, 200......gì đó trong giới hạn thời gian mà mình ........chịu đựng được
Cứ thế tiếp tục chạy, chán thì đi ngủ, mai, mốt, hay lúc nào rảnh chạy tiếp...
Xin cảm ơn thầy ạ!
 
Số này tính được chính xác chứ bác?

Sao bác không cho code chạy nhanh lên cho nó nhanh
Số này tính được chính xác chứ bác?
Thật tình mình không tính được, chạy theo hàng : OK, chạy theo cột nếu phát hiện không thỏa điều kiện càng sớm chạy...............càng ít ==> đỡ mệt
Sao bác không cho code chạy nhanh lên cho nó nhanh
Thật tình mình cũng cóc biết làm sao code chạy nhanh hơn, lảm mảng mãi phát chán, xử lý lại trên sheet hông thôi nó quên mất
sep_hatxel
Thầy ơi cái này là sao hả thầy, cho e xin hỏi làm như thế nào ạ?
Thì mình..........nháp trong đầu như thế, lúc nào rảnh bạn thử đưa file có khoảng 1000 dòng & khoảng 700 cột mình thử tìm cách xử nó xem sao, mình chưa bao giờ xử lý dữ liệu "khủng" như thế, mà nếu làm hổng được, tới ngày sinh nhật Diễn đàn, mình sẽ nhờ Thầy Ndu làm giúp cho bạn, hihi
Híc, chú Tùng rủ đi "tạc lon" bàn chuyện tổ chức sinh nhật diễn đàn...........mệt quá, có nói gì sai xin các bạn bỏ quá
Thân
 
Thật tình mình không tính được, chạy theo hàng : OK, chạy theo cột nếu phát hiện không thỏa điều kiện càng sớm chạy...............càng ít ==> đỡ mệt

Thật tình mình cũng cóc biết làm sao code chạy nhanh hơn, lảm mảng mãi phát chán, xử lý lại trên sheet hông thôi nó quên mất

Thì mình..........nháp trong đầu như thế, lúc nào rảnh bạn thử đưa file có khoảng 1000 dòng & khoảng 700 cột mình thử tìm cách xử nó xem sao, mình chưa bao giờ xử lý dữ liệu "khủng" như thế, mà nếu làm hổng được, tới ngày sinh nhật Diễn đàn, mình sẽ nhờ Thầy Ndu làm giúp cho bạn, hihi
Híc, chú Tùng rủ đi "tạc lon" bàn chuyện tổ chức sinh nhật diễn đàn...........mệt quá, có nói gì sai xin các bạn bỏ quá
Thân

Thầy ơi! Vì file dung lượng lớn nên Em xin mạn phép gửi thầy qua email file dung lượng 1000 dòng 800 cột. Mong thầy giúp em. Em xin cảm ơn ạ!
 
Web KT

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

Back
Top Bottom