Cải tiến tốc độ macro

Liên hệ QC
PHP:

Hình như phải là > 0 thì thoát trước hạn mới phải?

Mà sao không dùng 1 If thôi?

PHP:
If Len(Arr(i, n) & Arr(i, n + 1) & Arr(j, n) & Arr(j, n + 1)) > 0 Then Exit For
Thú thật em cũng chưa hiểu yêu cầu là như thế nào.
Vậy theo Bác Sa và Anh Mỹ thì thế nào mới là điều kiện.
Xin cho em cụ thể theo data. Xin cám ơn.
Em đã gán code vào và chạy thử ra KQ ở sh 3 cũng trùng như code Bác Sa (sh 2).
Và còn
PHP:
If Len(Arr(i, n) & Arr(i, n + 1) & Arr(j, n) & Arr(j, n + 1)) > 0 Then Exit For
Thì em tách ra làm 4 if vẫn nhanh hơn dồn lại với dữ liệu lơn.
 

File đính kèm

  • Tim_02-CapRong.rar
    406.8 KB · Đọc: 19
Lần chỉnh sửa cuối:
Yêu cầu là xét 1 dòng với tất cả các dòng còn lại (từng dòng 1).
Điều kiện là, xét lần lượt từng cặp cột kế nhau (2 dòng là 4 ô), hễ có ít nhất 1 ô có dữ liệu thì đạt.
Nếu 2 cột (1, 2) không thoả thì phải xét tiếp cặp cột kế (3, 4), cho đến hết (199, 200) gì đó.

Như vậy ta phân tích ngược thế nào là không thoả, sẽ có 2 loại không thoả đk:

1. Dòng trống (tác giả khẳng định không có dòng trống)

2. Dòng có dữ liệu xen kẽ 2 cột một: Thí dụ 1 dòng có dữ liệu toàn ô xanh, 1 dòng có dữ liệu toàn ô đỏ. (theo cách tô màu file gốc: 2 cột xanh, 2 cột đỏ, rồi 2 cột xanh ... đến hết)
 
Yêu cầu là xét 1 dòng với tất cả các dòng còn lại (từng dòng 1).
Điều kiện là, xét lần lượt từng cặp cột kế nhau (2 dòng là 4 ô), hễ có ít nhất 1 ô có dữ liệu thì đạt.
Nếu 2 cột (1, 2) không thoả thì phải xét tiếp cặp cột kế (3, 4), cho đến hết (199, 200) gì đó.

Như vậy ta phân tích ngược thế nào là không thoả, sẽ có 2 loại không thoả đk:

1. Dòng trống (tác giả khẳng định không có dòng trống)

2. Dòng có dữ liệu xen kẽ 2 cột một: Thí dụ 1 dòng có dữ liệu toàn ô xanh, 1 dòng có dữ liệu toàn ô đỏ. (theo cách tô màu file gốc: 2 cột xanh, 2 cột đỏ, rồi 2 cột xanh ... đến hết)
1/ Dòng trống: Theo data thí khá nhiều cụ thể dòng có số 17, 18 ...
2/ Cái vụ 2 ô liên tiếp (xanh, đỏ) này hơi khó hiểu. Nếu toàn ô đỏ không có dữ liệu hay ô xanh không có dữ liệu thì thỏa hay không thỏa hay chỉ duy nhất 1 cặp ô (xanh hay đỏ) kg có dữ liệu là thoả (thoát).
 
1. Tác giả nói dữ liệu thực không trống
2. Dòng (A) toàn ô đỏ không có dữ liệu, thì vẫn xét, gặp dòng (B) toàn ô xanh không có dữ liệu, mới loại bỏ. Gặp dòng (C) có dữ liệu vừa xanh vừa đỏ cũng có cơ may!
 
1. Tác giả nói dữ liệu thực không trống
2. Dòng (A) toàn ô đỏ không có dữ liệu, thì vẫn xét, gặp dòng (B) toàn ô xanh không có dữ liệu, mới loại bỏ. Gặp dòng (C) có dữ liệu vừa xanh vừa đỏ cũng có cơ may!
Em test theo data thì chỉ có cặp 0:2 và đến 0:11074 mới thoả, chả biết yêu cầu tác giả thế nào nhưng Anh và Bác Sa có thể cho em 1 vd mà thoả với dòng 0 trên gần nhất, em sẽ tự suy luận.
 
To ThuNghi

