Nhờ các bạn sửa hộ code cho mượt hơn (1 người xem)

Liên hệ QC

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

Chậm là đương nhiên.
Mã:
For i = 1 To Rng.Rows.Count
    key = Rng(i, 1).Value
    If Len(key) Then Dic.Item(LCase(key)) = Rng(i, 2).Value
Next i

Code trong vòng lặp trên đọc giá trị của từng ô từ sheet. Tổng cộng đọc 172000 lần vào key và đọc 171972 lần để thêm vào Dic. Vấn đề tương tự với vòng FOR thứ 2.

Nên nhớ là khi dữ liệu lớn thì cấm tuyệt đối đọc (ghi) từng cell từ (vào) sheet

Tôi chỉ sửa những chỗ "nhạy cảm".

Chú ý: tôi lấy code từ 1 bài trước, sau đó thấy có code mới nhưng ngại dò xem có chỗ nào thay đổi. Nói chung triết lý thì như code dưới đây. Tức đọc dữ liệu 1 lần từ sheet vào mảng sau đó trong vòng FOR thì dò trong mảng thôi.

Mã:
Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant
  Dim Dic As Object, DicTT As Object, Res(), sArr(), aRngTT(), aRng(), S As Variant, key
  Dim i As Long, k As Long

  sArr = tmp.Value
  aRng = Rng.Value
  aRngTT = RngTT.Value
  ReDim Res(LBound(sArr) To UBound(sArr), 1 To 1)
 
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRng)
    key = aRng(i, 1)
    If Len(key) Then Dic.Item(LCase(key)) = aRng(i, 2)
  Next i
  Set DicTT = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRngTT)
    key = aRngTT(i, 1)
    If Len(key) Then DicTT.Item(LCase(key)) = aRngTT(i, 2)
  Next i
  For k = LBound(sArr) To UBound(sArr)
    If Len(sArr(k, 1)) Then
      S = Split(Application.Trim(sArr(k, 1)), " ")
      For i = LBound(S) To UBound(S)
        key = LCase(S(i))
        If DicTT.exists(key) Then
          S(i) = DicTT.Item(key)
        Else
          If Dic.exists(key) Then S(i) = Dic.Item(key)
        End If
      Next i
      Res(k, 1) = Join(S, " ")
    End If
  Next
  VH = Res
  Set Dic = Nothing: Set DicTT = Nothing
End Function
Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant
Với ByVal tmp As Range thì phạm vi áp dụng của Function bị hạn chế, khó dùng cho file thực tế của chủ topic
Thật ra File thực tế bảng tra không lớn nên dùng Range hay Array không ảnh hưởng bao nhiêu, chạy không mượt chủ yếu là do các hàm mảng khác và cách vận dụng công thức không phù hợp: https://www.giaiphapexcel.com/diendan/threads/nhờ-giúp-chuyển-công-thức-dài-thành-vba.134507/
 
Like anh luôn! duyệt từng ô sẽ rất là chậm.

Nói là công thức mảng cho nó sang cái miệng, chứ nó cũng như bao hàm khác thôi, chỉ là nó trả về mảng thay vì một giá trị, bạn làm cái này suốt rồi sao lại hỏi tui chứ, hishis hí hsis
Vậy là bạn không biết gì về công thức mảng? Hình người đẹp có bị gì không sao mờ quá vậy
 
Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant
Với ByVal tmp As Range thì phạm vi áp dụng của Function bị hạn chế,
Suốt một thời gian dài tôi không tham gia chủ đề này vì một lý do đơn giản. Chủ chủ đề không đính kèm tập tin, không mô tả dữ liệu và không mô tả yêu cầu. Tôi hiểu là đã có chủ đề nào đó trước kia và chỉ những người tham gia nó mới hiểu.

