Cần giúp đỡ sửa hàm UDF (Tìm vị trí lần xảy ra thứ n trong dãy) (1 người xem)

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

vietdieu

Thành viên mới
Tham gia
13/1/12
Bài viết
6
Được thích
1
Mình có một UDF để tìm vị trí số được lặp lại lần thứ n trong một range, nó sẽ tìm đúng vị trí và offset row và col để tìm ra vị trí tương ứng, hàm này trả kết quả đúng nhưng chỉ với điều kiện format các cell phải là bình thường như khi chưa format, nếu có format (number, $,..) thì sẽ báo lỗi. Mong bạn nào cao tay sửa giúp với để cho hàm khi tìm không quan tâm đến format của từng cell trong dãy tìm kiếm. Cảm ơn rất nhiều:

Link


Function FINDNTHOCC(range_look As Range, find_it As String, occurrence As Long, offset_row As Long, offset_col As Long)

Dim lCount As Long
Dim rFound As Range

Set rFound = range_look.Cells(1, 1)
For lCount = 1 To occurrence
Set rFound = range_look.Find(find_it, rFound, xlValues, xlWhole)
Next lCount

FINDNTHOCC = rFound.Offset(offset_row, offset_col)

End Function
 
Mình có một UDF để tìm vị trí số được lặp lại lần thứ n trong một range, nó sẽ tìm đúng vị trí và offset row và col để tìm ra vị trí tương ứng, hàm này trả kết quả đúng nhưng chỉ với điều kiện format các cell phải là bình thường như khi chưa format, nếu có format (number, $,..) thì sẽ báo lỗi. Mong bạn nào cao tay sửa giúp với để cho hàm khi tìm không quan tâm đến format của từng cell trong dãy tìm kiếm. Cảm ơn rất nhiều:

Link


Function FINDNTHOCC(range_look As Range, find_it As String, occurrence As Long, offset_row As Long, offset_col As Long)

Dim lCount As Long
Dim rFound As Range

Set rFound = range_look.Cells(1, 1)
For lCount = 1 To occurrence
Set rFound = range_look.Find(find_it, rFound, xlValues, xlWhole)
Next lCount

FINDNTHOCC = rFound.Offset(offset_row, offset_col)

End Function
Vậy thì bạn đừng dùng FIND, cứ For.. Next bình thường đi
 
File của bạn với những lời này:
"Mình có một UDF để tìm vị trí số được lặp lại lần thứ n trong một range, nó sẽ tìm đúng vị trí và offset row và col để tìm ra vị trí tương ứng,"
Chưa ăn nhập gì với nhau cả;

Chả thấy số lần lặp lại là như thế nào cả?

& mình cho là hàm có vấn đề cần tu bổ, chí ít là tiểu tu
 
Ngay cả nếu không tính tường hợp format thì hàm này vẫn sai.
Nó thiếu ít nhất là 2 chỗ:
1. Thoát nếu không tìm được, hiện tại thì nó crashes
2. Xét xem find có bị vòng lại hay không. Nếu số lần lặp lại cần tìm (n) lớn hơn số lần lặp lại thực tế (count) thì nó tìm ra MOD(n,count)
 
Có lẽ các bạn hiểu sai hàm này. Mình xin ví dụ cho dễ hiểu:

A1:A7 có những giá trị như sau {5,4,3,5,7,3,88}
B1:B7 = {Red,Green,Brown,Yellow,Violet,Purple,Orange}
C1 = 5

FINDNTHOCC(A1:A7,C1,2,0,1) có nghĩa là tìm vị trí số lần xuất hiện thứ 2 của C1 (=5) trong dãy A1:A7, thấy vị trí đó rồi chuyển sang 0 row và 1 col có nghĩa là vẫn giữ ở row đó rồi dịch sang 1 cột như vậy sẽ cho ra "Yellow".

Tuy nhiên nếu format trong A1:A7 chỉ cần thay đổi là number và có 1 số sau dấu phẩy hay 1 cell là text thì sẽ báo lỗi.

Rất mong các bác giúp cho. Cảm ơn nhiều!!
 
Tôi không hiểu sai. Trong ví dụ trên FINDNTHOCC(a1:a7,c1,3,0,1) sẽ cho ra "Red".

vả lại, trong câu trả lời số #2, người ta đã nói với bạn là phương thức Find không làm được (hoặc rất rắc rối) rồi.
 
Lần chỉnh sửa cuối:
Trong 1 thủ tục hàm người dùng, ta không thể xài FINDNEXT()
Tuy rằng trong cửa sổ trung gian vẫn cho kết quả tìm kiếm của FINDNEXT()
Nhưng hiện hay đưa ra trang tính thì không được.