Chương trình chúng ta đang có 3 vòng lặp; 2 Vòng ngoài miễn bàn đến.

Vòng thứ 3 phải duyệt từ cột đầu tiên (*) của 2 dòng có DL (dữ liệu) (Không kể cột 'A') cho đến cột lớn hơn trong 2 dòng đang xét có DL
(Giải thích dấu *: Nếu cột đầu tiên có thứ tự lẽ thì fải xét từ cột trước nó 1 cột.)

Ví dụ dòng 1 có 97 ô chứa DL bắt đầu từ C1 rãi cách khoảng cho đến HA1;
Dòng 8 có 78 ô chứa DL bắt đầu từ F8 cho đến iA8;

Nhưng vòng lặp 3 này ta chỉ xét từ cột 'B' cho tới cột 'iA' mà thôi. Vì:
(1) Tuy dòng 1 có dử liệu từ cột 'C' nhưng yêu cầu đề ra là xét 2 cặp ô bắt đầu từ cột 'B"
(2) Từ sau cột iA trở về cuối ở cả 2 dòng không còn ô nào chứa DL, nên khỏi tốn công xét tiếp.

Khi xét 2 cặp ô liền nhau thì, Nếu chỉ cần có 1 ô có DL là thỏa điều kiện & chép 2 dòng này sang trang tính khác & tiếp tục cuốc hành trình ờ cặp dòng khác sau nó.

--=0 --=0 --=0

Tuy tác giả khẳng định là DL thực không có hàng trống; nhưng thật ra, CSDL mà tác giả đưa lên có khoảng 1/10 số hàng rỗng tuếch;

( Mình cũng đã mất ~ nữa giây để loại chúng ra rồi.)
 
Lần chỉnh sửa cuối:
Chương trình chúng ta đang có 3 vòng lặp; 2 Vòng ngoài miễn bàn đến.

Vòng thứ 3 phải duyệt từ cột đầu tiên (*) của 2 dòng có DL (dữ liệu) (Không kể cột 'A') cho đến cột lớn hơn trong 2 dòng đang xét có DL
(Giải thích dấu *: Nếu cột đầu tiên có thứ tự lẽ thì fải xét từ cột trước nó 1 cột.)

Ví dụ dòng 1 có 97 ô chứa DL bắt đầu từ C1 rãi cách khoảng cho đến HA1;
Dòng 8 có 78 ô chứa DL bắt đầu từ F8 cho đến iA8;

Nhưng vòng lặp 3 này ta chỉ xét từ cột 'B' cho tới cột 'iA' mà thôi. Vì:
(1) Tuy dòng 1 có dử liệu từ cột 'C' nhưng yêu cầu đề ra là xét 2 cặp ô bắt đầu từ cột 'B"
(2) Từ sau cột iA trở về cuối ở cả 2 dòng không còn ô nào chứa DL, nên khỏi tốn công xét tiếp.

--=0 --=0 --=0

Tuy tác giả khẳng định là DL thực không có hàng trống; nhưng thật ra, CSDL mà tác giả đưa lên có khoảng 1/10 số hàng rỗng tuếch;

( Mình cũng đã mất ~ nữa giây để loại chúng ra rồi.)
Theo em thấy theo data thì của file kèm, file Tim_01
1/ Dòng (không nói gt cột A) 1 thì IU1 có dữ liệu và em đếm chỉ có 79 ô.
2/ Dòng (không nói gt cột A) 8 thì chỉ có F8 và G8 có dữ liệu và đếm là 2.
Vậy dòng 1 (0) và dòng 8 (7) thoả hay không thoả, ie lấy 2 dòng này không.

Em cám ơn.
 
Lần chỉnh sửa cuối:
Thôi, thì thế này đi:

Tuấn lấy cái con macro mà tác giả cho chạy 5 giờ đồng hồ đó;

Thêm điều kiện là sau 2 fút thì thoát khỏi macro luôn & xem kết quả sau 2 fút đó là biết liền hà.


Từ macro đó Tuấn sửa lại & thêm mảng vô xem sao.

--=0--=0 --=0 --=0
Còn cái dòng 1 & dòng 8 trên là nói khơi khơi vậy mà, có bám vô CSDL đâu!
 
