Tìm và ghép 4 dòng thành nhóm có chứa dữ liệu cả cột

Liên hệ QC

pt_hcl

Thành viên hoạt động
Tham gia
15/2/11
Bài viết
138
Được thích
2
Mình có file dữ liệu ở sheet1. Mong GPE xem giúp đỡ trường hợp này ạ: Tìm và ghép 4 dòng dữ liệu thành 1 nhóm sao cho trong 30 cột dữ liệu đầu tiên phải có ít nhất một cột chứa cả 4 ô dữ liệu, 30 cột dữ liệu tiếp theo cũng như vậy phải chứa ít nhất một cột có dữ liệu cả 4 ô, .v.v… cứ như vậy cho đến hết. Kết quả dán sang sheet2
- Chân thành cảm ơn GPE rất nhiều!
 

File đính kèm

  • Ghep_4_dong.rar
    280.4 KB · Đọc: 34
Mình có file dữ liệu ở sheet1. Mong GPE xem giúp đỡ trường hợp này ạ: Tìm và ghép 4 dòng dữ liệu thành 1 nhóm sao cho trong 30 cột dữ liệu đầu tiên phải có ít nhất một cột chứa cả 4 ô dữ liệu, 30 cột dữ liệu tiếp theo cũng như vậy phải chứa ít nhất một cột có dữ liệu cả 4 ô, .v.v… cứ như vậy cho đến hết. Kết quả dán sang sheet2
- Chân thành cảm ơn GPE rất nhiều!
Mỗi lần gặp file này là thấy... vả, vì chẳng hiểu gì ráo
Ẹc.. ẹc...
 
Mỗi lần gặp file này là thấy... vả, vì chẳng hiểu gì ráo
Ẹc.. ẹc...
Đúng là "đau cái điền" bác ndu ạ! Mình xin giải thích đơn giản như sau:
-Tìm 4 dòng ghép vào thành 1 nhóm sao cho:
+ Trong 30 cột đầu tiên tính từ cột B: phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
+ Trong 30 cột tiếp theo (tính từ cột AF) phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
+ Trong 30 cột tiếp theo (tính từ cột BJ) phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
..v.v.. cứ như vậy cho đến 30 cột cuối cùng phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
=> kết quả dán sang sheet2
- Nếu có thể GPE có thể giúp mình trường hợp chặt hơn là tìm 4 dòng ghép lại sao cho:
+ Khoảng cách giữa 2 cột có đủ dữ liệu (ở cả 4 dòng) trong nhóm dòng nhiều nhất là 30 cột => kết quả dán sang sheet2
 
Đúng là "đau cái điền" bác ndu ạ! Mình xin giải thích đơn giản như sau:
-Tìm 4 dòng ghép vào thành 1 nhóm sao cho:
+ Trong 30 cột đầu tiên tính từ cột B: phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
+ Trong 30 cột tiếp theo (tính từ cột AF) phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
+ Trong 30 cột tiếp theo (tính từ cột BJ) phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
..v.v.. cứ như vậy cho đến 30 cột cuối cùng phải có ít nhất một cột có dữ liệu ở cả 4 dòng.
=> kết quả dán sang sheet2
- Nếu có thể GPE có thể giúp mình trường hợp chặt hơn là tìm 4 dòng ghép lại sao cho:
+ Khoảng cách giữa 2 cột có đủ dữ liệu (ở cả 4 dòng) trong nhóm dòng nhiều nhất là 30 cột => kết quả dán sang sheet2
Nhớ có lần tôi từng hỏi bạn: "File này dùng vào việc gì?" nhưng bạn không chịu nói
Nếu biết được mục đích của bạn thì biết đâu ta còn có cách khác tối ưu hơn (bố trí lại dữ liệu chẳng hạn)
Nói chung tôi chẳng khi nào khoái làm 1 việc mà chưa biết rõ mục đích ---> Chỉ vậy thôi!
(code kiết gì gì đó không quan trọng)
Ah... mà bài này hình như đã từng gữi rất nhiều lần rồi, sao không vào chổ cũ hỏi tiếp mà lại mở topic mới nhỉ?
 
