Dò tìm chính xác tuyệt đối (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
153
Được thích
20
Nhờ các Pro viết giúp 1 đoạn VBA để dò tìm giá trị chính xác tuyệt đối. Với điều kiện:
  • Chỉ trả kết quả dò tìm của các giá trị ở cột 3 vào cột KQ - khi giá trị ở cột 4 là 1.
  • Nếu giá trị cột 4 khác 1 thì không thay đổi giá trị tương ứng có sẵn ở cột KQ. (tức là code chỉ tác động vào cột KQ với những dòng có con 1 ở cột 4).
  • Dò tìm với điều kiện chính xác tuyệt đối, phân biệt cả hoa/thường hay không dấu/có dấu.
Dữ liệu có thể lên tới 500k dòng nên dùng hàm thông thường không chạy nổi.
Mình có gửi theo kèm file nhờ các bạn hỗ trợ giúp.
Untitled(2).png
 

File đính kèm

Lần chỉnh sửa cuối:
Nhờ các Pro viết giúp 1 đoạn VBA để dò tìm giá trị chính xác tuyệt đối. Với điều kiện:
  • Chỉ trả kết quả dò tìm của các giá trị ở cột 3 vào cột KQ - khi giá trị ở cột 4 là 1.
  • Nếu giá trị cột 4 khác 1 thì không thay đổi giá trị tương ứng có sẵn ở cột KQ. (tức là code chỉ tác động vào cột KQ với những dòng có con 1 ở cột 4).
  • Dò tìm với điều kiện chính xác tuyệt đối, phân biệt cả hoa/thường hay không dấu/có dấu.
Dữ liệu có thể lên tới 500k dòng nên dùng hàm thông thường không chạy nổi.
Mình có gửi theo kèm file nhờ các bạn hỗ trợ giúp.
View attachment 226848
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Res()
  Dim eR1&, eR2&, i&, sRow&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:B" & eR1).Value
    dArr = .Range("D3:E" & eR2).Value
    Res = .Range("F3:F" & eR2).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(sArr)
    For i = 1 To sRow
      .Item(sArr(i, 1)) = sArr(i, 2)
    Next i
    sRow = UBound(dArr)
    For i = 1 To sRow
      If dArr(i, 2) = 1 Then
        Res(i, 1) = .Item(dArr(i, 1))
      End If
    Next i
  End With
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
 
Upvote 0
Nhờ các Pro viết giúp 1 đoạn VBA để dò tìm giá trị chính xác tuyệt đối. Với điều kiện:
  • Chỉ trả kết quả dò tìm của các giá trị ở cột 3 vào cột KQ - khi giá trị ở cột 4 là 1.
  • Nếu giá trị cột 4 khác 1 thì không thay đổi giá trị tương ứng có sẵn ở cột KQ. (tức là code chỉ tác động vào cột KQ với những dòng có con 1 ở cột 4).
  • Dò tìm với điều kiện chính xác tuyệt đối, phân biệt cả hoa/thường hay không dấu/có dấu.
Dữ liệu có thể lên tới 500k dòng nên dùng hàm thông thường không chạy nổi.
Mình có gửi theo kèm file nhờ các bạn hỗ trợ giúp.
View attachment 226848
Code tương tự bài #2 của bác @HieuCD , chỉ viết khác 1 chút.
Mã:
Sub DoTim()
Dim dAr As Variant, sAr As Variant, i As Long
Dim Dic As Object, rAr As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    dAr = Range("A3:B" & Range("A3").End(xlDown).Row).Value2
    For i = 1 To UBound(dAr, 1)
        If Not Dic.Exists(dAr(i, 1)) Then
            Dic.Add dAr(i, 1), Array(dAr(i, 2))
        End If
    Next i
    
    sAr = Range("D3:F" & Range("D3").End(xlDown).Row).Value2
    ReDim rAr(1 To UBound(sAr, 1), 1 To 1)
    For i = 1 To UBound(sAr, 1)
        rAr(i, 1) = sAr(i, 3)
        If sAr(i, 2) = 1 And Dic.Exists(sAr(i, 1)) Then
            rAr(i, 1) = Dic.Item(sAr(i, 1))(0)
        End If
    Next i
    Range("G3").Resize(UBound(sAr, 1)) = rAr
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Code tương tự bài #2 của bác @HieuCD , chỉ viết khác 1 chút.
Mã:
Sub DoTim()
Dim dAr As Variant, sAr As Variant, i As Long
Dim Dic As Object, rAr As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    dAr = Range("A3:B" & Range("A3").End(xlDown).Row).Value2
    For i = 1 To UBound(dAr, 1)
        If Not Dic.Exists(dAr(i, 1)) Then
            Dic.Add dAr(i, 1), Array(dAr(i, 2))
        End If
    Next i
   
    sAr = Range("D3:F" & Range("D3").End(xlDown).Row).Value2
    ReDim rAr(1 To UBound(sAr, 1), 1 To 1)
    For i = 1 To UBound(sAr, 1)
        rAr(i, 1) = sAr(i, 3)
        If sAr(i, 2) = 1 And Dic.Exists(sAr(i, 1)) Then
            rAr(i, 1) = Dic.Item(sAr(i, 1))(0)
        End If
    Next i
    Range("G3").Resize(UBound(sAr, 1)) = rAr
End With
Set Dic = Nothing
End Sub
Nếu ô D3 = IBI0082Yzzzz
Kết quả 2 code sẽ khác nhau
 
Upvote 0
Nhờ các Pro viết giúp 1 đoạn VBA để dò tìm giá trị chính xác tuyệt đối. Với điều kiện:
  • Chỉ trả kết quả dò tìm của các giá trị ở cột 3 vào cột KQ - khi giá trị ở cột 4 là 1.
  • Nếu giá trị cột 4 khác 1 thì không thay đổi giá trị tương ứng có sẵn ở cột KQ. (tức là code chỉ tác động vào cột KQ với những dòng có con 1 ở cột 4).
  • Dò tìm với điều kiện chính xác tuyệt đối, phân biệt cả hoa/thường hay không dấu/có dấu.
Dữ liệu có thể lên tới 500k dòng nên dùng hàm thông thường không chạy nổi.
Mình có gửi theo kèm file nhờ các bạn hỗ trợ giúp.
View attachment 226848
500 dòng thì công thức dùng tốt
 
Upvote 0
Code tương tự bài #2 của bác @HieuCD , chỉ viết khác 1 chút.


Bài đã được tự động gộp:

500 dòng thì công thức dùng tốt
500.000 bạn.
Bài đã được tự động gộp:

Mã:
Sub DoTim()
  Dim sArr(), dArr(), Res()
  Dim eR1&, eR2&, i&, sRow&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:B" & eR1).Value
    dArr = .Range("D3:E" & eR2).Value
    Res = .Range("F3:F" & eR2).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(sArr)
    For i = 1 To sRow
      .Item(sArr(i, 1)) = sArr(i, 2)
    Next i
    sRow = UBound(dArr)
    For i = 1 To sRow
      If dArr(i, 2) = 1 Then
        Res(i, 1) = .Item(dArr(i, 1))
      End If
    Next i
  End With
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
Code chạy đúng ý mình. Một lần nữa cảm ơn các bác rất nhiều!
 
Upvote 0
500 dòng thì công thức dùng tốt
Bạn là người từ hành tinh khác?:(:(:(
Ở GPE này chỉ có chuyện 5000 dòng thiết kế thành 500.000 . Chứ không bao giờ có chuyện thu gọn lại thành 500.
Tôn chỉ là "càng bự càng dễ nói chuyện với người khác"
 
Upvote 0
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Res()
  Dim eR1&, eR2&, i&, sRow&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:B" & eR1).Value
    dArr = .Range("D3:E" & eR2).Value
    Res = .Range("F3:F" & eR2).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(sArr)
    For i = 1 To sRow
      .Item(sArr(i, 1)) = sArr(i, 2)
    Next i
    sRow = UBound(dArr)
    For i = 1 To sRow
      If dArr(i, 2) = 1 Then
        Res(i, 1) = .Item(dArr(i, 1))
      End If
    Next i
  End With
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
Nhờ bạn Hiếu xem giúp có cách nào code lại để có thể chạy nhanh hơn được nữa không nhỉ? Với dữ liệu trong file mình gửi kèm thì máy mình quay suốt chạy không nổi.
 

File đính kèm

Upvote 0
Bạn là người từ hành tinh khác?:(:(:(
Ở GPE này chỉ có chuyện 5000 dòng thiết kế thành 500.000 . Chứ không bao giờ có chuyện thu gọn lại thành 500.
Tôn chỉ là "càng bự càng dễ nói chuyện với người khác"
Không rõ, không hành tinh nào cả, vì nhìn có hành tình nào 500k thành 500 000
 
Upvote 0
Nhờ bạn Hiếu xem giúp có cách nào code lại để có thể chạy nhanh hơn được nữa không nhỉ? Với dữ liệu trong file mình gửi kèm thì máy mình quay suốt chạy không nổi.

Nếu đúng như file up lên thì:

- bước 1 : tại
C1 nhập công thức: =MIN(A3:A335480)
C2 nhập công thức: =MAX(A3:A335480)

- bước 2 : dùng code sau
Tạm dùng cái này đi cho nhanh

.............
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ bạn Hiếu xem giúp có cách nào code lại để có thể chạy nhanh hơn được nữa không nhỉ? Với dữ liệu trong file mình gửi kèm thì máy mình quay suốt chạy không nổi.
Nếu số dòng dữ liệu lớn hơn số dòng kết quả nhiều

Nhờ bạn Hiếu xem giúp có cách nào code lại để có thể chạy nhanh hơn được nữa không nhỉ? Với dữ liệu trong file mình gửi kèm thì máy mình quay suốt chạy không nổi.
Với dữ liệu File, dùng mảng sẽ nhanh hơn nhiều, File khác có thể báo lổi
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Arr(), Res()
  Dim fRow&, eRow&, eR1&, eR2&, i&, sRow&, R&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    
    fRow = Application.Min(.Range("A3:A" & eR1))
    i = Application.Min(.Range("D3:D" & eR2))
    If fRow > i Then fRow = i
    eRow = Application.Max(.Range("A3:A" & eR1))
    i = Application.Max(.Range("D3:D" & eR2))
    If eRow < i Then eRow = i
    
    sArr = .Range("A3:B" & eR1).Value2
    dArr = .Range("D3:E" & eR2).Value2
    Res = .Range("F3:F" & eR2).Value2
  End With
  ReDim Arr(fRow To eRow)
  sRow = UBound(sArr)
  For i = 1 To sRow
    Arr(sArr(i, 1)) = sArr(i, 2)
  Next i
  sRow = UBound(dArr)
  For i = 1 To sRow
    If dArr(i, 2) = 1 Then Res(i, 1) = Arr(dArr(i, 1))
  Next i
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
 
Upvote 0
Về code ở bài #11.
1. Nếu Min(A:A) khác Max(A:A) rất nhiều thì sẽ có vấn đề. Vd. A3 = 12345678, A4 = 98765432 thì mảng Arr sẽ được cấp bộ nhớ = 1 382 716 064 B > 1 GB. Máy của tôi không chịu nổi.

Tuy nhiên tôi cho rằng các giá trị trong cột A trong công việc cụ thể này không khác nhau nhiều lắm. Đây chỉ là lưu ý bình thường. Ý thức về vấn đề.

2. Code không dùng được cho dữ liệu của bài #1.
-------------
Code ở bài #2 dùng cho mọi dữ liệu, cả ở bài #1 và cả ở bài #8. Nếu sửa 2 chỗ trong code thì tốc độ cải thiện rất nhiều. Tất nhiên tốc độ không thể bằng tốc độ của code ở bài #11 vì code ở bài #11 viết cho trường hợp cụ thể: dữ liệu cột A là số và không chênh lệch nhau nhiều.

Nếu ai tò mò thì trong code ở bài #2:
sửa
Mã:
.Item(sArr(i, 1)) = sArr(i, 2)
thành
Mã:
.Item(CStr(sArr(i, 1))) = sArr(i, 2)

Và sửa
Mã:
Res(i, 1) = .Item(dArr(i, 1))
thành
Mã:
Res(i, 1) = .Item(CStr(dArr(i, 1)))
 
Upvote 0
Về code ở bài #11.
1. Nếu Min(A:A) khác Max(A:A) rất nhiều thì sẽ có vấn đề. Vd. A3 = 12345678, A4 = 98765432 thì mảng Arr sẽ được cấp bộ nhớ = 1 382 716 064 B > 1 GB. Máy của tôi không chịu nổi.

Tuy nhiên tôi cho rằng các giá trị trong cột A trong công việc cụ thể này không khác nhau nhiều lắm. Đây chỉ là lưu ý bình thường. Ý thức về vấn đề.

2. Code không dùng được cho dữ liệu của bài #1.
-------------
Code ở bài #2 dùng cho mọi dữ liệu, cả ở bài #1 và cả ở bài #8. Nếu sửa 2 chỗ trong code thì tốc độ cải thiện rất nhiều. Tất nhiên tốc độ không thể bằng tốc độ của code ở bài #11 vì code ở bài #11 viết cho trường hợp cụ thể: dữ liệu cột A là số và không chênh lệch nhau nhiều.

Nếu ai tò mò thì trong code ở bài #2:
sửa
Mã:
.Item(sArr(i, 1)) = sArr(i, 2)
thành
Mã:
.Item(CStr(sArr(i, 1))) = sArr(i, 2)

Và sửa
Mã:
Res(i, 1) = .Item(dArr(i, 1))
thành
Mã:
Res(i, 1) = .Item(CStr(dArr(i, 1)))
Đúng vậy, như bài #10 (bài #11 cùng cách giống vậy )đã viết
Nếu đúng như file up lên thì:
.......
 
Upvote 0
Nếu số dòng dữ liệu lớn hơn số dòng kết quả nhiều


Với dữ liệu File, dùng mảng sẽ nhanh hơn nhiều, File khác có thể báo lổi
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Arr(), Res()
  Dim fRow&, eRow&, eR1&, eR2&, i&, sRow&, R&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
   
    fRow = Application.Min(.Range("A3:A" & eR1))
    i = Application.Min(.Range("D3:D" & eR2))
    If fRow > i Then fRow = i
    eRow = Application.Max(.Range("A3:A" & eR1))
    i = Application.Max(.Range("D3:D" & eR2))
    If eRow < i Then eRow = i
   
    sArr = .Range("A3:B" & eR1).Value2
    dArr = .Range("D3:E" & eR2).Value2
    Res = .Range("F3:F" & eR2).Value2
  End With
  ReDim Arr(fRow To eRow)
  sRow = UBound(sArr)
  For i = 1 To sRow
    Arr(sArr(i, 1)) = sArr(i, 2)
  Next i
  sRow = UBound(dArr)
  For i = 1 To sRow
    If dArr(i, 2) = 1 Then Res(i, 1) = Arr(dArr(i, 1))
  Next i
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
Code tương tự bài #2 của bác @HieuCD , chỉ viết khác 1 chút.
Mã:
Sub DoTim()
Dim dAr As Variant, sAr As Variant, i As Long
Dim Dic As Object, rAr As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    dAr = Range("A3:B" & Range("A3").End(xlDown).Row).Value2
    For i = 1 To UBound(dAr, 1)
        If Not Dic.Exists(dAr(i, 1)) Then
            Dic.Add dAr(i, 1), Array(dAr(i, 2))
        End If
    Next i
   
    sAr = Range("D3:F" & Range("D3").End(xlDown).Row).Value2
    ReDim rAr(1 To UBound(sAr, 1), 1 To 1)
    For i = 1 To UBound(sAr, 1)
        rAr(i, 1) = sAr(i, 3)
        If sAr(i, 2) = 1 And Dic.Exists(sAr(i, 1)) Then
            rAr(i, 1) = Dic.Item(sAr(i, 1))(0)
        End If
    Next i
    Range("G3").Resize(UBound(sAr, 1)) = rAr
End With
Set Dic = Nothing
End Sub
Nếu đúng như file up lên thì:

- bước 1 : tại
C1 nhập công thức: =MIN(A3:A335480)
C2 nhập công thức: =MAX(A3:A335480)

- bước 2 : dùng code sau
Tạm dùng cái này đi cho nhanh

Mã:
Sub DoTimARRAY()
    Dim t
    t = Timer
  Dim sArr(), dArr(), Res(), iArr()
  Dim n1&, n2&, i&
  Dim i1&, i2&

  With Sheet1
    n1 = .Range("A" & Rows.Count).End(xlUp).Row
    n2 = .Range("D" & Rows.Count).End(xlUp).Row
    If n1 < 3 Or n2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:B" & n1).Value
    dArr = .Range("D3:E" & n2).Value
    i1 = .Range("C1") 'MIN
    i2 = .Range("C2") 'MAX
    Res = .Range("F3:F" & n2).Value
   
  End With
  n1 = n1 - 2
  n2 = n2 - 2
    ReDim iArr(i1 To i2)
    For i = 1 To n1
      iArr(sArr(i, 1)) = sArr(i, 2)
    Next i
  
  
    For i = 1 To n2
      If dArr(i, 2) = 1 Then
        Res(i, 1) = iArr(dArr(i, 1))
      End If
    Next i

  Sheet1.Range("F3").Resize(n2).Value = Res
  t = Timer - t
  MsgBox "Time t=" & t
End Sub
Nếu số dòng dữ liệu lớn hơn số dòng kết quả nhiều


Với dữ liệu File, dùng mảng sẽ nhanh hơn nhiều, File khác có thể báo lổi
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Arr(), Res()
  Dim fRow&, eRow&, eR1&, eR2&, i&, sRow&, R&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
   
    fRow = Application.Min(.Range("A3:A" & eR1))
    i = Application.Min(.Range("D3:D" & eR2))
    If fRow > i Then fRow = i
    eRow = Application.Max(.Range("A3:A" & eR1))
    i = Application.Max(.Range("D3:D" & eR2))
    If eRow < i Then eRow = i
   
    sArr = .Range("A3:B" & eR1).Value2
    dArr = .Range("D3:E" & eR2).Value2
    Res = .Range("F3:F" & eR2).Value2
  End With
  ReDim Arr(fRow To eRow)
  sRow = UBound(sArr)
  For i = 1 To sRow
    Arr(sArr(i, 1)) = sArr(i, 2)
  Next i
  sRow = UBound(dArr)
  For i = 1 To sRow
    If dArr(i, 2) = 1 Then Res(i, 1) = Arr(dArr(i, 1))
  Next i
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
Về code ở bài #11.
1. Nếu Min(A:A) khác Max(A:A) rất nhiều thì sẽ có vấn đề. Vd. A3 = 12345678, A4 = 98765432 thì mảng Arr sẽ được cấp bộ nhớ = 1 382 716 064 B > 1 GB. Máy của tôi không chịu nổi.

Tuy nhiên tôi cho rằng các giá trị trong cột A trong công việc cụ thể này không khác nhau nhiều lắm. Đây chỉ là lưu ý bình thường. Ý thức về vấn đề.

2. Code không dùng được cho dữ liệu của bài #1.
-------------
Code ở bài #2 dùng cho mọi dữ liệu, cả ở bài #1 và cả ở bài #8. Nếu sửa 2 chỗ trong code thì tốc độ cải thiện rất nhiều. Tất nhiên tốc độ không thể bằng tốc độ của code ở bài #11 vì code ở bài #11 viết cho trường hợp cụ thể: dữ liệu cột A là số và không chênh lệch nhau nhiều.

Nếu ai tò mò thì trong code ở bài #2:
sửa
Mã:
.Item(sArr(i, 1)) = sArr(i, 2)
thành
Mã:
.Item(CStr(sArr(i, 1))) = sArr(i, 2)

Và sửa
Mã:
Res(i, 1) = .Item(dArr(i, 1))
thành
Mã:
Res(i, 1) = .Item(CStr(dArr(i, 1)))
Đúng vậy, như bài #10 (bài #11 cùng cách giống vậy )đã viết
Cám ơn các bác đã chỉ giáo, tuy nhiên dữ liệu không phải lúc nào cũng là số ạ, lúc text, lúc number, có lúc là time hoặc lẫn tất cả. Number thì giá trị tiền có thể từ 0 hoặc âm cho tới hàng trăm triệu, hàng tỷ đồng (ở kết quả giá trị trả về, trong cùng 1 dải dò tìm). Nếu như vậy thì sẽ cần dùng đoạn code ntn để đáp ứng được tối ưu nhất? Chấp nhận không cần quá nhanh như code chỉ được viết riêng cho 1 t/hợp cụ thể, chỉ cần cải thiện được tốc độ một cách tốt nhất có thể là được rồi ạ. Cảm ơn mọi người rất nhiều!
 
Upvote 0
Mình đã thử hết các cách ở trên và đã hiện giải quyết tốt được vấn đề rồi. Sau không rõ còn tình huống nào nữa không nhưng như hiện tại là chạy nhanh lắm rồi, mất có khoang trên dưới 2 phút thôi, so với trước mình ngồi uống hết cafe vẫn chưa xong.
Cám ơn các bro rất nhiều!
Bài đã được tự động gộp:

Nếu số dòng dữ liệu lớn hơn số dòng kết quả nhiều


Với dữ liệu File, dùng mảng sẽ nhanh hơn nhiều, File khác có thể báo lổi
Mã:
Sub DoTim()
  Dim sArr(), dArr(), Arr(), Res()
  Dim fRow&, eRow&, eR1&, eR2&, i&, sRow&, R&
  With Sheet1
    eR1 = .Range("A" & Rows.Count).End(xlUp).Row
    eR2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eR1 < 3 Or eR2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
   
    fRow = Application.Min(.Range("A3:A" & eR1))
    i = Application.Min(.Range("D3:D" & eR2))
    If fRow > i Then fRow = i
    eRow = Application.Max(.Range("A3:A" & eR1))
    i = Application.Max(.Range("D3:D" & eR2))
    If eRow < i Then eRow = i
   
    sArr = .Range("A3:B" & eR1).Value2
    dArr = .Range("D3:E" & eR2).Value2
    Res = .Range("F3:F" & eR2).Value2
  End With
  ReDim Arr(fRow To eRow)
  sRow = UBound(sArr)
  For i = 1 To sRow
    Arr(sArr(i, 1)) = sArr(i, 2)
  Next i
  sRow = UBound(dArr)
  For i = 1 To sRow
    If dArr(i, 2) = 1 Then Res(i, 1) = Arr(dArr(i, 1))
  Next i
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
File text chạy báo lỗi.
Bài đã được tự động gộp:

Về code ở bài #11.
1. Nếu Min(A:A) khác Max(A:A) rất nhiều thì sẽ có vấn đề. Vd. A3 = 12345678, A4 = 98765432 thì mảng Arr sẽ được cấp bộ nhớ = 1 382 716 064 B > 1 GB. Máy của tôi không chịu nổi.

Tuy nhiên tôi cho rằng các giá trị trong cột A trong công việc cụ thể này không khác nhau nhiều lắm. Đây chỉ là lưu ý bình thường. Ý thức về vấn đề.

2. Code không dùng được cho dữ liệu của bài #1.
-------------
Code ở bài #2 dùng cho mọi dữ liệu, cả ở bài #1 và cả ở bài #8. Nếu sửa 2 chỗ trong code thì tốc độ cải thiện rất nhiều. Tất nhiên tốc độ không thể bằng tốc độ của code ở bài #11 vì code ở bài #11 viết cho trường hợp cụ thể: dữ liệu cột A là số và không chênh lệch nhau nhiều.

Nếu ai tò mò thì trong code ở bài #2:
sửa
Mã:
.Item(sArr(i, 1)) = sArr(i, 2)
thành
Mã:
.Item(CStr(sArr(i, 1))) = sArr(i, 2)

Và sửa
Mã:
Res(i, 1) = .Item(dArr(i, 1))
thành
Mã:
Res(i, 1) = .Item(CStr(dArr(i, 1)))
Sửa lại code bác Hiếu theo như này thì chạy ngon lành luôn. :)
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các bác đã chỉ giáo, tuy nhiên dữ liệu không phải lúc nào cũng là số ạ, lúc text, lúc number, có lúc là time hoặc lẫn tất cả. Number thì giá trị tiền có thể từ 0 hoặc âm cho tới hàng trăm triệu, hàng tỷ đồng (ở kết quả giá trị trả về, trong cùng 1 dải dò tìm). Nếu như vậy thì sẽ cần dùng đoạn code ntn để đáp ứng được tối ưu nhất? Chấp nhận không cần quá nhanh như code chỉ được viết riêng cho 1 t/hợp cụ thể, chỉ cần cải thiện được tốc độ một cách tốt nhất có thể là được rồi ạ. Cảm ơn mọi người rất nhiều!
ntn là gì vậy?

Tại sao Tiền lại làm key (khóa) để đi tìm kiếm vậy, nghi ngờ , nếu được bạn cho biết ứng dụng vào đâu?

Mình đã thử hết các cách ở trên và đã hiện giải quyết tốt được vấn đề rồi. Sau không rõ còn tình huống nào nữa không nhưng như hiện tại là chạy nhanh lắm rồi, mất có khoang trên dưới 2 phút thôi, so với trước mình ngồi uống hết cafe vẫn chưa xong.
Cám ơn các bro rất nhiều!
Bài đã được tự động gộp:


File text chạy báo lỗi.
Bài đã được tự động gộp:


Sửa lại code bác Hiếu theo như này thì chạy ngon lành luôn. :)
Áp dụng cái gì là do bạn quyết định thôi, chúng tôi có nhúng tay vào chạy hay áp dụng đâu
 
Upvote 0
ntn là gì vậy?

Tại sao Tiền lại làm key (khóa) để đi tìm kiếm vậy, nghi ngờ , nếu được bạn cho biết ứng dụng vào đâu?
Number thì giá trị tiền có thể từ 0 hoặc âm cho tới hàng trăm triệu, hàng tỷ đồng (ở kết quả giá trị trả về, trong cùng 1 dải dò tìm)
Có gì đâu, hoàn toàn được. Nhưng mà trước hết mình thấy:
Lần trước thì bạn hỏi là 500 dòng thì cần gì code trong khi mình có nói rõ là 500k dòng.
Lần này thì bạn lại hỏi tiền làm key để tìm, trong khi mình cũng nói rất rõ là tiền là kết quả giá trị trả về khi dò tìm.
Có vẻ công việc của bạn khá là bận bịu nên thường ít khi đọc được kỹ.
Anw, vẫn có rất rất nhiều trường hợp tiền cũng là 1 key dò tìm thật sự, đối với tất cả mọi người chứ chẳng riêng gì mình. Chúng ta mỗi người chỉ làm 1 nghề, không thể biết hết mọi nghề của xã hội để có thể nghi ngờ vậy.
Với riêng mình, có thể tiền được dùng làm key để tìm ra khách hàng nào, thời điểm nào, ở địa điểm nào... tương ứng với giá trị tiền đó. Muôn hình muôn vẻ.
[/QUOTE]
Bài đã được tự động gộp:

Sẵn đó, bạn hỏi giùm tôi bro có nghĩa là gì luôn.
Nếu đúng theo tôi nghĩ thì từ đó chỉ giành cho chát chứ trên forrum thì không được lịch sự cho lắm (trừ mấy cái forrum chơi ghêm).
Cũng không hẳn như thế đâu, mình thì cũng ít khi dùng, nhưng bạn có thể dạo qua khá nhiều các forum lớn và uy tín, cả ở VN hay nước ngoài, thì có thể dễ dàng nhận ra từ đó được áp dụng rất thông dụng, với ý nghĩa trang trọng. Bro viết tắt của Brother, tức nói về người đối diện với một sự tôn trọng, nể trọng, như một người bề trên.
 
Upvote 0
Bro viết tắt của Brother, tức nói về người đối diện với một sự tôn trọng, nể trọng, như một người bề trên.

Tại sao đang viết (giao tiếp) cả câu văn tiếng Việt lại xen vào 1 chữ viết tắt của tiếng "nước nào", khoe ngoại ngữ chăng?
Xin lỗi!
Thành viên GPE hiện có rất nhiều người đang sống, làm việc với người nước ngoài (hoặc đang làm việc ở nước ngoài) nhưng họ vẫn "thuần Việt" khi giao tiếp với người Việt.
Nửa nạc nửa mỡ (ba rọi) không làm nên một sự lịch lãm.
 
Lần chỉnh sửa cuối:
Upvote 0
Bro viết tắt của Brother, tức nói về người đối diện với một sự tôn trọng, nể trọng, như một người bề trên.

Tại sao đang viết (giao tiếp) cả câu văn tiếng Việt lại xen vào 1 chữ viết tắt của tiếng "nước nào", khoe ngoại ngữ chăng?
Xin lỗi!
Thành viên GPE hiện có rất nhiều người đang sống, làm việc với người nước ngoài (hoặc đang làm việc ở nước ngoài) nhưng họ vẫn "thuần Việt" khi giao tiếp với người Việt.
Nửa nạc nửa mỡ (ba rọi) không làm nên một sự lịch lãm.
Có rất nhiều từ/cụm từ là ngôn ngữ không phải của Việt Nam nhưng vẫn thường xuyên được sử dụng trong lời nói, diễn đạt của người Việt. Tks, sorry, email, smartphone, welcome, Ok, share, fairplay...
Và không nói gì tới tiếng Anh, mà tiếng Trung Quốc cũng là một dạng ngoại ngữ. Mà tiếng Trung thì quá phổ biến trong ngôn ngữ nói của người Việt.
Có rất nhiều trường hợp trong lời nói có 1 ý hay 1 từ nào đó người nói diễn đạt bằng tiếng ngoại ngữ, và họ không hề có ý muốn khoe khoang. Đơn giản chỉ như 1 thói quen, hoặc có thể chưa tìm được từ tiếng Việt phù hợp hơn.
Mình rất ngạc nhiên nếu bạn chưa bao giờ gặp trường hợp nào như vậy đấy.
Nếu là định khoe khoang thì sẽ phải thể hiện ở một hình thái khác. Tuy nhiên tất cả đều ở sự nhìn nhận của mỗi người, góc nhìn của từng người là khác nhau. Cùng 1 nội dung người này hiểu ở trạng thái tích cực, còn người kia hiểu ngược lại.
Còn khi với những người nghe đã có sự nhìn nhận như thế thì chắc chắn người nói sẽ cần phải rút kinh nghiệm.
P/s: Mình không nói tới bro, mà chỉ trả lời ý hỏi của bạn V khi hỏi về bro thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Bro viết tắt của Brother, tức nói về người đối diện với một sự tôn trọng, nể trọng, như một người bề trên.
...
Bro viết tắt của Brother: đúng
tôn trọng, nể trọng, như một người bề trên: sai
Khác với tiếng Việt, brother chỉ là anh hoặc em, không hề có chứa nghĩa "bề trên". Tiếng Việt thì "anh" là bề trên, "em" hoàn toàn không thể là bề trên. Chỉ khi nào từ Brother viết hoa, lúc ấy là một chức vị trong Công Giáo (Huynh), và là một cách gọi tôn trọng.
Từ brother, viết tắt thành bro là cách nói chuyện của dân giang hồ. Nó du nhập từ cách gọi của các nhóm băng đảng da đen hoặc Latin bên Mỹ. Tuy mang tiếng "thân mật" nhưng chỉ dùng để nói chuyện ngang hàng; không bao giờ dùng trong trường hợp lịch sự.
 
Upvote 0
Có gì đâu, hoàn toàn được. Nhưng mà trước hết mình thấy:
Lần trước thì bạn hỏi là 500 dòng thì cần gì code trong khi mình có nói rõ là 500k dòng.
Lần này thì bạn lại hỏi tiền làm key để tìm, trong khi mình cũng nói rất rõ là tiền là kết quả giá trị trả về khi dò tìm.
Có vẻ công việc của bạn khá là bận bịu nên thường ít khi đọc được kỹ.
Anw, vẫn có rất rất nhiều trường hợp tiền cũng là 1 key dò tìm thật sự, đối với tất cả mọi người chứ chẳng riêng gì mình. Chúng ta mỗi người chỉ làm 1 nghề, không thể biết hết mọi nghề của xã hội để có thể nghi ngờ vậy.
Với riêng mình, có thể tiền được dùng làm key để tìm ra khách hàng nào, thời điểm nào, ở địa điểm nào... tương ứng với giá trị tiền đó. Muôn hình muôn vẻ.



Cũng không hẳn như thế đâu, mình thì cũng ít khi dùng, nhưng bạn có thể dạo qua khá nhiều các forum lớn và uy tín, cả ở VN hay nước ngoài, thì có thể dễ dàng nhận ra từ đó được áp dụng rất thông dụng, với ý nghĩa trang trọng. Bro viết tắt của Brother, tức nói về người đối diện với một sự tôn trọng, nể trọng, như một người bề trên.

Tự bạn đọc lại. Tôi đúng là không có thời gian giúp mà phải đi dịch từ tắt, từ lóng ở đây, nên dùng sự giúp đỡ của các thành viên khác vậy. Cứ giữ cách nói cách viết cho của riêng.
 
Upvote 0
Mình rất ngạc nhiên nếu bạn chưa bao giờ gặp trường hợp nào như vậy đấy.
Thật tình là mình rất ngạc nhiên khi người Việt viết: Tks bạn, Dear mọi người, Sorry bạn,... giống thời trước 1975 dân "BỒI" nói tiếng "BỒI".
Còn "BỒI" thời trước nữa thì có: "Moa nói cho toa nghe", "Sao toa ôm vợ moa"...
Chú ý: Đây là nói về từ ngữ trong giao tiếp (viết, nói) với người Việt bằng tiếng Việt, còn các từ chuyên môn như "Window", "Office", "File", "Sheet", "Module", ... thì không nói tới.
 
Lần chỉnh sửa cuối:
Upvote 0
Bro viết tắt của Brother: đúng
tôn trọng, nể trọng, như một người bề trên: sai
Khác với tiếng Việt, brother chỉ là anh hoặc em, không hề có chứa nghĩa "bề trên". Tiếng Việt thì "anh" là bề trên, "em" hoàn toàn không thể là bề trên. Chỉ khi nào từ Brother viết hoa, lúc ấy là một chức vị trong Công Giáo (Huynh), và là một cách gọi tôn trọng.
Từ brother, viết tắt thành bro là cách nói chuyện của dân giang hồ. Nó du nhập từ cách gọi của các nhóm băng đảng da đen hoặc Latin bên Mỹ. Tuy mang tiếng "thân mật" nhưng chỉ dùng để nói chuyện ngang hàng; không bao giờ dùng trong trường hợp lịch sự.
Có những khi miệng nói anh nhưng là hàm ý mỉa mai, có những khi gọi em nhưng chất chứa đầy sự tôn trọng. Quan trọng là thái độ và cách nhìn nhận cũng như thể hiện của người nói, không nên quá đi vào từng câu chữ để đánh giá sự tôn trọng của mỗi người dành cho nhau.
Cách nhìn của mỗi người với cùng một vấn đề khác nhau là điều bình thường mình cũng đã nói rồi. Quan điểm của mỗi người cần tôn trọng, vì thế mình xin phép không tranh luận thêm về việc này. Hơn nữa, việc tranh luận này cảm thấy thật buồn cười, bởi nó chẳng liên quan gì đến topic này cả, cũng chẳng hiểu tại sao bro đó từ đâu mà có ở đây nữa.
 
Upvote 0
Tự bạn đọc lại. Tôi đúng là không có thời gian giúp mà phải đi dịch từ tắt, từ lóng ở đây, nên dùng sự giúp đỡ của các thành viên khác vậy. Cứ giữ cách nói cách viết cho của riêng.
Mình đọc lại rất nhiều rồi, nhưng không thấy có bất kỳ ý nào về những điều bạn nói (mà mình tưởng đã lỡ viết ra không hay biết). Và mình nghĩ chắc là bạn mới là người chỉ đọc 1 lần, lại là lần lướt.
Nếu có thể bạn chỉ hộ mình đã dùng từ tắt nào để bạn bị nhầm từ 500.000 thành 500? Hay bạn nghĩ 500k thì k kia là tắt? Không một ai hiểu nhầm như bạn thì bạn có đang nghĩ rằng bạn có thể đúng như một người từ hành tinh khác như lời một thành viên đã nói ở trên không?
Hay mình đã nói tắt thế nào để bạn nhầm mình đang chỉ việc tiền là từ khóa tìm trong khi mình nói rằng tiền là kết quả trả về khi dò tìm? Có lẽ bạn đã đọc lướt quá nhanh vì quá tự tin với khả năng đọc hiểu của mình.
Nếu bạn là một thành viên nhưng không giúp đỡ những thành viên khác với những lý do bạn đã nêu đó, thì mình cũng chẳng biết làm sao và cũng chẳng còn gì để nói nữa.
 
Upvote 0
Thật tình là mình rất ngạc nhiên khi người Việt viết: Tks bạn, Dear mọi người, Sorry bạn,... giống thời trước 1975 dân "BỒI" nói tiếng "BỒI".
Còn "BỒI" thời trước nữa thì có: "Moa nói cho toa nghe", "Sao toa ôm vợ moa"...
Chú ý: Đây là nói về từ ngữ trong giao tiếp (viết, nói) với người Việt bằng tiếng Việt, còn các từ chuyên môn như "Window", "Office", "File", "Sheet", "Module", ... thì không nói tới.
Vậy thì mình cũng chịu không biết mô tả thế nào nữa. Môi trường của mình thì những lời nói như thank you hay sorry quá bình thường luôn. Level, Share hay trên truyền thông liên tục nói về fairplay. Rất nhiều từ ngoại ngữ được sử dụng tùy từng tình huống hoàn cảnh mà mình không bao giờ nghĩ họ nói ra với một mục đích khoe khoang.
Riêng tiếng Trung Quốc phổ biến đến mức độ người ta nói ra một cách vô thức mà không biết mình đã nói ra một từ không phải của Việt Nam. Tiếng Pháp cũng quá nhiều luôn, có ai khi nói những từ như alo, ôtô, uống bia, chào sếp, ê kíp, búp bê, xi nhan, sân ga, nhà băng...mà biết được rằng mình đang nói những từ không phải tiếng mẹ đẻ?
Bài đã được tự động gộp:

Thì cứ coi như tôi lầm, tôi xin lỗi vậy.

View attachment 226929
Ồ bạn đang lấy từ một topic khác sang. Một người đã từng đi tù cách đây 10 năm bây giờ vẫn có thể là một người rất tử tế. Việc bàn luận theo cách như vậy không đến được điều gì cả.
Và cũng như mình đã nói ở trên rồi:
Có những khi miệng nói anh nhưng là hàm ý mỉa mai, có những khi gọi em nhưng chất chứa đầy sự tôn trọng. Quan trọng là thái độ và cách nhìn nhận cũng như thể hiện của người nói, không nên quá đi vào từng câu chữ để đánh giá sự tôn trọng của mỗi người dành cho nhau.
Cách nhìn của mỗi người với cùng một vấn đề khác nhau là điều bình thường mình cũng đã nói rồi. Quan điểm của mỗi người cần tôn trọng, vì thế mình xin phép không tranh luận thêm về việc này.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã thử hết các cách ở trên và đã hiện giải quyết tốt được vấn đề rồi. Sau không rõ còn tình huống nào nữa không nhưng như hiện tại là chạy nhanh lắm rồi, mất có khoang trên dưới 2 phút thôi, so với trước mình ngồi uống hết cafe vẫn chưa xong.
Cám ơn các bro rất nhiều!
Bài đã được tự động gộp:


File text chạy báo lỗi.
Bài đã được tự động gộp:


Sửa lại code bác Hiếu theo như này thì chạy ngon lành luôn. :)
Dữ liệu lớn muốn tăng tốc độ cần chia nhỏ dữ liệu, tùy cấu hình máy tính khoảng cách chia có thể gia giảm
Mã:
Sub DoTimBigData()
  Dim sArr(), dArr(), S() As Object, Res()
  Dim fRow&, eRow&, eRow2&, sRow&, i&, j&, M&, ikey$
  Const dR As Long = 50000 'Tuy cau hinh may, tang giam dR phu hop

  With Sheet1
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    eRow2 = .Range("D" & Rows.Count).End(xlUp).Row
    If eRow < 3 Or eRow2 < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:B" & eRow).Value
    dArr = .Range("D3:E" & eRow2).Value
    Res = .Range("F3:F" & eRow2).Value
  End With

  sRow = UBound(sArr)
  M = sRow \ dR + 1
  ReDim S(1 To M)
  fRow = 1
  For j = 1 To M
    Set S(j) = CreateObject("scripting.dictionary")
    If j = M Then eRow = sRow Else eRow = fRow + dR - 1
    For i = fRow To eRow
      S(j).Item(CStr(sArr(i, 1))) = sArr(i, 2)
    Next i
    fRow = eRow + 1
  Next j

  sRow = UBound(dArr)
  For i = 1 To sRow
    If dArr(i, 2) = 1 Then
      ikey = dArr(i, 1)
      For j = 1 To M
        If S(j).exists(ikey) Then
          Res(i, 1) = S(j).Item(ikey)
          Exit For
        End If
      Next j
    End If
  Next i
  Sheet1.Range("F3").Resize(sRow).Value = Res
End Sub
 
Upvote 0
Mình đọc lại rất nhiều rồi, nhưng không thấy có bất kỳ ý nào về những điều bạn nói (mà mình tưởng đã lỡ viết ra không hay biết). Và mình nghĩ chắc là bạn mới là người chỉ đọc 1 lần, lại là lần lướt.
Nếu có thể bạn chỉ hộ mình đã dùng từ tắt nào để bạn bị nhầm từ 500.000 thành 500? Hay bạn nghĩ 500k thì k kia là tắt? Không một ai hiểu nhầm như bạn thì bạn có đang nghĩ rằng bạn có thể đúng như một người từ hành tinh khác như lời một thành viên đã nói ở trên không?
Hay mình đã nói tắt thế nào để bạn nhầm mình đang chỉ việc tiền là từ khóa tìm trong khi mình nói rằng tiền là kết quả trả về khi dò tìm? Có lẽ bạn đã đọc lướt quá nhanh vì quá tự tin với khả năng đọc hiểu của mình.
Nếu bạn là một thành viên nhưng không giúp đỡ những thành viên khác với những lý do bạn đã nêu đó, thì mình cũng chẳng biết làm sao và cũng chẳng còn gì để nói nữa.
Hãy làm sao các thành viên hiểu và giúp mình thay vì quay sang trách người giúp không hiểu và đôi co với họ. Hết nói.
 
Upvote 0
...
Ồ bạn đang lấy từ một topic khác sang. Một người đã từng đi tù cách đây 10 năm bây giờ vẫn có thể là một người rất tử tế. Việc bàn luận theo cách như vậy không đến được điều gì cả.
...
Ủa tôi có nói là lầm, và xin lỗi mà. Hay là phải nói bằng tiếng "thông dụng" hơn?
Nô pơ ró lem mô. Mi nói lầm. So ri du.

(Má bầy trẻ đâu. Đưa xà bông đây cho tẩy miệng)
 
Upvote 0
Ủa tôi có nói là lầm, và xin lỗi mà. Hay là phải nói bằng tiếng "thông dụng" hơn?
Nô pơ ró lem mô. Mi nói lầm. So ri du.

(Má bầy trẻ đâu. Đưa xà bông đây cho tẩy miệng)
Đây chính là thể hiện rõ ràng nhất của việc nói A nhưng bụng lại nghĩ B đấy. :)
 
Upvote 0
Dữ liệu lớn muốn tăng tốc độ cần chia nhỏ dữ liệu, tùy cấu hình máy tính khoảng cách chia có thể gia giảm

Const dR As Long = 50000 'Tuy cau hinh may, tang giam dR phu hop
Cám ơn bạn nhiều. Code này chạy nhanh hơn rất nhiều rồi. 50000 này là dòng à bạn? Máy càng mạnh thì càng tăng được cao hơn hay càng nhỏ đi thì chạy càng nhanh nhỉ? Nhưng thế nào thì mặc định giá trị này cũng đã chạy ổn lắm rồi.
 
Upvote 0
Bài kiểu này muốn nhanh thì tốt nhất có thể không nên dùng object Dictionary?
 
Upvote 0
Đây chính là thể hiện rõ ràng nhất của việc nói A nhưng bụng lại nghĩ B đấy. :)
Tây bồi mờ. Ý muốn A nhưng xổ Tây thành ra nghĩa B là bình thường.
Điển hình, dân Tây bồi hay dùng câu "Sorry bạn".
sorry là một tĩnh tự (adjective). Theo văn phạm Anh, tĩnh tự bổ nghĩa cho danh tự ở hai trường hợp:
1. khi nó đi theo một động tự loại tả trạng, điển hình là động từ to be.
2. khi nó đi trước một danh tự.
Khi Tây bồi nói "sorry bạn", họ không biết rằng theio văn phạm thì nó lọt vào trường hợp thứ hai. Và thay vì xin lỗi, câu này người biết tiếng Anh đọc thành ra "bạn đáng tội thật".

Chú: ở đây cũng dã có bạn từng được Tây bồi gọi là Master. Tuy master có nghĩa là "thầy, chủ", nhưng lúc di với danh từ riêng (tên) thì danh vị; và có nghĩa là "cậu" (chỉ gọi con nít dưới 14). Nguyễn nếu trên 14 thì gọi là Mr Nguyễn; dưới tuổi ấy thì gọi là Master Nguyễn.
Trong truyện Batman, Pennyworth gọi Master Wayne không phải do Bruce là chủ ông ta. Mà chính vì ông ta chăm sóc y thừ nhỏ.
 
Upvote 0

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

Back
Top Bottom