Chủ topic cần đưa file với đầy đủ số liệu hơn; Chúng ta sẽ khẳng định với nhau fương thức FIND() trong trường hợp này sẽ thực hiện được hay không & thực hiện bằng cách nào.

Trân trọng!
 
Đây là cách xài FIND() trong hàm tự tạo

PHP:
Option Explicit
Function FINDNTHOCC(Rng As Range, Val As Integer, Lan As Byte, Rw As Long, Col As Byte)
 Dim sRng As Range, Rg0 As Range, Cls As Range
 Dim Num As Byte
 On Error GoTo LoiCT
 Set sRng = Rng.Find(Val, , xlFormulas, xlWhole)
 
 If Not sRng Is Nothing Then
1    Set Rg0 = Range(sRng, Rng(1).Offset(Rng.Rows.Count))
    MsgBox Rg0.Address, Rg0.Cells.Count
3    For Each Cls In Rg0
        If Cls.Value = Val Then Num = Num + 1
5        If Num = Lan Then
            FINDNTHOCC = Cls.Offset(Rw, Col).Value
            Exit For
        End If
    Next Cls
 End If
Err_:               Exit Function
LoiCT:
    MsgBox Error(), , Erl
    Resume Err_
End Function
 

File đính kèm

Cảm ơn bạn HYen17, chạy ngon rồi. Thế này là biết có người giỏi lúc cần rồi :)
 
Hàm này vấp phải một vấn đề là không tự động tính toán lại như các hàm khác của Excel. Rõ ràng là nó tìm được Yellow nhưng nếu bạn đổi Yellow thành giá trị khác thì nó lại không tính ngay được, chỉ có cách là đóng workbook vào và mở lại thì nó mới tính update được.

Liệu có cách nào để nó tự động tính toán như hàm của Excel không. Nhờ bạn chỉ giúp với. Vô cùng cảm ơn!
 
Hàm này không tự động tính toán lại như các hàm khác của Excel. Rõ là nó tìm được Yellow nhưng nếu đổi Yellow thành giá trị khác thì nó lại không tính ngay được, mà fải {ENTER} trong ô đang chứa hàm tự tạo.
 
Hàm này vấp phải một vấn đề là không tự động tính toán lại như các hàm khác của Excel. Rõ ràng là nó tìm được Yellow nhưng nếu bạn đổi Yellow thành giá trị khác thì nó lại không tính ngay được, chỉ có cách là đóng workbook vào và mở lại thì nó mới tính update được.

Liệu có cách nào để nó tự động tính toán như hàm của Excel không. Nhờ bạn chỉ giúp với. Vô cùng cảm ơn!

Thêm dòng Application.Volatile vào dưới dòng On Error... là được
Hoặc sửa hàm thành vầy:
Mã:
Function FINDNTHOCC(ByVal range_look As Range, ByVal find_it As String, ByVal occurrence As Long, _
                    ByVal offset_row As Long, ByVal offset_col As Long)
  Dim rFound As Range
  Dim lCount As Long
  lCount = occurrence
  For Each rFound In range_look
    If CStr(rFound.Value) = find_it Then
      lCount = lCount - 1
      If lCount = 0 Then FINDNTHOCC = rFound.Offset(offset_row, offset_col).Value
    End If
  Next
End Function
 
Lần chỉnh sửa cuối:
Chạy ngon rồi, cảm ơn bạn nhiều. Còn một điều nữa không biết làm thế nào để nó báo lỗi là không tìm được, có nghĩa hoặc là không có, hoặc là bắt nó tìm lần thứ n mà thực ra có ít hơn n lần xuất hiện.

Mình thử nghiệm hàm này trên một table có formulas thì nó lại báo lỗi không tìm được. Hơn nữa hàm này không tìm được text. Nhờ bạn xem giúp.

Cảm ơn nhiều!

Link
 
Lần chỉnh sửa cuối:
Chạy ngon rồi, cảm ơn bạn nhiều. Còn một điều nữa không biết làm thế nào để nó báo lỗi là không tìm được, có nghĩa hoặc là không có, hoặc là bắt nó tìm lần thứ n mà thực ra có ít hơn n lần xuất hiện.

Mình thử nghiệm hàm này trên một table có formulas thì nó lại báo lỗi không tìm được. Hơn nữa hàm này không tìm được text. Nhờ bạn xem giúp.

Cảm ơn nhiều!

Link

Cả 2 vấn đề trên tôi đều đưa ra từ đầu. Do bạn cứ nghĩ rằng tôi hiểu sai cho nên bạn bỏ qua không lý đến.
 

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

Back
Top Bottom