Em test theo data thì chỉ có cặp 0:2 và đến 0:11074 mới thoả, chả biết yêu cầu tác giả thế nào nhưng Anh và Bác Sa có thể cho em 1 vd mà thoả với dòng 0 trên gần nhất, em sẽ tự suy luận.
Bạn ThuNghi àh! Đúng là tốc độ maco bạn viết nhanh thật! Mình chỉ biết thốt lên kinh ngạc mà thôi (mình chạy mất khoảng 13 phút)! Các cặp bạn chép sang sheet3 đúng là thoả mãn điều kiện đấy! Bạn có thể hiểu Điều kiện là khi ghép cặp: không tính cột A thì cứ xét 2 cột thành một nhóm: (B;C), (D;E), (F;G),...,(IT;IU) nếu cứ có dữ liệu trong tất cả các nhóm là chép, còn nếu có 1 nhóm bất kì nào đó mà không có dữ liệu là bỏ qua! Mình không biết code của bạn viết có bỏ qua trường hợp nào không? Nhưng thật sự cảm ơn bạn! Bạn có thể chỉnh lại một chút được không sao cho dữ liệu khi chép sang sheet3 vẫn giữ nguyên định dạng ban đầu của các dòng như ở sheet1! (Ví dụ: ở sheet1, xét cột A: nếu mình thay đổi kí hiệu hay thay đổi màu kí hiệu cho dễ theo dõi thì khi chép sang sheet 3 cũng tuỳ biến theo giữ nguyên định dạng ban đầu. Vì mình thấy bạn mặc định ở cột A mất rồi).Thân ái! Một lần nữa xin cảm ơn bạn và mọi người! cảm ơn GPE!
 
Bạn ThuNghi àh! Đúng là tốc độ maco bạn viết nhanh thật! Mình chỉ biết thốt lên kinh ngạc mà thôi (mình chạy mất khoảng 13 phút)! Các cặp bạn chép sang sheet3 đúng là thoả mãn điều kiện đấy! Bạn có thể hiểu Điều kiện là khi ghép cặp: không tính cột A thì cứ xét 2 cột thành một nhóm: (B;C), (D;E), (F;G),...,(IT;IU) nếu cứ có dữ liệu trong tất cả các nhóm là chép, còn nếu có 1 nhóm bất kì nào đó mà không có dữ liệu là bỏ qua! Mình không biết code của bạn viết có bỏ qua trường hợp nào không? Nhưng thật sự cảm ơn bạn! Bạn có thể chỉnh lại một chút được không sao cho dữ liệu khi chép sang sheet3 vẫn giữ nguyên định dạng ban đầu của các dòng như ở sheet1! (Ví dụ: ở sheet1, xét cột A: nếu mình thay đổi kí hiệu hay thay đổi màu kí hiệu cho dễ theo dõi thì khi chép sang sheet 3 cũng tuỳ biến theo giữ nguyên định dạng ban đầu. Vì mình thấy bạn mặc định ở cột A mất rồi).Thân ái! Một lần nữa xin cảm ơn bạn và mọi người! cảm ơn GPE!
1/ Bạn yên tâm, nếu yêu cầu "nếu có 1 nhóm bất kì nào đó mà không có dữ liệu là bỏ qua" thì 4 vòng if trên là OK rồi.
2/ Bạn định dạng tô màu lại sh 1 và sh 3 cũng như vậy là OK, còn nếu có thể thêm 1 dòng code xóa sh 3 trước khi chạy. Cells.ClearContents
 
Mọi người chú ý nha. Tôi thấy tác giả có nói một câu như thế này:
Vâng! Cảm ơn rất nhiều GPE đã giúp đỡ! Mình tô màu cho dễ theo dõi thôi ạ! Vấn đề mấu chốt ở đây là tìm ghép 2 dòng dữ liệu sao cho khi ghép trống nhiều nhất không quá 2 cột liên tiếp!
Yêu cầu này hoàn toàn khác với yêu cầu bốn ô cùng màu ít nhất có một ô có dữ liệu.
Tôi ví dụ như thế này:
_0_1_0_0_0_1
_0_0_0_0_1_0

Nếu điều kiện là sau khi ghép số cột không có dữ liệu liên tiếp không quá hai cột thì trường hợp này thỏa điều kiện.
Nếu điều kiện là sau khi ghép bốn ô cùng màu có ít nhất một ô có dữ liệu thì trường hợp này không thỏa điều kiện.
Tác giả cần xem lại xem yêu cầu của mình chính xác là như thế nào.
 