Tôi chỉ sửa một code cụ thể, không xét nó trong bối cảnh tập tin của thớt. Vì làm gì có tập tin, làm gì có mô tả, yêu cầu? Còn kiểu dữ liệu nếu không đúng ý thì tự sửa. Thực ra tôi chỉ cần viết "đọc dữ liệu 1 lần từ sheet vào mảng sau đó trong vòng FOR thì dò trong mảng thôi." rồi mỗi người tự sửa thôi.
khó dùng cho file thực tế của chủ topic
Thật ra File thực tế bảng tra không lớn nên dùng Range hay Array không ảnh hưởng bao nhiêu, chạy không mượt chủ yếu là do các hàm mảng khác và cách vận dụng công thức không phù hợp
Tôi đâu biết dữ liệu lớn cỡ nào? Làm gì có tập tin, làm gì có mô tả, yêu cầu? Tôi chỉ thấy thớt kêu là chậm và thấy tập tin của bạn cỡ ~172000 dòng thôi. Với dữ liệu cỡ này thì code mới trên máy tôi chạy nhanh hơn cũ 4 lần. Tôi chạy thử trong tập tin của bạn mà trong đó có hàm mảng nào khác đâu?

Mà tôi cũng đã viết
Nên nhớ là khi dữ liệu lớn thì cấm tuyệt đối đọc (ghi) từng cell từ (vào) sheet
Tức chỉ khi dữ liệu khủng thì mới cần để ý. Nói thế không có nghĩa là cấm đọc từ sheet khi dữ liệu ít.

Tôi viết điều này cho thớt một phần thì cho những người khác hiện thời và trong tương lai 10 phần. Vì theo cách hoạt động của diễn đàn thì một người hỏi thì 1000 người được nhờ. Một câu trả lời là giúp cho 1001 người chứ không chỉ cho một mình thớt. Chỉ có ý thế thôi.
 
Vậy là bạn không biết gì về công thức mảng? Hình người đẹp có bị gì không sao mờ quá vậy
Tự hiểu đi,tui có thấy file của chủ thớt đâu, sao nghe nhàm thế, vậy mà bạn viết code cứ như đúng rồi, phục quá. Còn avata của tui thì tui thích cái nào tui dùng cái ý, bạn có ý kiến gì không?
 
Chậm là đương nhiên.
Mã:
For i = 1 To Rng.Rows.Count
    key = Rng(i, 1).Value
    If Len(key) Then Dic.Item(LCase(key)) = Rng(i, 2).Value
Next i

Code trong vòng lặp trên đọc giá trị của từng ô từ sheet. Tổng cộng đọc 172000 lần vào key và đọc 171972 lần để thêm vào Dic. Vấn đề tương tự với vòng FOR thứ 2.

Nên nhớ là khi dữ liệu lớn thì cấm tuyệt đối đọc (ghi) từng cell từ (vào) sheet

Tôi chỉ sửa những chỗ "nhạy cảm".

Chú ý: tôi lấy code từ 1 bài trước, sau đó thấy có code mới nhưng ngại dò xem có chỗ nào thay đổi. Nói chung triết lý thì như code dưới đây. Tức đọc dữ liệu 1 lần từ sheet vào mảng sau đó trong vòng FOR thì dò trong mảng thôi.

Mã:
Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant
  Dim Dic As Object, DicTT As Object, Res(), sArr(), aRngTT(), aRng(), S As Variant, key
  Dim i As Long, k As Long

  sArr = tmp.Value
  aRng = Rng.Value
  aRngTT = RngTT.Value
  ReDim Res(LBound(sArr) To UBound(sArr), 1 To 1)

  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRng)
    key = aRng(i, 1)
    If Len(key) Then Dic.Item(LCase(key)) = aRng(i, 2)
  Next i
  Set DicTT = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRngTT)
    key = aRngTT(i, 1)
    If Len(key) Then DicTT.Item(LCase(key)) = aRngTT(i, 2)
  Next i
  For k = LBound(sArr) To UBound(sArr)
    If Len(sArr(k, 1)) Then
      S = Split(Application.Trim(sArr(k, 1)), " ")
      For i = LBound(S) To UBound(S)
        key = LCase(S(i))
        If DicTT.exists(key) Then
          S(i) = DicTT.Item(key)
        Else
          If Dic.exists(key) Then S(i) = Dic.Item(key)
        End If
      Next i
      Res(k, 1) = Join(S, " ")
    End If
  Next
  VH = Res
  Set Dic = Nothing: Set DicTT = Nothing