Lần chỉnh sửa cuối:
/)ùng cái ni đi đánh đề mà trúng là fải chia bọn này với nhe!

}}}}} }}}}} }}}}}
)(&&@@ )(&&@@ )(&&@@
&&&%$r &&&%$r &&&%$r​
 

File đính kèm

  • GPE.rar
    104.9 KB · Đọc: 22

Vâng! Cảm ơn bạn! Mình đã test và kiểm tra thử thì hình như có chỗ chưa thoả điều kiện bạn ạ?
Ví dụ như file của bạn: thì kết quả ở S2: + Trong 30 cột tiếp theo (tính từ cột AF) phải có ít nhất một cột có dữ liệu ở cả 4 dòng: trong trường hợp này không có cột nào có dữ liệu ở cả 4 dòng?
-Mong bạn xem xét giúp! Cảm ơn bạn nhiều!
 
Kết quả đâu fải ở S2, đó là 01 kết quả trung gian thôi

Chúng ở "KQ" í & vì không thể ghi hết dòng do hạn chế dung lượng đưa lên nên chỉ liệt kê nhóm theo 4 cột đầu tiên của dòng mà thôi.
Bạn cần lấy từng nhóm đó ở trang CSDL để đối chiếu & cho biết cụ thể nhóm nào chưa thoả; Bằng ngược lại là mắc tội vu cáo dó nha!

Sau đây là macro hoàn thiện thêm tí đỉnh nè, gởi bạn thử xem sao:

PHP:
 Option Explicit
Sub Ghep4Dong()
 Dim jJ As Long, Ww As Long, Rws As Long, Zz As Long, Ff As Long, Col As Byte
 Dim Timer_ As Double:              Const SoGy As Double = 300
 Dim Sh As Worksheet
 
 Timer_ = Timer
 Set Sh = ThisWorkbook.Worksheets("S2")
 Sheet1.Select:                     Rws = [A65500].End(xlUp).Row
 Sheets("KQ").Cells.Clear:          Col = 1
 For jJ = 4 To Rws - 3
    Sh.[A1].EntireRow.Value = Cells(jJ, 1).EntireRow.Value
    For Ww = jJ + 1 To Rws - 2
        Sh.[A2].EntireRow.Value = Cells(Ww, 1).EntireRow.Value
        For Zz = Ww + 1 To Rws - 1
            Sh.[A3].EntireRow.Value = Cells(Zz, 1).EntireRow.Value
            For Ff = Zz + 1 To Rws
                Sh.[A4].EntireRow.Value = Cells(Ff, 1).EntireRow.Value
                If Sh.[b7] > 0 And Sh.[ae7] > 0 And Sh.[bi7] > 0 And Sh.[Cm7] > 0 And Sh.[Dq7] > 0 _
                    And Sh.[eu7] > 0 And Sh.[Fy7] > 0 And Sh.[hC7] > 0 And Sh.[iG7] > 0 Then
                    Sh.[A1].Resize(4).Copy Destination:=Sheets("KQ").Cells(65535, Col).End(xlUp).Offset(2)
                End If
                If Sheets("KQ").Cells(65535, Col).End(xlUp).Row > 65515 Then Col = Col + 1
                If Timer() - Timer_ > SoGy Then Exit Sub
            Next Ff
        Next Zz
    Next Ww
 Next jJ
GPE:                                MsgBox Timer - Timer_
End Sub
 
Chúng ở "KQ" í & vì không thể ghi hết dòng do hạn chế dung lượng đưa lên nên chỉ liệt kê nhóm theo 4 cột đầu tiên của dòng mà thôi.
Bạn cần lấy từng nhóm đó ở trang CSDL để đối chiếu & cho biết cụ thể nhóm nào chưa thoả; Bằng ngược lại là mắc tội vu cáo dó nha!

Sau đây là macro hoàn thiện thêm tí đỉnh nè, gởi bạn thử xem sao:

PHP:
 Option Explicit
Sub Ghep4Dong()
Dim jJ As Long, Ww As Long, Rws As Long, Zz As Long, Ff As Long, Col As Byte
Dim Timer_ As Double: Const SoGy As Double = 300
Dim Sh As Worksheet
 
Timer_ = Timer
Set Sh = ThisWorkbook.Worksheets("S2")
Sheet1.Select: Rws = [A65500].End(xlUp).Row
Sheets("KQ").Cells.Clear: Col = 1
For jJ = 4 To Rws - 3
Sh.[A1].EntireRow.Value = Cells(jJ, 1).EntireRow.Value
For Ww = jJ + 1 To Rws - 2
Sh.[A2].EntireRow.Value = Cells(Ww, 1).EntireRow.Value
For Zz = Ww + 1 To Rws - 1
Sh.[A3].EntireRow.Value = Cells(Zz, 1).EntireRow.Value
For Ff = Zz + 1 To Rws
Sh.[A4].EntireRow.Value = Cells(Ff, 1).EntireRow.Value
If Sh.[b7] > 0 And Sh.[ae7] > 0 And Sh.[bi7] > 0 And Sh.[Cm7] > 0 And Sh.[Dq7] > 0 _
And Sh.[eu7] > 0 And Sh.[Fy7] > 0 And Sh.[hC7] > 0 And Sh.[iG7] > 0 Then
Sh.[A1].Resize(4).Copy Destination:=Sheets("KQ").Cells(65535, Col).End(xlUp).Offset(2)
End If
If Sheets("KQ").Cells(65535, Col).End(xlUp).Row > 65515 Then Col = Col + 1
If Timer() - Timer_ > SoGy Then Exit Sub
Next Ff
Next Zz
Next Ww
Next jJ
GPE: MsgBox Timer - Timer_
End Sub
Bạn ơi! Sao mình thử code bạn viết mà không cho kết quả? Mình đã giả định ở CSDL có 4 dòng A1-A2-A3-A4 ghép vào là thoả mãn nhưng khi cho chạy code lại không được?
- Mình có thay đổi thông số "Const SoGy As Double = 300" thành "Const SoGy As Double = 900"
- Mong bạn xem xét giúp mình! Xin cảm ơn bạn rất nhiều!Mình xin gửi kèm file!
 

File đính kèm

  • Ghep_4_dong.rar
    215.9 KB · Đọc: 10
Kết cấu 'S2' không còn như cũ nữa thì macro nó mần răng chừ?

Bạn hãy lấy 'S2' trong file có các dòng 5:7 mà macro cần mới được.

Nói chung loại bài toán của bạn cần xử lí bằng macro & bạn tập tễnh học & hiểu các dòng lệnh macro đi. Không thể hở mỗi tí là mỗi lần hỏi thì mệt mõi lắm ru, cho cả bạn & ~ người viết macro cho bạn!

Trong thời gian này, bạn nên iêu cầu ai đó dịch các dòng lệnh còn lơ mơ để bạn hiểu đi nha!
 
Bạn hãy lấy 'S2' trong file có các dòng 5:7 mà macro cần mới được.

Nói chung loại bài toán của bạn cần xử lí bằng macro & bạn tập tễnh học & hiểu các dòng lệnh macro đi. Không thể hở mỗi tí là mỗi lần hỏi thì mệt mõi lắm ru, cho cả bạn & ~ người viết macro cho bạn!

Trong thời gian này, bạn nên iêu cầu ai đó dịch các dòng lệnh còn lơ mơ để bạn hiểu đi nha!

Cảm ơn bạn ChanhTQ đã chỉ bảo! Đúng là mình đã làm phiền nhiều các bạn quá! Rất mong sự thông cảm cho cái sự lơ mơ của mình!
- " lấy 'S2' trong file có các dòng 5:7 mà macro cần mới được" => mình đúng là không hiểu vấn đề này bạn ạ? Bạn có thể nói rõ hơn được không ạ? Xin chân thành cảm ơn rất nhiều!
 
" lấy 'S2' trong file có các dòng 5:7 mà macro cần mới được" => mình đúng là không hiểu vấn đề này bạn ạ? Bạn có thể nói rõ hơn được không ạ?
Có nghĩa là chạy macro trong workbook của #7 nguyên thuỷ đó; Lúc đó ở trang 'KQ' sẽ có dữ liệu như sau:
|A | B 1 ||
2 ||
3 |A1|
4 |A2|
5 |A5|
6 |A27
7 ||
8 |A1|
9 |A2|
10 |A5|
11 |A33|
12 ||
13 |A1|
14 |A2|
15 |A5|
16 |A39|
17 ||. . .
/-)ó là 3 đáp án đầu tiên cho bạn;
Bạn dò hết các đáp án xem có cái nào chưa thoả thì báo nha!