Mọi người chú ý nha. Tôi thấy tác giả có nói một câu như thế này:
Yêu cầu này hoàn toàn khác với yêu cầu bốn ô cùng màu ít nhất có một ô có dữ liệu.
Tôi ví dụ như thế này:
_0_1_0_0_0_1
_0_0_0_0_1_0
Nếu điều kiện là sau khi ghép số cột không có dữ liệu liên tiếp không quá hai cột thì trường hợp này thỏa điều kiện.
Nếu điều kiện là sau khi ghép bốn ô cùng màu có ít nhất một ô có dữ liệu thì trường hợp này không thỏa điều kiện.
Tác giả cần xem lại xem yêu cầu của mình chính xác là như thế nào.
Vâng! Rất cảm ơn bạn đã quan tâm! Yêu cầu trên là thoáng hơn so với yêu cầu bốn ô cùng màu ít nhất có một ô có dữ liệu! Bạn có thể hiểu yêu cầu trong bốn ô cùng màu ít nhất một ô có dữ liệu tương đương với điều kiện sau: khi ghép cặp, không tính cột A thì cứ xét 2 cột thành một nhóm: (B;C), (D;E), (F;G),...,(IT;IU) nếu cứ có dữ liệu trong tất cả các nhóm là chép, còn nếu có 1 nhóm bất kì nào đó mà không có dữ liệu là bỏ qua! (vì yêu cầu này có vẻ chặt hơn và khó hơn nên mình mới nới rộng ra là khi ghép cặp: số cột không có dữ liệu liên tiếp không quá hai cột thì trường hợp này thỏa điều kiện)! Vâng, nếu bạn giúp được 1 trong 2 trường hợp là đều rất đáng quý bạn àh! Cảm ơn bạn!
 
Lần chỉnh sửa cuối:
1/ Bạn yên tâm, nếu yêu cầu "nếu có 1 nhóm bất kì nào đó mà không có dữ liệu là bỏ qua" thì 4 vòng if trên là OK rồi.
2/ Bạn định dạng tô màu lại sh 1 và sh 3 cũng như vậy là OK, còn nếu có thể thêm 1 dòng code xóa sh 3 trước khi chạy. Cells.ClearContents
Bạn ThuNghi ơi! Nếu bây giờ mình muốn thêm điều kiện là khi ghép cặp thì cột B không được có dữ liệu, sau đó mới xét đến 2 cột liên tiếp làm một nhóm (C;D), (E;F),...,(IU;IV) nếu có dữ liệu trong tất cả các nhóm này thì mới chép, còn nếu có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua! Bạn có thể chỉnh lại code cho điều kiện đó được không? Mình mong sự hồi âm của bạn! Thân ái!
 
Bạn ThuNghi ơi! Nếu bây giờ mình muốn thêm điều kiện là khi ghép cặp thì cột B không được có dữ liệu, sau đó mới xét đến 2 cột liên tiếp làm một nhóm (C;D), (E;F),...,(IU;IV) nếu có dữ liệu trong tất cả các nhóm này thì mới chép, còn nếu có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua! Bạn có thể chỉnh lại code cho điều kiện đó được không? Mình mong sự hồi âm của bạn! Thân ái!
Sorry, code trước thiếu vòng lặp for n. Mới có
For n = 1 To (endC - 1) / 2 - 1 Step 2
Phải là
For n = 1 To endC - 1 Step 2
Còn nếu theo yêu cầu nữa thì xét cái Arr01 trước nếu cột B="" thì tạo ra Arr02 và xét theo Arr02 này.
Có phải điều kiện là
1/ Cột B có dữ liệu thì thoát. Chỉ xét cột B rỗng.
Hay là
2/ Các nhóm (C;D), (E;F),...,(IU;IV) nếu có dữ liệu trong tất cả các nhóm này thì mới chép, còn nếu có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua
Chạy thử code hình như không thấy hàng nào có. Và lưu ý có khả năng ArrKQ có số dòng > 65000 vì có thể thoả hết => số dòng quá lớn.
PHP:
Option Explicit
Const endC As Long = 256
Dim endR As Long, i As Long, j As Long, n As Long, s As Long, k As Long
Dim Arr01(), Arr(), ArrKQ(), myArr()
Dim Timer_ As Double
Sub LocTwoRows2()
Timer_ = Timer
With Sheet1
  endR = .Cells(65000, 1).End(xlUp).Row
  Arr01 = .Range(.Cells(1, 1), .Cells(endR, endC))
