Tìm kết quả có điều kiện trong excel2007

Liên hệ QC
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!
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
 
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ả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!
- Cảm ơn bạn nhiều nhé! Bạn xem lại giúp mình với! Thân ái!
 
- 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!
 
- 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!
- Có thể nói rõ bạn đang test với bao nhiêu cột.
- Gởi hình báo lỗi xem thử.
Tôi test với 5 cột thì bình thường.
Test thử với 70 cột hết 20 phút. Phê quá.
Tôi gởi file có 2 code, bạn có thể test từng module.
Nếu có thể thì bỏ cái dòng chạy thử. ie nếu đến 20 cột thì save 1 lần.
If k Mod 10 = 0 Then ActiveWorkbook.Save
Bạn chạy thử code Sub DemCapSoNew() xem.
Đề xuất phương án nếu 200 cột thì mình tách thành 5 file và tính từng file.
 

File đính kèm

  • thongke02.rar
    95.2 KB · Đọc: 36
Lần chỉnh sửa cuối:
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!
 
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!
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
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.
Phương án chạy thành 3 lần.
1/ AB
2/ BA
3/ AB-BA = 1 + 2
 
Lần chỉnh sửa cuối:
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
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.
Phương án chạy thành 3 lần.
1/ AB
2/ BA
3/ AB-BA = 1 + 2

Lờ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!
 
Lờ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!
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
PHP:
If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Thành
PHP:
'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án
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
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.
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
PHP:
If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Thành
PHP:
'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án
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
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.
Cám ơ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, 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

Bạn ơi! Có phải làm như vậy không? nhưng sao kết quả không ra?
 
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
PHP:
If Dic.Exists(sCapSo2) Then ArrKQ2(s, 1) = ArrCapSo(Dic.Item(sCapSo2), 2)
ArrKQ3(s, 1) = ArrKQ1(s, 1) + ArrKQ2(s, 1)
Thành
PHP:
'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án
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
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.
Cám ơn.

Thà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!
 
Thà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!
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à
PHP:
'With Sheets(2)
    '.Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ3
  ''End With
'Phần sh 3 không đánh dấu.
PHP:
  'With Sheets(4)
   ' .Range("B4").Offset(, k - 1).Resize(s, 1) = ArrKQ2
  ''End With
Gán ArrKQ1 (AB) vào sh 3.
 
Lần chỉnh sửa cuối:
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.
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 đỡ!
 
Nghỉ mấy ngày! Không biết bác ThuNghi đã tìm ra cách tối ưu cho đoạn code chưa ạ? Mong tin của bác! Cảm ơn bác!
 
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ả.

Vâng! Cảm ơn bác ThuNghi! "Bạn vào tools option phần hide zero", excel2007 không có, nhưng nhờ vậy mà mình cũng mò mẫm học thêm nhiều điều mới và cũng tìm ra được rùi ạ! Cảm ơn bác rất nhiều! Lúc nào bác có thời gian nghĩ ra được phương án tối ưu cho đoạn code thì mong bác báo tin vui cho mình với nhé! Chúc bác mạnh khoẻ! Chúc GPE vững mạnh!
 
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ả.

Chào buổi sáng! Chúc GPE ngày mới thắng lợi!
- Mình đã "vào tools option phần hide zero" nhưng chỉ có tác dụng làm ẩn đi số 0 - Số 0 không bị xoá đi!
- Mình đã dùng Find, nhưng ngoài cách đó ra không biết có code để xoá tất cả số 0 có trong file dữ liệu không? Mong GPE giúp đỡ! Chân thành cảm ơn!
 
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
- 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:
- Với đoạn code trên mình vẫn đang thực hiện hàng ngày với điều kiện đối chiếu sự xuất hiện của các số ở 27 cặp vị trí được tô màu. Nay mình mong các bạn có thể hướng dẫn mình cách sửa đoạn code trên là chỉ đối chiếu với một cặp vị trí duy nhất được tô màu (xét nguyên vị trí tô màu dòng 7 và 8)!
p/s: Trường hợp này mình đã tìm hiểu ra: rất đơn giản là chỉ việc xóa màu hết cho các dòng khác chỉ chừa lại dòng 7-8 ! Cảm ơn các bạn đã quan tâm!
 

File đính kèm

  • thongke.rar
    56.3 KB · Đọc: 6
Lần chỉnh sửa cuối:
- 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:
- Với đoạn code trên mình vẫn đang thực hiện hàng ngày với điều kiện đối chiếu sự xuất hiện của các số ở 27 cặp vị trí được tô màu. Nay mình mong các bạn giúp mình trường hợp này với ạ
- Mình xin gửi file gốc minh họa cho trường hợp ban đầu xét đối chiếu ở cả 27 vị trí cặp tô màu!
- Rất mong sự giúp đỡ của các bạn! Chúc GPE thành công!
 

File đính kèm

  • thongke.7z
    38.3 KB · Đọc: 1
Web KT

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

Back
Top Bottom