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.