sep_hatxel
Thành viên thường trực




- Tham gia
- 24/5/10
- Bài viết
- 217
- Được thích
- 7
Làm phần 1 trước, do chưa hiểu yêu cầu.Mình cần kiểm tra và tìm kết quả với dữ liệu tương đối lớn nên cần phải dùng excel2007! Nhờ GPE xem và kiểm tra giúp! Xin chân thành cảm ơn! Chúc GPE luôn thắng lợi!
Chỉ xét B4:B5 với các ô C tô màu thôi hay xét với D, E, F, G tô màu.Làm phần 1 trước, do chưa hiểu yêu cầu.
1/ Các ô tô màu có quy luật gì không, thứ tự ...
2/ [QUOTE][FONT="]Mình lấy một ví dụ minh hoạ: số liệu ở[/FONT][FONT="] cột B:[/FONT][FONT="] vị trí [/FONT][FONT="]B[/FONT][FONT="]4[/FONT][FONT="]B[/FONT][FONT="]5 (dòng 4 ghép với dòng 5) là 1-2 muốn kiểm tra xem 1-2 có xuất hiện ở vị trí [/FONT][FONT="]C[/FONT][FONT="]7[/FONT][FONT="]C[/FONT][FONT="]8, [/FONT][FONT="]C[/FONT][FONT="]12[/FONT][FONT="]C[/FONT][FONT="]13, [/FONT][FONT="]C[/FONT][FONT="]17[/FONT][FONT="]C[/FONT][FONT="]18, [/FONT][FONT="]C[/FONT][FONT="]22[/FONT][FONT="]C[/FONT][FONT="]23,...,[/FONT][FONT="]C[/FONT][FONT="]101[/FONT][FONT="]C[/FONT][FONT="]102, [/FONT][FONT="]C[/FONT][FONT="]103[/FONT][FONT="]C[/FONT][FONT="]104,[/FONT][FONT="]C[/FONT][FONT="]105[/FONT][FONT="]C[/FONT][FONT="]106, [/FONT][FONT="]C[/FONT][FONT="]107[/FONT][FONT="]C[/FONT][FONT="]108, [/FONT][FONT="]C[/FONT][FONT="]109[/FONT][FONT="]C[/FONT][FONT="]110 (Tất cả chỉ xét ở 27 vị trí được tô màu) hay không? Theo bảng số liệu trên thì 1-2 xuất hiện ở 3 vị trí [/FONT][FONT="]C[/FONT][FONT="]7[/FONT][FONT="]C[/FONT][FONT="]8, [/FONT][FONT="]C[/FONT][FONT="]12[/FONT][FONT="]C[/FONT][FONT="]13 và [/FONT][FONT="]C[/FONT][FONT="]47[/FONT][FONT="]C[/FONT][FONT="]48 (xuất hiện theo kiểu 1-2 và 2-1 đều thoả mãn) thì kết quả[/FONT][FONT="] sẽ xuất sang[/FONT][FONT="] sheet2 [/FONT][FONT="]số lần [/FONT][FONT="]sự xuất hiện là 3 ở ô[/FONT][FONT="]B4 (kết quả[/FONT][FONT="] bắt [/FONT][FONT="]đầu[/FONT][FONT="]từ cột B, cột A để trống). Nếu không xuất hiện thì[/FONT][FONT="] kết quả ở sheet2 [/FONT][FONT="]để trống. [/FONT]
Phần 1 phần 2 đã tính tiếp sau. Nếu đếm B4:B5 trong các cặp ô tô màu B4:B5 thì kq gán vào B4 sh2, nếu B4:B6 kq là 5 thì gán vào B?, tương tự B5:B6 thì kq gán vào đâu.Vâng cảm ơn bạn nhiều quá! Mình xin nói rõ hơn:
1. Các ô tô màu là cố định không có quy luật (gồm 27 vị trí quy định như trong file)
2. Xét B4:B5 với các vị trí của ô C tô màu, xét xong lại tiếp tục xét B4:B6,.v.v.B4:B1203 với các vị trí của ô C tô màu,.v.v. Cứ như vậy xét lần lượt B5:B6, B5:B7,..., B6:B7,B6:B8,.v.v.. cho đến B1202:B1203 (Tổng có 719400 lần xét).
Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long
Dim i As Long, j As Long, k As Long, m As Long, t As Long, s As Long, n As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2()
Dim sCapSo1 As String, sCapSo2 As String
Sub DemCapSo()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5)
iR = 1: s = 0
Do While iR < MyRng.Rows.Count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To 5
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
n = 1: sodong = s
For k = 1 To 2 'k =5
ReDim ArrKQ1(1 To 1000000, 1 To 1)
ReDim ArrKQ2(1 To 1000000, 1 To 1)
s = 0: t = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...'
dem1 = 0: dem2 = 0
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then
dem1 = dem1 + 1
End If
If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then
dem2 = dem2 + 1
End If
Next m
If dem1 > 0 Then
s = s + 1
ArrKQ1(s, 1) = dem1
End If
If dem2 > 0 Then
t = t + 1
ArrKQ2(t, 1) = dem2
End If
Next j
Next i
'gan vao
With Sheets(n + 1)
If t > 0 Then
.Range("B4").Resize(t, 1) = ArrKQ2
End If
End With
With Sheets(n + 2)
If s > 0 Then
.Range("B4").Resize(s, 1) = ArrKQ1
End If
End With
n = n + 2
Erase ArrKQ1, ArrKQ2
Next k
Erase ArrCapSo, Arr
Set MyRng = Nothing
End Sub
Vâng! Cảm ơn bạn!Phần 1 phần 2 đã tính tiếp sau. Nếu đếm B4:B5 trong các cặp ô tô màu B4:B5 thì kq gán vào B4 sh2, nếu B4:B6 kq là 5 thì gán vào B?, tương tự B5:B6 thì kq gán vào đâu.
Function fl(ByVal l As Integer) As Integer
Dim TG, Vi_tri_dau As Integer
Vi_tri_dau = 3
If l <= 10 Then
TG = l * 3 + (l - 1) * 2 + Vi_tri_dau + 1
Else
If l <= 20 Then
TG = (l - 10) * 2 + (l - 10 - 1) * 2 + 10 * 3 + 10 * 2 + Vi_tri_dau + 1
Else
If l <= 23 Then
TG = (l - 20) * 1 + (l - 20 - 1) * 2 + 10 * 2 + 10 * 2 + 10 * 3 + 10 * 2 + Vi_tri_dau + 1
Else
TG = (l - 24) * 2 + 3 * 1 + 3 * 2 + 10 * 2 + 10 * 2 + 10 * 3 + 10 * 2 + Vi_tri_dau + 1
End If
End If
End If
fl = TG
End Function
Sub ThucHien()
Dim ij, i, j, count, k, l, h, Ai, Aj, Bi, Bj As Integer
Dim Ma(1203, 1000) As Integer
On Error GoTo err:
For i = 4 To 1203
For j = 1 To 1000
Ma(i, j) = Sheet1.Cells(i, j)
Next
Next
For k = 1 To 999
ij = 4
For i = 4 To 1202
For j = i + 1 To 1203
count = 0
ij = ij + 1
'Ai = Sheet1.Cells(i, k)
'Aj = Sheet1.Cells(j, k)
Ai = Ma(i, k)
Aj = Ma(j, k)
For l = 1 To 27
h = fl(l)
'Bi = Sheet1.Cells(h, k + 1)
'Bj = Sheet1.Cells(h + 1, k + 1)
Bi = Ma(h, k + 1)
Bj = Ma(h + 1, k + 1)
If ((Ai = Bi) And (Aj = Bj)) Or ((Ai = Bj) And (Aj = Bi)) Then count = count + 1
Next
If count > 0 Then
Sheet2.Cells(ij, k + 1) = count
Else
Sheet2.Cells(ij, k + 1) = ""
End If
Next
Next
Next
Exit Sub
err:
MsgBox ij
End Sub
Vấn đề là bạn xem code trên có ra kq có đúng không.Vâng! Cảm ơn bạn!
Mình xét lần lượt từ B4:B5, B4:B6,..., B4:B1203, B5:B6, B5:B7,..., B5:B1203,..., B1202:B1203 trong các cặp tô màu ở cột C và kết quả sẽ gán lần lượt từ trên xuống dưới bắt đầu từ B4, B5, ..., B719403 trong các sheet kết quả! Sau đó lại xét đến cột C so với các vị trí tô màu cột D và kết quả cũng gán lần lượt từ trên xuống dưới bắt đầu từ C4,..., C719403 trong các sheet kết quả.v.v...
Function fl(ByVal l As Integer) As Integer
Phần 1 phần 2 đã tính tiếp sau. Nếu đếm B4:B5 trong các cặp ô tô màu B4:B5 thì kq gán vào B4 sh2, nếu B4:B6 kq là 5 thì gán vào B?, tương tự B5:B6 thì kq gán vào đâu.
Vậy thì có đếm được thì gán tuần tự vậy.
For k = 1 To 2 'k =5PHP:Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long Dim i As Long, j As Long, k As Long, m As Long, t As Long, s As Long, n As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2() Dim sCapSo1 As String, sCapSo2 As String Sub DemCapSo() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row Set MyRng = .Range("B" & fR & ":H" & endR) Arr = MyRng End With ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5) iR = 1: s = 0 Do While iR < MyRng.Rows.Count + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then s = s + 1 For k = 1 To 5 ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1)) Next k iR = iR + 2 Else iR = iR + 1 End If Loop n = 1: sodong = s For k = 1 To 2 'k =5 ReDim ArrKQ1(1 To 1000000, 1 To 1) ReDim ArrKQ2(1 To 1000000, 1 To 1) s = 0: t = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k)) sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k)) 'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...' dem1 = 0: dem2 = 0 For m = 1 To sodong 'so dong cua arrcapso' If ArrCapSo(m, k) = sCapSo1 Then dem1 = dem1 + 1 End If If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then dem2 = dem2 + 1 End If Next m If dem1 > 0 Then s = s + 1 ArrKQ1(s, 1) = dem1 End If If dem2 > 0 Then t = t + 1 ArrKQ2(t, 1) = dem2 End If Next j Next i 'gan vao With Sheets(n + 1) If t > 0 Then .Range("B4").Resize(t, 1) = ArrKQ2 End If End With With Sheets(n + 2) If s > 0 Then .Range("B4").Resize(s, 1) = ArrKQ1 End If End With n = n + 2 Erase ArrKQ1, ArrKQ2 Next k Erase ArrCapSo, Arr Set MyRng = Nothing End Sub
Do mơi cho chạy k- >2
ie n=1
- Xét B với C => Sheet2, sheet3 - Sheets(n + 1)
- Xét C với D => Sheet4, sheẹt - Sheets(n + 2)
Bạn triển khai tiếp nếu OK.
Ex 2007 chỉ có 1.048.576 dòng mà nếu lấy hết theo B4:B5, ... B4:B1203. => 1200 x 1199 = 1.438.800 dòngVâng! Bạn àh, mình đã xem phương án bạn đưa ra! nhưng kết quả ở các sheet thiếu mất trường hợp không có sự xuất hiện? (nếu không xuất hiện thì để ô trống).
- ở đây chỉ cần có 4 sheet: sheet1 là số liệu; sheet2, sheet3, sheet4 là kết quả theo điều kiện.
- xét B với C ở sheet1: nếu xuất hiện hay không xuất hiện(không xuất hiện thì kết quả để trống) đều lần lượt được gán kết quả đếm được vào cột B (từ B4 trở xuống) ở sheet2 (kết quả đếm sự xuất hiện theo cả 2 trường hợp thuận và ngược); gán vào cột B (từ B4)ở sheet3 (kết quả đếm sự xuất hiện chỉ theo trường hợp thuận); gán vào cột B(từ B4) ở sheet4 (kết quả đếm sự xuất hiện chỉ theo trường hợp ngược).
- xét C với D ở sheet1: tương tự sẽ gán kết quả theo điều kiện vào sheet2, sheet3, sheet4 vào cột C (bắt đầu từ C4).
- Xét D với E: gán vào cột D ở các sheet kết quả.
-.v.v...
Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long
Dim i As Long, j As Long, k As Long, m As Long, t As Long, s As Long, n As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2()
Dim sCapSo1 As String, sCapSo2 As String
Sub DemCapSo2()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.count, 1 To 5)
iR = 1: s = 0
Do While iR < MyRng.Rows.count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To 5
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
n = 1: sodong = s
For k = 1 To 1 'k =5
ReDim ArrKQ1(1 To 1048576, 1 To 1)
ReDim ArrKQ2(1 To 1048576, 1 To 1)
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = (j - 1) + (i - 1) * UBound(Arr, 1)
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...'
dem1 = 0: dem2 = 0
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then
dem1 = dem1 + 1
End If
If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then
dem2 = dem2 + 1
End If
Next m
If s = 1048576 - 4 Then GoTo Exit_Sub
If dem1 = 0 Then
ArrKQ1(s, 1) = ""
Else
ArrKQ1(s, 1) = dem1
End If
If dem2 = 0 Then
ArrKQ2(s, 1) = ""
Else
ArrKQ2(s, 1) = dem2
End If
Next j
'MsgBox s
Next i
'gan vao
Exit_Sub:
If s > 0 Then
With Sheets(n + 1)
.Range("B4").Resize(s, 1) = ArrKQ2
End With
With Sheets(n + 2)
.Range("B4").Resize(s, 1) = ArrKQ1
End With
End If
n = n + 2
Erase ArrKQ1, ArrKQ2
Next k
Erase ArrCapSo, Arr
Set MyRng = Nothing
End Sub
Hì! Bạn àh! chỉ có: 1199+1198+...+2+1= (1200x1199):2= 719400 dòng thôi!Ex 2007 chỉ có 1.048.576 dòng mà nếu lấy hết theo B4:B5, ... B4:B1203. => 1200 x 1199 = 1.438.800 dòng
Vậy chỗ nào mà gán.
Code này chỉ so sánh B với C và chỉ gán đến 1.048.576 dòng thôi.
Hiểu rồi sửa code 1 chút về gán theo dòng s.Hì! Bạn àh! chỉ có: 1199+1198+...+2+1= (1200x1199):2= 719400 dòng thôi!
- Mình đã dùng code bạn đưa ra, nhưng sao lạ thật đúng là hơn 1triệu kết quả liền? Mình đang bị mâu thuẫn? Bạn xem và kiểm tra giúp với nhé!
- Sheet 2 và sheet3 đã có kết quả, còn sheet4 thì chưa có bạn àh?
- Nhưng tốc độ của code thì tuyệt vời! Thích quá! Rất nhanh!
- Cảm ơn bạn rất nhiều!
Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long
Dim i As Long, j As Long, k As Long, m As Long, t As Long, s As Long, n As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2()
Dim sCapSo1 As String, sCapSo2 As String
Sub DemCapSo2()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.count, 1 To 5)
iR = 1: s = 0
Do While iR < MyRng.Rows.count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To 5
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
n = 1: sodong = s
For k = 1 To 1 'k =5'
ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1)
s = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = s + 1
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...'
dem1 = 0: dem2 = 0
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then
dem1 = dem1 + 1
End If
If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then
dem2 = dem2 + 1
End If
Next m
If dem1 = 0 Then
ArrKQ1(s, 1) = ""
Else
ArrKQ1(s, 1) = dem1
End If
If dem2 = 0 Then
ArrKQ2(s, 1) = ""
Else
ArrKQ2(s, 1) = dem2
End If
Next j
Next i
'gan vao'
With Sheets(n + 1)
.Range("B4").Resize(s, 1) = ArrKQ2
End With
With Sheets(n + 2)
.Range("B4").Resize(s, 1) = ArrKQ1
End With
n = n + 2
Erase ArrKQ1, ArrKQ2
Next k
Erase ArrCapSo, Arr
Set MyRng = Nothing
End Sub
Hiểu rồi sửa code 1 chút về gán theo dòng s.
Mới làm sh2 và 3 thôi.
Sửa code này nhé.
PHP:Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long Dim i As Long, j As Long, k As Long, m As Long, t As Long, s As Long, n As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2() Dim sCapSo1 As String, sCapSo2 As String Sub DemCapSo2() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row Set MyRng = .Range("B" & fR & ":H" & endR) Arr = MyRng End With ReDim ArrCapSo(1 To MyRng.Rows.count, 1 To 5) iR = 1: s = 0 Do While iR < MyRng.Rows.count + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then s = s + 1 For k = 1 To 5 ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1)) Next k iR = iR + 2 Else iR = iR + 1 End If Loop n = 1: sodong = s For k = 1 To 1 'k =5' ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1) ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1) s = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) s = s + 1 sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k)) sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k)) 'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...' dem1 = 0: dem2 = 0 For m = 1 To sodong 'so dong cua arrcapso' If ArrCapSo(m, k) = sCapSo1 Then dem1 = dem1 + 1 End If If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then dem2 = dem2 + 1 End If Next m If dem1 = 0 Then ArrKQ1(s, 1) = "" Else ArrKQ1(s, 1) = dem1 End If If dem2 = 0 Then ArrKQ2(s, 1) = "" Else ArrKQ2(s, 1) = dem2 End If Next j Next i 'gan vao' With Sheets(n + 1) .Range("B4").Resize(s, 1) = ArrKQ2 End With With Sheets(n + 2) .Range("B4").Resize(s, 1) = ArrKQ1 End With n = n + 2 Erase ArrKQ1, ArrKQ2 Next k Erase ArrCapSo, Arr Set MyRng = Nothing End Sub
Option Explicit
Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long, dem3 As Long
Dim i As Long, j As Long, k As Long, m As Long, s As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3()
Dim sCapSo1 As String, sCapSo2 As String
Sub TaoCapSo()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5)
iR = 1: s = 0
Do While iR < MyRng.Rows.Count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To 5
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
Set MyRng = Nothing
End Sub
Sub DemCapSo1()
Dim T
T = Timer
TaoCapSo
sodong = s
ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
For k = 1 To 5
s = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = s + 1
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...'
dem1 = 0: dem2 = 0: dem3 = 0
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then
dem1 = dem1 + 1
End If
If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then
dem2 = dem2 + 1
End If
dem3 = dem2 - dem1
Next m
If dem1 = 0 Then 'AB'
ArrKQ1(s, k) = ""
Else
ArrKQ1(s, k) = dem1
End If
If dem2 = 0 Then 'AB or BA'
ArrKQ2(s, k) = ""
Else
ArrKQ2(s, k) = dem2
End If
If dem3 = 0 Then 'BA'
ArrKQ3(s, k) = ""
Else
ArrKQ3(s, k) = dem3
End If
Next j
Next i
Next k
'gan vao'
With Sheets(2)
.Range("B4").Resize(s, k - 1) = ArrKQ2
End With
With Sheets(3)
.Range("B4").Resize(s, k - 1) = ArrKQ1
End With
With Sheets(4)
.Range("B4").Resize(s, k - 1) = ArrKQ3
End With
Erase ArrKQ1, ArrKQ2, ArrKQ3
Erase ArrCapSo, Arr
MsgBox Timer - T
End Sub
Cảm ơn bạn nhiều quá, mình không biết nói gì hơn!Bạn dùng code sau tính toán 5 cột và tạo KQ ở 3 sh: AB-BA, AB, BA.
Hơi chậm nhé > 1 phút.
PHP:Option Explicit Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long, dem3 As Long Dim i As Long, j As Long, k As Long, m As Long, s As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3() Dim sCapSo1 As String, sCapSo2 As String Sub TaoCapSo() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row Set MyRng = .Range("B" & fR & ":H" & endR) Arr = MyRng End With ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5) iR = 1: s = 0 Do While iR < MyRng.Rows.Count + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then s = s + 1 For k = 1 To 5 ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1)) Next k iR = iR + 2 Else iR = iR + 1 End If Loop Set MyRng = Nothing End Sub Sub DemCapSo1() Dim T T = Timer TaoCapSo sodong = s ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5) ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5) ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5) For k = 1 To 5 s = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) s = s + 1 sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k)) sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k)) 'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...' dem1 = 0: dem2 = 0: dem3 = 0 For m = 1 To sodong 'so dong cua arrcapso' If ArrCapSo(m, k) = sCapSo1 Then dem1 = dem1 + 1 End If If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then dem2 = dem2 + 1 End If dem3 = dem2 - dem1 Next m If dem1 = 0 Then 'AB' ArrKQ1(s, k) = "" Else ArrKQ1(s, k) = dem1 End If If dem2 = 0 Then 'AB or BA' ArrKQ2(s, k) = "" Else ArrKQ2(s, k) = dem2 End If If dem3 = 0 Then 'BA' ArrKQ3(s, k) = "" Else ArrKQ3(s, k) = dem3 End If Next j Next i Next k 'gan vao' With Sheets(2) .Range("B4").Resize(s, k - 1) = ArrKQ2 End With With Sheets(3) .Range("B4").Resize(s, k - 1) = ArrKQ1 End With With Sheets(4) .Range("B4").Resize(s, k - 1) = ArrKQ3 End With Erase ArrKQ1, ArrKQ2, ArrKQ3 Erase ArrCapSo, Arr MsgBox Timer - T End Sub
200 cột hay X cột thì sửa những chỗ sau:Cảm ơn bạn nhiều quá, mình không biết nói gì hơn!
Tốc độ như vậy là quá tuyệt rồi bạn àh!
- Nếu mình muốn tăng thêm tính toán cho khoảng 200 cột thì bạn chỉnh hộ mình thông số được không? (mình dự tính cho code chạy trong khoảng thời gian hơn 1h là đạt yêu cầu)
-Chân thành cảm ơn bạn!
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5)
Thay những số 5 trên. Nhưng nên làm từ từ 10, 20...100, 200.ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
For k = 1 To 5
Vâng! Mình đã thay như bạn hướng dẫn với trường hợp là 10 cột, nhưng thấy báo lỗi và sau đó mình cũng thử bổ xung cả trường hợp:200 cột hay X cột thì sửa những chỗ sau:
Thay những số 5 trên. Nhưng nên làm từ từ 10, 20...100, 200.
nhưng cũng thấy báo cùng một lối: run-time erro "9"ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 5)
For k = 1 To 5
ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 5)
For k = 1 To 5
- Mong phản hồi của bạn! Thân! Chúc buổi tối vui vẻ!Option Explicit
Dim endR As Long, iR As Long, fR As Long, sodong As Long, dem1 As Long, dem2 As Long, dem3 As Long
Dim i As Long, j As Long, k As Long, m As Long, s As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3()
Dim sCapSo1 As String, sCapSo2 As String
Sub TaoCapSo()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 10)
iR = 1: s = 0
Do While iR < MyRng.Rows.Count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To 5
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
Set MyRng = Nothing
End Sub
Sub DemCapSo1()
Dim T
T = Timer
TaoCapSo
sodong = s
ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 10)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 10)
ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 10)
For k = 1 To 10
s = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = s + 1
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
'Luc nay moi xet dem theo ArrCapSo, chua xet cac cot C...'
dem1 = 0: dem2 = 0: dem3 = 0
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then
dem1 = dem1 + 1
End If
If ArrCapSo(m, k) = sCapSo1 Or ArrCapSo(m, k) = sCapSo2 Then
dem2 = dem2 + 1
End If
dem3 = dem2 - dem1
Next m
If dem1 = 0 Then 'AB'
ArrKQ1(s, k) = ""
Else
ArrKQ1(s, k) = dem1
End If
If dem2 = 0 Then 'AB or BA'
ArrKQ2(s, k) = ""
Else
ArrKQ2(s, k) = dem2
End If
If dem3 = 0 Then 'BA'
ArrKQ3(s, k) = ""
Else
ArrKQ3(s, k) = dem3
End If
Next j
Next i
Next k
'gan vao'
With Sheets(2)
.Range("B4").Resize(s, k - 1) = ArrKQ2
End With
With Sheets(3)
.Range("B4").Resize(s, k - 1) = ArrKQ1
End With
With Sheets(4)
.Range("B4").Resize(s, k - 1) = ArrKQ3
End With
Erase ArrKQ1, ArrKQ2, ArrKQ3
Erase ArrCapSo, Arr
MsgBox Timer - T
End Sub
Sorry, vì chưa test. Xem trong đoạn này thử.Set MyRng = .Range("B" & fR & ":H" & endR)
Arr = MyRng
End With
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To 10)
Hì! Mình hình như đã hiểu: không biết như thế này có đúng không? Nếu muốn tính toán cho 10 cột thì mình tiến thêm 2 cột nữa thay H thành M, 100 cột thì thay H thành CY,(và thay 5 thành các cột tương ứng) . . . Mình sẽ kiểm tra bằng cách cho chạy 5 cột rồi so với 10 cột có trùng kết quả cuối không?Sorry, vì chưa test. Xem trong đoạn này thử.
Nếu mà 200 cột thì nên sửa lại code 1 chút. Thay vì ArrKQ lấy hết 200 cột và gán xuống thì mình gán từng cột sau đó lấy tiếp ...Hì! Mình hình như đã hiểu: không biết như thế này có đúng không? Nếu muốn tính toán cho 10 cột thì mình tiến thêm 2 cột nữa thay H thành M, 100 cột thì thay H thành CY,(và thay 5 thành các cột tương ứng) . . . Mình sẽ kiểm tra bằng cách cho chạy 5 cột rồi so với 10 cột có trùng kết quả cuối không?
- Cảm ơn bạn rất nhiều! Bạn nhiệt tình quá! Một lần nữa xin cảm ơn bạn! Cảm ơn GPE! Ngày cũ qua đi Ngày mới tốt lành! Thân ái!
Nếu mà 200 cột thì nên sửa lại code 1 chút. Thay vì ArrKQ lấy hết 200 cột và gán xuống thì mình gán từng cột sau đó lấy tiếp ...
Vì với 5 cột thì gán 1 lần sẽ nhanh hơn. Còn 200 cột thì ArrKQ gồm 800.000 dòng và 200 cột sẽ nặng. Chưa biết có chạy nổi.
Và nếu số cặp xét > 27 thì cũng nên sửa lại code. Còn = 27 thì không sao.
Mình sẽ sửa code 1 chút.
Bạn thay code sau thử, kg có can đảm để test với 200 cột. Cố gắng sẽ tối ưu hơn mà giờ chưa nghĩ ra.Hì, may quá! Mình vừa đi làm về đọc tin này của bạn thật vui! Chúc một ngày mới may mắn!
Cảm ơn bạn nhiều! Số cặp chỉ cần xét = 27 thôi bạn àh! Mong tin của bạn!
Option Explicit
Dim endR As Long, endC As Long, iR As Long, fR As Long, sodong As Long
Dim i As Long, j As Long, k As Long, m As Long, s As Long, socot As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3()
Dim sCapSo1 As String, sCapSo2 As String
Sub TaoCapSo()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
endC = .Cells(fR, 1000).End(xlToLeft).Column
Set MyRng = .Range("B" & fR).Resize(endR - fR + 1, endC - 1)
Arr = MyRng
End With
socot = UBound(Arr, 2) - 1
ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To socot)
iR = 1: s = 0
Do While iR < MyRng.Rows.Count + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
s = s + 1
For k = 1 To socot
ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1))
Next k
iR = iR + 2
Else
iR = iR + 1
End If
Loop
Set MyRng = Nothing
End Sub
Sub DemCapSo()
With Application
.ScreenUpdating = False: .DisplayAlerts = False
End With
Dim T
T = Timer
TaoCapSo
sodong = s
For k = 1 To socot
ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1)
ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1)
ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1)
s = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = s + 1
sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k))
sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k))
For m = 1 To sodong 'so dong cua arrcapso'
If ArrCapSo(m, k) = sCapSo1 Then ArrKQ1(s, 1) = ArrKQ1(s, 1) + 1
If ArrCapSo(m, k) = sCapSo2 Then ArrKQ2(s, 1) = ArrKQ2(s, 1) + 1
Next m
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Next j
Next i
'gan vao'
With Sheets(2)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3
End With
With Sheets(3)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1
End With
With Sheets(4)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2
End With
Erase ArrKQ1, ArrKQ2, ArrKQ3
Next k
Erase ArrCapSo, Arr
With Application
.ScreenUpdating = True: .DisplayAlerts = True
End With
MsgBox Timer - T
End Sub
Cảm ơn bạn! Mình đã test thử nhưng kết quả chỉ cho đến hàng 5671 thôi, còn thiếu rất nhiều bạn àh! Nhưng ngược lại thì tốc độ nhanh như chớp!Bạn thay code sau thử, kg có can đảm để test với 200 cột. Cố gắng sẽ tối ưu hơn mà giờ chưa nghĩ ra.
PHP:Option Explicit Dim endR As Long, endC As Long, iR As Long, fR As Long, sodong As Long Dim i As Long, j As Long, k As Long, m As Long, s As Long, socot As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3() Dim sCapSo1 As String, sCapSo2 As String Sub TaoCapSo() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row endC = .Cells(fR, 1000).End(xlToLeft).Column Set MyRng = .Range("B" & fR).Resize(endR - fR + 1, endC - 1) Arr = MyRng End With socot = UBound(Arr, 2) - 1 ReDim ArrCapSo(1 To MyRng.Rows.Count, 1 To socot) iR = 1: s = 0 Do While iR < MyRng.Rows.Count + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then s = s + 1 For k = 1 To socot ArrCapSo(s, k) = CStr(MyRng(iR, k + 1) & "-" & MyRng(iR + 1, k + 1)) Next k iR = iR + 2 Else iR = iR + 1 End If Loop Set MyRng = Nothing End Sub Sub DemCapSo() With Application .ScreenUpdating = False: .DisplayAlerts = False End With Dim T T = Timer TaoCapSo sodong = s For k = 1 To socot ReDim ArrKQ1(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1) ReDim ArrKQ2(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1) ReDim ArrKQ3(1 To UBound(Arr, 1) * (UBound(Arr, 1) - 1), 1 To 1) s = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) s = s + 1 sCapSo1 = CStr(Arr(i, k) & "-" & Arr(j, k)) sCapSo2 = CStr(Arr(j, k) & "-" & Arr(i, k)) For m = 1 To sodong 'so dong cua arrcapso' If ArrCapSo(m, k) = sCapSo1 Then ArrKQ1(s, 1) = ArrKQ1(s, 1) + 1 If ArrCapSo(m, k) = sCapSo2 Then ArrKQ2(s, 1) = ArrKQ2(s, 1) + 1 Next m ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1) Next j Next i 'gan vao' With Sheets(2) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3 End With With Sheets(3) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1 End With With Sheets(4) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 End With Erase ArrKQ1, ArrKQ2, ArrKQ3 Next k Erase ArrCapSo, Arr With Application .ScreenUpdating = True: .DisplayAlerts = True End With MsgBox Timer - T End Sub
- Có thể nói rõ bạn đang test với bao nhiêu cột.- Ngày mới thành công
- Hôm qua mình test nhầm, thành thật xin lỗi bạn! Hôm nay thử lại thì kết quả lại báo lỗi:run time error "7"
- Hi vọng bạn sẽ xem giúp lại mình! Thân ái!
Bạn chạy thử code Sub DemCapSoNew() xem.If k Mod 10 = 0 Then ActiveWorkbook.Save
Code này chạy 10 cột hết 60s.Mấy ngày bị ốm nằm viện! May mắn quá bạn đã giúp mình! Cảm ơn bạn nhiều! Mình sẽ test xem thời gian chạy cho 200 cột là bao nhiêu?
Hì, mong rằng thời gian test đủ uống tách coffe! Cảm ơn GPE!
Option Explicit
Dim endR As Long, endC As Long, iR As Long, fR As Long, sodong As Long
Dim i As Long, j As Long, k As Long, s As Long, socot As Long, t As Long
Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3(), ArrTT(), ArrCS()
Dim sCapSo1 As String, sCapSo2 As String, sTmp As String
Dim Dic As Object
Sub LastRC()
fR = 4
With Sheet1
endR = .Cells(65000, 2).End(xlUp).Row
endC = .Cells(fR, 1000).End(xlToLeft).Column
End With
socot = endC - 1
sodong = endR - fR + 1
End Sub
Sub TaoArrTT()
LastRC
With Sheet1
Set MyRng = .Range("B" & fR).Resize(sodong, 1)
Arr = MyRng
End With
ReDim ArrTT(1 To UBound(Arr))
iR = 1: t = 0
Do While iR < UBound(Arr) + 1
If MyRng(iR, 1).Interior.Color <> 16777215 Then
t = t + 1
ArrTT(t) = iR
iR = iR + 2
Else
iR = iR + 1
End If
Loop
Set MyRng = Nothing
End Sub
Sub TaoArrCapSo()
With Sheet1
Set Dic = CreateObject("Scripting.Dictionary")
ArrCS = .Range("B" & fR).Offset(, k).Resize(sodong, 1)
Arr = .Range("B" & fR).Offset(, k - 1).Resize(sodong, 1)
ReDim ArrCapSo(1 To UBound(Arr), 1 To 2)
iR = 1: s = 0
For i = 1 To t 'UBound(ArrTT)'
sTmp = CStr(ArrCS(ArrTT(i), 1) & ArrCS(ArrTT(i) + 1, 1))
If Not Dic.Exists(sTmp) Then
s = s + 1
ArrCapSo(s, 1) = sTmp
Dic.Add sTmp, s
End If
ArrCapSo(Dic.Item(sTmp), 2) = ArrCapSo(Dic.Item(sTmp), 2) + 1
Next i
End With
End Sub
Sub DemCapSoNew01()
With Application
.ScreenUpdating = False: .DisplayAlerts = False
End With
Dim t
t = Timer
TaoArrTT
For k = 1 To socot - 1
TaoArrCapSo
ReDim ArrKQ1(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1)
ReDim ArrKQ2(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1)
ReDim ArrKQ3(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1)
s = 0
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
s = s + 1
sCapSo1 = CStr(Arr(i, 1) & Arr(j, 1))
sCapSo2 = CStr(Arr(j, 1) & Arr(i, 1))
If Dic.Exists(sCapSo1) Then ArrKQ1(s, 1) = ArrCapSo(Dic.Item(sCapSo1), 2)
If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Next j
Next i
'gan vao'
With Sheets(2)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3
End With
With Sheets(3)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1
End With
With Sheets(4)
.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2
End With
Erase ArrKQ1, ArrKQ2, ArrKQ3, ArrCapSo, Arr, ArrCS
Set Dic = Nothing
If k Mod 20 = 0 Then ActiveWorkbook.Save
Next k
With Application
.ScreenUpdating = True: .DisplayAlerts = True
End With
MsgBox Timer - t
End Sub
Code này chạy 10 cột hết 60s.
Sợ rằng 200 cột thì sẽ ốm lại.
Mượn máy cấu hình cao mà chỉ chạy đến 80 cột là treo. Không cho save luôn, báo out of memory.PHP:Option Explicit Dim endR As Long, endC As Long, iR As Long, fR As Long, sodong As Long Dim i As Long, j As Long, k As Long, s As Long, socot As Long, t As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3(), ArrTT(), ArrCS() Dim sCapSo1 As String, sCapSo2 As String, sTmp As String Dim Dic As Object Sub LastRC() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row endC = .Cells(fR, 1000).End(xlToLeft).Column End With socot = endC - 1 sodong = endR - fR + 1 End Sub Sub TaoArrTT() LastRC With Sheet1 Set MyRng = .Range("B" & fR).Resize(sodong, 1) Arr = MyRng End With ReDim ArrTT(1 To UBound(Arr)) iR = 1: t = 0 Do While iR < UBound(Arr) + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then t = t + 1 ArrTT(t) = iR iR = iR + 2 Else iR = iR + 1 End If Loop Set MyRng = Nothing End Sub Sub TaoArrCapSo() With Sheet1 Set Dic = CreateObject("Scripting.Dictionary") ArrCS = .Range("B" & fR).Offset(, k).Resize(sodong, 1) Arr = .Range("B" & fR).Offset(, k - 1).Resize(sodong, 1) ReDim ArrCapSo(1 To UBound(Arr), 1 To 2) iR = 1: s = 0 For i = 1 To t 'UBound(ArrTT)' sTmp = CStr(ArrCS(ArrTT(i), 1) & ArrCS(ArrTT(i) + 1, 1)) If Not Dic.Exists(sTmp) Then s = s + 1 ArrCapSo(s, 1) = sTmp Dic.Add sTmp, s End If ArrCapSo(Dic.Item(sTmp), 2) = ArrCapSo(Dic.Item(sTmp), 2) + 1 Next i End With End Sub Sub DemCapSoNew01() With Application .ScreenUpdating = False: .DisplayAlerts = False End With Dim t t = Timer TaoArrTT For k = 1 To socot - 1 TaoArrCapSo ReDim ArrKQ1(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) ReDim ArrKQ2(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) ReDim ArrKQ3(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) s = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) s = s + 1 sCapSo1 = CStr(Arr(i, 1) & Arr(j, 1)) sCapSo2 = CStr(Arr(j, 1) & Arr(i, 1)) If Dic.Exists(sCapSo1) Then ArrKQ1(s, 1) = ArrCapSo(Dic.Item(sCapSo1), 2) If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1) Next j Next i 'gan vao' With Sheets(2) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3 End With With Sheets(3) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1 End With With Sheets(4) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 End With Erase ArrKQ1, ArrKQ2, ArrKQ3, ArrCapSo, Arr, ArrCS Set Dic = Nothing If k Mod 20 = 0 Then ActiveWorkbook.Save Next k With Application .ScreenUpdating = True: .DisplayAlerts = True End With MsgBox Timer - t End Sub
Phương án chạy thành 3 lần.
1/ AB
2/ BA
3/ AB-BA = 1 + 2
Hay là mình chạy 1 lần 200 cộtLời bạn linh nghiệm thật! Chạy xong thì sốt virut gần đúng 1tuần! Cảm ơn bạn nhé! Nếu 80 cột mà treo máy thì mình đành thủ công một chút vậy, mỗi lần cho chạy 10cột vậy 200 cột thì mất khoảng 30 phút! Cảm ơn bạn!
If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
'If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
'ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
'With Sheets(3)
'.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1
'End With
'With Sheets(4)
'.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2
'End With
Option ExplicitHay là mình chạy 1 lần 200 cột
Lần 1: AB - chép sh3 sang file mới và xóa sh3
Lần 2: BA - chép sh4 sang file mới và xóa sh4
Lần 3: Để viết 1 code chạy riêng hay là mở 2 file trên và cộng lại.
Bạn có thể vô hiệu các dòng code tạo KQ1, KQ2, KQ3 và các dòng gán vào sh2, 3, 4 bằng cách thêm các dấu ' vào đầu dòng code.
Vd: Vô hiệu
ThànhPHP:If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
... và phần gánPHP:'If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) 'ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Bạn nào giúp hộ tối ưu code trên giúp hay là có máy mạnh test giúp mình code trên. Máy của mình chạy không nổi. Nhớ copy thành 200 cột.PHP:'With Sheets(3) '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1 'End With 'With Sheets(4) '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 'End With
Cám ơn.
Hay là mình chạy 1 lần 200 cột
Lần 1: AB - chép sh3 sang file mới và xóa sh3
Lần 2: BA - chép sh4 sang file mới và xóa sh4
Lần 3: Để viết 1 code chạy riêng hay là mở 2 file trên và cộng lại.
Bạn có thể vô hiệu các dòng code tạo KQ1, KQ2, KQ3 và các dòng gán vào sh2, 3, 4 bằng cách thêm các dấu ' vào đầu dòng code.
Vd: Vô hiệu
ThànhPHP:If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
... và phần gánPHP:'If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) 'ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Bạn nào giúp hộ tối ưu code trên giúp hay là có máy mạnh test giúp mình code trên. Máy của mình chạy không nổi. Nhớ copy thành 200 cột.PHP:'With Sheets(3) '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1 'End With 'With Sheets(4) '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 'End With
Cám ơn.
Sorry, mình sai 1 chútThành thật xin lỗi bác Thu Nghi, mình đã test thử code trên theo hướng dẫn của bác! Nhưng code chạy mà không có kết quả? Không biết Kết quả được thể hiện ở sheeet nao? Cảm ơn bác nhiều nhé! Chúc GPE luôn vững mạnh!
'Phần sh 3 không đánh dấu.PHP:'With Sheets(2) '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3 ''End With
Gán ArrKQ1 (AB) vào sh 3.PHP:'With Sheets(4) ' .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 ''End With
Bác ThuNghi ơi! Mấy hôm test code với 200 cột thì kết quả như sau: Với code ban đầu không vô hiệu phần gán (vẫn để kết quả ở sh2, sh3, sh4) thì mình chạy khoảng 9 tiếng mới được 79 cột (code vẫn chạy nhưng pause để kiểm tra thử vì sốt ruột quá (hì)), còn code có vô hiệu phần gán chỉ để kq1 (AB) ở sh3 như bác hướng dẫn thì khoảng 5 tiếng cũng không chờ được pause thì kết quả được 131 cột!Sorry, mình sai 1 chút
- ArrKQ1 gán vào Sh3.
- ArrKQ2 gán vào Sh4.
- ArrKQ3 gán vào Sh2.
Đoạn code gán trên vô hiệu sai phần gán phải là
'Phần sh 3 không đánh dấu.
Gán ArrKQ1 (AB) vào sh 3.
1/ Máy bạn chắc chậm quá rồi, phương án là làm lần 10 cột và copy sang file khác làm tiếp.Bác ThuNghi ơi! Mấy hôm test code với 200 cột thì kết quả như sau: Với code ban đầu không vô hiệu phần gán (vẫn để kết quả ở sh2, sh3, sh4) thì mình chạy khoảng 9 tiếng mới được 79 cột (code vẫn chạy nhưng pause để kiểm tra thử vì sốt ruột quá (hì)), còn code có vô hiệu phần gán chỉ để kq1 (AB) ở sh3 như bác hướng dẫn thì khoảng 5 tiếng cũng không chờ được pause thì kết quả được 131 cột!
- Mà bác ThuNghi àh, sao kết quả 3(AB-BA) với code ban đầu gán ở sh2 thì phần kết quả lẽ ra là ô trống thì lại là số 0?
- Cảm ơn bác đã nhiệt tình giúp đỡ!
1/ Máy bạn chắc chậm quá rồi, phương án là làm lần 10 cột và copy sang file khác làm tiếp.
2/ Bạn vào tools option phần hide zero.
3/ Chưa nghĩ ra cách gì chạy 200 cột cả.
1/ Máy bạn chắc chậm quá rồi, phương án là làm lần 10 cột và copy sang file khác làm tiếp.
2/ Bạn vào tools option phần hide zero.
3/ Chưa nghĩ ra cách gì chạy 200 cột cả.
- Bạn Thunghi và các bạn thân mến! Mong các bạn xem giúp hộ mình trường hợp sau:Code này chạy 10 cột hết 60s.
Sợ rằng 200 cột thì sẽ ốm lại.
PHP:Option Explicit Dim endR As Long, endC As Long, iR As Long, fR As Long, sodong As Long Dim i As Long, j As Long, k As Long, s As Long, socot As Long, t As Long Dim MyRng As Range, Arr(), ArrCapSo(), ArrKQ1(), ArrKQ2(), ArrKQ3(), ArrTT(), ArrCS() Dim sCapSo1 As String, sCapSo2 As String, sTmp As String Dim Dic As Object Sub LastRC() fR = 4 With Sheet1 endR = .Cells(65000, 2).End(xlUp).Row endC = .Cells(fR, 1000).End(xlToLeft).Column End With socot = endC - 1 sodong = endR - fR + 1 End Sub Sub TaoArrTT() LastRC With Sheet1 Set MyRng = .Range("B" & fR).Resize(sodong, 1) Arr = MyRng End With ReDim ArrTT(1 To UBound(Arr)) iR = 1: t = 0 Do While iR < UBound(Arr) + 1 If MyRng(iR, 1).Interior.Color <> 16777215 Then t = t + 1 ArrTT(t) = iR iR = iR + 2 Else iR = iR + 1 End If Loop Set MyRng = Nothing End Sub Sub TaoArrCapSo() With Sheet1 Set Dic = CreateObject("Scripting.Dictionary") ArrCS = .Range("B" & fR).Offset(, k).Resize(sodong, 1) Arr = .Range("B" & fR).Offset(, k - 1).Resize(sodong, 1) ReDim ArrCapSo(1 To UBound(Arr), 1 To 2) iR = 1: s = 0 For i = 1 To t 'UBound(ArrTT)' sTmp = CStr(ArrCS(ArrTT(i), 1) & ArrCS(ArrTT(i) + 1, 1)) If Not Dic.Exists(sTmp) Then s = s + 1 ArrCapSo(s, 1) = sTmp Dic.Add sTmp, s End If ArrCapSo(Dic.Item(sTmp), 2) = ArrCapSo(Dic.Item(sTmp), 2) + 1 Next i End With End Sub Sub DemCapSoNew01() With Application .ScreenUpdating = False: .DisplayAlerts = False End With Dim t t = Timer TaoArrTT For k = 1 To socot - 1 TaoArrCapSo ReDim ArrKQ1(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) ReDim ArrKQ2(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) ReDim ArrKQ3(1 To UBound(Arr) * (UBound(Arr) - 1), 1 To 1) s = 0 For i = 1 To UBound(Arr, 1) - 1 For j = i + 1 To UBound(Arr, 1) s = s + 1 sCapSo1 = CStr(Arr(i, 1) & Arr(j, 1)) sCapSo2 = CStr(Arr(j, 1) & Arr(i, 1)) If Dic.Exists(sCapSo1) Then ArrKQ1(s, 1) = ArrCapSo(Dic.Item(sCapSo1), 2) If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2) ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1) Next j Next i 'gan vao' With Sheets(2) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3 End With With Sheets(3) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ1 End With With Sheets(4) .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2 End With Erase ArrKQ1, ArrKQ2, ArrKQ3, ArrCapSo, Arr, ArrCS Set Dic = Nothing If k Mod 20 = 0 Then ActiveWorkbook.Save Next k With Application .ScreenUpdating = True: .DisplayAlerts = True End With MsgBox Timer - t End Sub