End With
'tim arr co cot B <> blank
s = 0
ReDim Arr(1 To endR, 1 To endC)
For i = 1 To endR
  If Len(Arr01(i, 2)) > 0 Then
    s = s + 1
    For k = 1 To endC
      Arr(s, k) = Arr01(i, k)
    Next k
  End If
Next i
Erase Arr01()
s = 0
ReDim ArrKQ(1 To 65000, 1 To 2)
For i = 1 To UBound(Arr) - 1
  For j = i + 1 To UBound(Arr)
    For n = 3 To endC - 1 Step 2
      If Len(Arr(i, n)) = 0 Then
        If Len(Arr(i, n + 1)) = 0 Then
          If Len(Arr(j, n)) = 0 Then
            If Len(Arr(j, n + 1)) = 0 Then
        GoTo exit_forJ
      End If: End If: End If: End If
    Next n
    s = s + 1
    ArrKQ(s, 1) = i - 1
    ArrKQ(s, 2) = j - 1
exit_forJ:
  Next j
Next i
If s = 0 Then
  MsgBox "Khong co du lieu OK"
  GoTo escape
End If
ReDim myArr(1 To s * 3, 1 To endC)
n = 1
For i = 1 To s
  myArr(n, 1) = ArrKQ(i, 1)
  myArr(n + 1, 1) = ArrKQ(i, 2)
  myArr(n + 2, 1) = ""
  For k = 1 To endC
    myArr(n, k + 1) = Arr(myArr(n, 1) + 1, k)
    myArr(n + 1, k + 1) = Arr(myArr(n + 1, 1) + 1, k)
    myArr(n + 2, k + 1) = ""
  Next k
  n = n + 3
Next i
With Sheet3
  .Cells.ClearContents
  .Range("A1").Resize(n - 1, endC) = myArr
End With
escape:
Erase Arr(), ArrKQ(), myArr()
MsgBox Timer - Timer_
End Sub
 
Lần chỉnh sửa cuối:
Sorry, code trước thiếu vòng lặp for n. Mới có

Phải là

Còn nếu theo yêu cầu nữa thì xét cái Arr01 trước nếu cột B="" thì tạo ra Arr02 và xét theo Arr02 này.
Có phải điều kiện là
1/ Cột B có dữ liệu thì thoát. Chỉ xét cột B rỗng.
Hay là
2/ Các nhóm (C;D), (E;F),...,(IU;IV) nếu có dữ liệu trong tất cả các nhóm này thì mới chép, còn nếu có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua
Chạy thử code hình như không thấy hàng nào có. Và lưu ý có khả năng ArrKQ có số dòng > 65000 vì có thể thoả hết => số dòng quá lớn.
PHP:
Option Explicit
Const endC As Long = 256
Dim endR As Long, i As Long, j As Long, n As Long, s As Long, k As Long
Dim Arr01(), Arr(), ArrKQ(), myArr()
Dim Timer_ As Double
Sub LocTwoRows2()
Timer_ = Timer
With Sheet1
endR = .Cells(65000, 1).End(xlUp).Row
Arr01 = .Range(.Cells(1, 1), .Cells(endR, endC))
End With
'tim arr co cot B <> blank
s = 0
ReDim Arr(1 To endR, 1 To endC)
For i = 1 To endR
If Len(Arr01(i, 2)) > 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
Erase Arr01()
s = 0
ReDim ArrKQ(1 To 65000, 1 To 2)
For i = 1 To UBound(Arr) - 1
For j = i + 1 To UBound(Arr)
For n = 3 To endC - 1 Step 2
If Len(Arr(i, n)) = 0 Then
If Len(Arr(i, n + 1)) = 0 Then
If Len(Arr(j, n)) = 0 Then
If Len(Arr(j, n + 1)) = 0 Then
GoTo exit_forJ
End If: End If: End If: End If
Next n
s = s + 1
ArrKQ(s, 1) = i - 1
ArrKQ(s, 2) = j - 1
exit_forJ:
Next j
Next i
If s = 0 Then
MsgBox "Khong co du lieu OK"
GoTo escape
End If
ReDim myArr(1 To s * 3, 1 To endC)
n = 1
For i = 1 To s
myArr(n, 1) = ArrKQ(i, 1)
myArr(n + 1, 1) = ArrKQ(i, 2)
myArr(n + 2, 1) = ""
For k = 1 To endC
myArr(n, k + 1) = Arr(myArr(n, 1) + 1, k)
myArr(n + 1, k + 1) = Arr(myArr(n + 1, 1) + 1, k)
myArr(n + 2, k + 1) = ""
Next k
n = n + 3
Next i
With Sheet3
.Cells.ClearContents
.Range("A1").Resize(n - 1, endC) = myArr
End With
escape:
Erase Arr(), ArrKQ(), myArr()
MsgBox Timer - Timer_
End Sub
Vâng! Mình không biết nói gì hơn ngoài lời chân thành cảm ơn bạn!
Mình xin nói lại Điều kiện là khi ghép cặp thoả mãn: cột B không có dữ liệu và trong tất cả các nhóm gồm 2 cột liên tiếp (C;D), (E;F),...,(IU;IV) phải đều có dữ liệu thì mới chép. Còn nếu cột B có dữ liệu hoặc có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua!
Xin cảm ơn bạn rất nhiều lần!
 