(húc thành công!
 
Có nghĩa là chạy macro trong workbook của #7 nguyên thuỷ đó; Lúc đó ở trang 'KQ' sẽ có dữ liệu như sau:
|A | B 1 ||
2 ||
3 |A1|
4 |A2|
5 |A5|
6 |A27
7 ||
8 |A1|
9 |A2|
10 |A5|
11 |A33|
12 ||
13 |A1|
14 |A2|
15 |A5|
16 |A39|
17 ||. . .
/-)ó là 3 đáp án đầu tiên cho bạn;
Bạn dò hết các đáp án xem có cái nào chưa thoả thì báo nha!

(húc thành công!
Vâng! Cái đầu mù mờ của mình đã được khai thông một chút rồi ạ! Cảm ơn bạn rất nhiều! Và mấu chốt ở đây đúng như bác ChanhTQ nói đó là dòng 5:7 ở sheet(s2) có công thức! Bài toán trên đúng là đã được giải quyết!
-Còn trường hợp này nếu mình muốn điều kiện chặt hơn thì có thể làm được không ạ:
" Nếu có thể GPE có thể giúp mình trường hợp chặt hơn là tìm 4 dòng ghép lại sao cho: Khoảng cách giữa 2 cột có đủ dữ liệu ở cả 4 dòng trong nhóm nhiều nhất là 30 cột"!
- Một lần nữa xin cảm ơn sự giúp đỡ của các bạn!
 
Mình chỉ mới mường tượng nhiệm vụ bạn đề ra rồi, nhưng cũng cần hỏi thêm: . . .

" Nếu có thể GPE có thể giúp mình trường hợp chặt hơn là tìm 4 dòng ghép lại sao cho: Khoảng cách giữa 2 cột có đủ dữ liệu ở cả 4 dòng trong nhóm nhiều nhất là 30 cột"!

(1) Có tính từ cột đầu trở đi hay không? (Cũng như cột cuối cùng có 4 dữ liệu cách cột cuối (E2003:= 256) bao xa cũng được hay sao? hay vẫn fải <=30 cột trang tính?
(Mà 30 giống số chỉ ngày trong tháng quá!)

(2) Bạn có quan sát các đáp án chưa; chúng có hội có thuyền đó; Hội đoàn của chúng là 3 dòng dữ liệu đầu trong họ nhóm là giống nhau;
Bạn quan sát đi & cho biết nhóm đầu có bao nhiêu đáp án. (Nói đúng chuyện này chứng tỏ ta hiểu í của nhau; & đây cũng là tiền đề để giải bài toán mới đề ra của bạn đó!)

Thân ái & bạn cần cặn kẻ hơn trong khi nêu vấn đề để khỏi tốn thời gian của chúng ta nói riêng & không gian của diễn đàn nói chung!
 
(1) Có tính từ cột đầu trở đi hay không? (Cũng như cột cuối cùng có 4 dữ liệu cách cột cuối (E2003:= 256) bao xa cũng được hay sao? hay vẫn fải <=30 cột trang tính?
(Mà 30 giống số chỉ ngày trong tháng quá!)

(2) Bạn có quan sát các đáp án chưa; chúng có hội có thuyền đó; Hội đoàn của chúng là 3 dòng dữ liệu đầu trong họ nhóm là giống nhau;
Bạn quan sát đi & cho biết nhóm đầu có bao nhiêu đáp án. (Nói đúng chuyện này chứng tỏ ta hiểu í của nhau; & đây cũng là tiền đề để giải bài toán mới đề ra của bạn đó!)

Thân ái & bạn cần cặn kẻ hơn trong khi nêu vấn đề để khỏi tốn thời gian của chúng ta nói riêng & không gian của diễn đàn nói chung!
- Vâng! Cảm ơn rất nhiều ạ!
- Trường hợp này có tính cả từ cột đầu trở đi và cũng như cột cuối cùng (coi 2 cột đó làm mốc) ạ!
- Bài toán này gần giống như tìm số cột max không chứa đầy đủ dữ liệu có trong cột của nhóm dòng:
+ Bước 1: ghép tất cả lần lượt 4 dòng từ trên xuống dưới vào với nhau thành các nhóm dòng (với CSDL ở sheet1 nguyên thủy ơ #7 có lẽ sẽ vượt quá giới hạn của excel nên mình nghi cần bỏ bớt số dòng của CSDL cho phù hợp)
+ Bước 2: tìm số cột max không chứa đầy đủ dữ liệu có trong cột của nhóm dòng.
+ Bước 3: Kết quả là những nhóm có số cột max không chứa đầy đủ dữ liệu có trong cột <= 30
=> Đây là phương án của mình đưa ra có thể không hoàn hảo lắm!
- Nếu bạn có phương án của mình mong bạn giúp đỡ! Xin chân thành cảm ơn!
 
Bạn thử kiểm 100 đáp án đầu tiên xem sao nha

Nếu OK cho 10 chục đó thì tăng trị tại biến Thoat để kiểm tiếp
 

File đính kèm

  • GPE.rar
    175.5 KB · Đọc: 15
Nếu OK cho 10 chục đó thì tăng trị tại biến Thoat để kiểm tiếp
Vâng! Đúng như vậy rồi bạn ạ! Cảm ơn bạn rất nhiều!
- Bạn cho mình hỏi thêm một chút được không ạ: Từ bài toán này mình có thể phát triển thêm đối với trường hợp ghép 2 dòng, 3 dòng thì làm tương tự như vậy phải không ạ?
-Một lần nữa xin chân thành cảm ơn bạn!

-p/s: Mình có chút vấn đề xin hỏi các bạn: Khi mình save as excel marco-enabled workbook chuyển sang Excel 2007 vẫn dữ liệu file đó thì sao lại báo lỗi: Set vRg = Sh.Rows("9:9").SpecialCells(xlCellTypeConstants, 1)
+ nếu mình muốn test thêm nhiều cột dữ liệu nữa ở CSDL sheet1 thì phải làm sao ạ?
 
Lần chỉnh sửa cuối:
- Bạn cho mình hỏi thêm một chút không ạ:

-(1) Từ bài toán này mình có thể phát triển thêm đối với trường hợp ghép 2 dòng, 3 dòng thì làm tương tự như vậy phải không ạ?
- (3) Khi mình save as excel marco-enabled workbook chuyển sang Excel 2007 vẫn dữ liệu file đó thì sao lại báo lỗi: Set vRg = Sh.Rows("9:9").SpecialCells(xlCellTypeConstants, 1)
-(2) nếu mình muốn test thêm nhiều cột dữ liệu nữa ở CSDL sheet1 thì phải làm sao ạ?

(1 & 2) Muốn fát triển sang để giải quyết với trường hợp 2 hay 3 dòng, . . . Bạn fải biết cái mà người ta hay gọi là giải thuật của bài toán;
Trong trường hợp này có lúc bạn đã đưa ra í tưởng giải bài toán cuối của bạn; Vậy giờ thế này đi:

(*) Bạn hãy cho biết giải thuật của fương án I & fương án II (& nhứt là f ương án II có khác với í tưởng của bạn không)

Mở rọng thêm, từ trước đến nay mọi người đã giúp bạn những giải thuật gì, bạn nên thống kê lại hết xem sao!

Sau đó mình hay ai đó sẽ giúp bạn việc đúng sai khi đọc giải thuật của các bài toàn; Chỉ khi đó code của người khác mới thành của mình bạn à!

(Đọc bài của bạn mình mới nẩy ra í sẽ tổng quan các giải thuật cho mọi vấn đề mà bạn đề ra trong GPE.COM này; Để làm việc này, bạn hãy cho mình biết NICK trước của bạn là gì đi!)

(3) Mình chưa có E2007, bạn chịu khó chờ các NICH khác trả lời cho bạn hay nêu câu hỏi tại BOX E2007-E2010 đi bạn!
 
(1 & 2) Muốn fát triển sang để giải quyết với trường hợp 2 hay 3 dòng, . . . Bạn fải biết cái mà người ta hay gọi là giải thuật của bài toán;
Trong trường hợp này có lúc bạn đã đưa ra í tưởng giải bài toán cuối của bạn; Vậy giờ thế này đi:

(*) Bạn hãy cho biết giải thuật của fương án I & fương án II (& nhứt là f ương án II có khác với í tưởng của bạn không)

Mở rọng thêm, từ trước đến nay mọi người đã giúp bạn những giải thuật gì, bạn nên thống kê lại hết xem sao!

Sau đó mình hay ai đó sẽ giúp bạn việc đúng sai khi đọc giải thuật của các bài toàn; Chỉ khi đó code của người khác mới thành của mình bạn à!

(Đọc bài của bạn mình mới nẩy ra í sẽ tổng quan các giải thuật cho mọi vấn đề mà bạn đề ra trong GPE.COM này; Để làm việc này, bạn hãy cho mình biết NICK trước của bạn là gì đi!)

(3) Mình chưa có E2007, bạn chịu khó chờ các NICH khác trả lời cho bạn hay nêu câu hỏi tại BOX E2007-E2010 đi bạn!
Vâng! Cảm ơn sự giúp đỡ của bạn rất nhiều! Nick trước của mình là hcl_pt ạ! Mong bạn quan tâm! Một lần nữa xin cảm ơn bạn!
 
Web KT

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

Back
Top Bottom