End Function
hàm này không tra được kiểu này: vh("
Chậm là đương nhiên.
Mã:
For i = 1 To Rng.Rows.Count
    key = Rng(i, 1).Value
    If Len(key) Then Dic.Item(LCase(key)) = Rng(i, 2).Value
Next i

Code trong vòng lặp trên đọc giá trị của từng ô từ sheet. Tổng cộng đọc 172000 lần vào key và đọc 171972 lần để thêm vào Dic. Vấn đề tương tự với vòng FOR thứ 2.

Nên nhớ là khi dữ liệu lớn thì cấm tuyệt đối đọc (ghi) từng cell từ (vào) sheet

Tôi chỉ sửa những chỗ "nhạy cảm".

Chú ý: tôi lấy code từ 1 bài trước, sau đó thấy có code mới nhưng ngại dò xem có chỗ nào thay đổi. Nói chung triết lý thì như code dưới đây. Tức đọc dữ liệu 1 lần từ sheet vào mảng sau đó trong vòng FOR thì dò trong mảng thôi.

Mã:
Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant
  Dim Dic As Object, DicTT As Object, Res(), sArr(), aRngTT(), aRng(), S As Variant, key
  Dim i As Long, k As Long

  sArr = tmp.Value
  aRng = Rng.Value
  aRngTT = RngTT.Value
  ReDim Res(LBound(sArr) To UBound(sArr), 1 To 1)

  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRng)
    key = aRng(i, 1)
    If Len(key) Then Dic.Item(LCase(key)) = aRng(i, 2)
  Next i
  Set DicTT = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(aRngTT)
    key = aRngTT(i, 1)
    If Len(key) Then DicTT.Item(LCase(key)) = aRngTT(i, 2)
  Next i
  For k = LBound(sArr) To UBound(sArr)
    If Len(sArr(k, 1)) Then
      S = Split(Application.Trim(sArr(k, 1)), " ")
      For i = LBound(S) To UBound(S)
        key = LCase(S(i))
        If DicTT.exists(key) Then
          S(i) = DicTT.Item(key)
        Else
          If Dic.exists(key) Then S(i) = Dic.Item(key)
        End If
      Next i
      Res(k, 1) = Join(S, " ")
    End If
  Next
  VH = Res
  Set Dic = Nothing: Set DicTT = Nothing
End Function
Bạn batman1 cho mình hỏi cái code bạn sửa không tra được số théo ý mình ví dụ: mình cần tra số 105/16 nếu không có thì nó sẽ trả về là 105/16 thì mới đúng nhưng đây lại trả về 15/16. bạn xem lại hộ mình với. xin cảm ơn rất nhều
 
hàm này không tra được kiểu này: vh("

Bạn batman1 cho mình hỏi cái code bạn sửa không tra được số théo ý mình ví dụ: mình cần tra số 105/16 nếu không có thì nó sẽ trả về là 105/16 thì mới đúng nhưng đây lại trả về 15/16. bạn xem lại hộ mình với. xin cảm ơn rất nhều
Đây không phải code của tôi. Tôi chỉ sửa code cho tốc độ nhanh hơn thôi.

Không phải là code trước khi sửa thì "chạy theo ý" còn sau khi sửa thì "chạy không như ý". Nếu code chạy không như ý thì là ngay từ đầu đã không như ý. Bạn hỏi bạn HieuCD điều này nhé. Vì tôi không tham gia những chủ đề trước của bạn nên chịu không biết nội dung của nó thế nào.
 
cái nay của Bạn HieuCD vẫn ok mà do bạn sửa lại cái code khi nó không tra được thì nó trả về giá trị rò
Nếu bạn đã nói thế thì đính kèm tập tin với code, và nói sau khi chạy thì chỗ nào, cái gì có vấn đề. Với tôi bạn không thể chơi trò nói suông được. Phải có tập tin mới bàn luận được.
 
Nếu bạn đã nói thế thì đính kèm tập tin với code, và nói sau khi chạy thì chỗ nào, cái gì có vấn đề. Với tôi bạn không thể chơi trò nói suông được. Phải có tập tin mới bàn luận được.
Chúc mừng thớt nhé, sau một hồi lòng vòng thớt mới khởi động xong. và giớ mới là vào vạch xuất phát. mà có up file thì up luôn file thât nhá, không chơi mô phỏng. " sao tui nghe như trong lòng chơi vơi..." toàn bộ code và công sức ở phía trên bỏ xó cả rồi.
 
Web KT

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

Back
Top Bottom