Vâng! Mình không biết nói gì hơn ngoài lời chân thành cảm ơn bạn!
Mình xin nói lại Điều kiện là khi ghép cặp thoả mãn: cột B không có dữ liệu và trong tất cả các nhóm gồm 2 cột liên tiếp (C;D), (E;F),...,(IU;IV) phải đều có dữ liệu thì mới chép. Còn nếu cột B có dữ liệu hoặc có 1 nhóm bất kì nào đó không có dữ liệu thì bỏ qua!
Xin cảm ơn bạn rất nhiều lần!
Nhầm 1 chút "cột B không có dữ liệu" bạn sửa code trên 1 chút
PHP:
For i = 1 To endR
If Len(Arr01(i, 2)) > 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
thành
For i = 1 To endR
If Len(Arr01(i, 2)) = 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
Nhưng hình như cũng có có cặp nào OK.
 
Nhầm 1 chút "cột B không có dữ liệu" bạn sửa code trên 1 chút
PHP:
For i = 1 To endR
If Len(Arr01(i, 2)) > 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
thành

Nhưng hình như cũng có có cặp nào OK.
Cảm ơn bạn rất nhiều! Mình đã cho chạy thử nhưng chương trình hình như có lỗi bạn àh! mình thấy báo lỗi:
Option Explicit
Const endC As Long = 256
Dim endR As Long, i As Long, j As Long, n As Long, s As Long, k As Long
Dim Arr01(), Arr(), ArrKQ(), myArr()
Dim Timer_ As Double
Sub LocTwoRows2()
Timer_ = Timer
With Sheet1
endR = .Cells(65000, 1).End(xlUp).Row
Arr01 = .Range(.Cells(1, 1), .Cells(endR, endC))
End With
tim arr co cot B <> blank
s = 0
ReDim Arr(1 To endR, 1 To endC)
For i = 1 To endR
If Len(Arr01(i, 2)) = 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
Erase Arr01()
s = 0
ReDim ArrKQ(1 To 65000, 1 To 2)
For i = 1 To UBound(Arr) - 1
For j = i + 1 To UBound(Arr)
For n = 3 To endC - 1 Step 2
If Len(Arr(i, n)) = 0 Then
If Len(Arr(i, n + 1)) = 0 Then
If Len(Arr(j, n)) = 0 Then
If Len(Arr(j, n + 1)) = 0 Then
GoTo exit_forJ
End If: End If: End If: End If
Next n
s = s + 1
ArrKQ(s, 1) = i - 1
ArrKQ(s, 2) = j - 1
exit_forJ:
Next j
Next i
If s = 0 Then
MsgBox "Khong co du lieu OK"
GoTo escape
End If
ReDim myArr(1 To s * 3, 1 To endC)
n = 1
For i = 1 To s
myArr(n, 1) = ArrKQ(i, 1)
myArr(n + 1, 1) = ArrKQ(i, 2)
myArr(n + 2, 1) = ""
For k = 1 To endC
myArr(n, k + 1) = Arr(myArr(n, 1) + 1, k)
myArr(n + 1, k + 1) = Arr(myArr(n + 1, 1) + 1, k)
myArr(n + 2, k + 1) = ""
Next k
n = n + 3
Next i
With Sheet3
.Cells.ClearContents
.Range("A1").Resize(n - 1, endC) = myArr
End With
escape:
Erase Arr(), ArrKQ(), myArr()
MsgBox Timer - Timer_
End Sub
 
xóa bỏ câu đỏ đỏ đó đi, đó là 1 câu ghi chú, không phải code.
 
SPAM 1 cài, khì, khì,. . .

Ta có thể xoá bằng các cách sau:

(1) Dùng chuột bôi chọn toàn bộ câu lệnh & bấm fím 'Delete'; Cách này tuy tiện nhưng không fải hay nhất;

(2) Chỉ cần bấm thêm dấu nháy đơn lên đầu dòng lệnh ("'"); Nếu có nhã í làm đẹp cả sau này, cuối dong ta cũng nhập thêm 1 nháy đơn cho có trước có sau, nghĩa tình;

(2) Thay vì dấu nháy đơn như trên, ta dài dòng 1 chút: nhập chữ 'rem' đầu dòng; Nếu sau đó bấm chuột ở hàng khác, cái từ ta nhập nó chuyển thành 'Rem' là nó đồng í ở với ta rồi!

Chúc mọi người vui vẻ cuới tuần vô cùng thoải mái!
 
Ta có thể xoá bằng các cách sau:

(1) Dùng chuột bôi chọn toàn bộ câu lệnh & bấm fím 'Delete'; Cách này tuy tiện nhưng không fải hay nhất;

(2) Chỉ cần bấm thêm dấu nháy đơn lên đầu dòng lệnh ("'"); Nếu có nhã í làm đẹp cả sau này, cuối dong ta cũng nhập thêm 1 nháy đơn cho có trước có sau, nghĩa tình;

(2) Thay vì dấu nháy đơn như trên, ta dài dòng 1 chút: nhập chữ 'rem' đầu dòng; Nếu sau đó bấm chuột ở hàng khác, cái từ ta nhập nó chuyển thành 'Rem' là nó đồng í ở với ta rồi!

Chúc mọi người vui vẻ cuới tuần vô cùng thoải mái!
Vâng! Mình đã làm theo hướng dẫn và "rem" đã trở thành "Rem"! Nhưng sau đó vẫn thông báo lỗi: Run-tỉme error '9':
Option Explicit
Const endC As Long = 256
Dim endR As Long, i As Long, j As Long, n As Long, s As Long, k As Long
Dim Arr01(), Arr(), ArrKQ(), myArr()
Dim Timer_ As Double
Sub LocTwoRows2()
Timer_ = Timer
With Sheet1
endR = .Cells(65000, 1).End(xlUp).Row
Arr01 = .Range(.Cells(1, 1), .Cells(endR, endC))
End With
Rem tim arr co cot B <> blank
s = 0
ReDim Arr(1 To endR, 1 To endC)
For i = 1 To endR
If Len(Arr01(i, 2)) > 0 Then
s = s + 1
For k = 1 To endC
Arr(s, k) = Arr01(i, k)
Next k
End If
Next i
Erase Arr01()
s = 0
ReDim ArrKQ(1 To 65000, 1 To 2)
For i = 1 To UBound(Arr) - 1
For j = i + 1 To UBound(Arr)
For n = 3 To endC - 1 Step 2
If Len(Arr(i, n)) = 0 Then
If Len(Arr(i, n + 1)) = 0 Then
If Len(Arr(j, n)) = 0 Then
If Len(Arr(j, n + 1)) = 0 Then
GoTo exit_forJ
End If: End If: End If: End If
Next n
s = s + 1
ArrKQ(s, 1) = i - 1
ArrKQ(s, 2) = j - 1
exit_forJ:
Next j
Next i
If s = 0 Then
MsgBox "Khong co du lieu OK"
GoTo escape
End If
ReDim myArr(1 To s * 3, 1 To endC)
n = 1
For i = 1 To s
myArr(n, 1) = ArrKQ(i, 1)
myArr(n + 1, 1) = ArrKQ(i, 2)
myArr(n + 2, 1) = ""
For k = 1 To endC
myArr(n, k + 1) = Arr(myArr(n, 1) + 1, k)
myArr(n + 1, k + 1) = Arr(myArr(n + 1, 1) + 1, k)
myArr(n + 2, k + 1) = ""
Next k
n = n + 3
Next i
With Sheet3
.Cells.ClearContents
.Range("A1").Resize(n - 1, endC) = myArr
End With
escape:
Erase Arr(), ArrKQ(), myArr()
MsgBox Timer - Timer_
End Sub

Chúc GPE cuối tuần vui vẻ!
 
Web KT
Back
Top Bottom