đề nghị giúp tạo hàm dò tìm vị trí

  • Thread starter Thread starter adua29
  • Ngày gửi Ngày gửi
Liên hệ QC

adua29

Real-life Girls Super Сasual Dating
Tham gia
29/4/08
Bài viết
156
Được thích
111
Giới tính
Nam
Nghề nghiệp
Health
Mình có một bài toán lại chưa biến cách viết hàm trong VBA
Xin nhờ mọi người tạo cho mình một hàm tìm kiếm như sau:

Có một hàng chứa các giá trị ngày tháng không liên tục tăng dần từ trái qua phải

Một giá trị ngày tháng trong khoảng giá trị ngày tháng lớn nhất và nhỏ nhất của hàng trên và không trùng với bất kỳ giá trị ngày tháng có trong hàng.

Mình cần một hàm như sau

=vitri(ngày tìm kiếm; vùng tìm kiếm; giá trị điều kiện)

cho kết quả như sau:

- là vị trí của ngày trong vùng tìm kiếm có giá trị nhỏ hơn và gần nhất so với ngày tìm kiếm nếu giá trị điều kiện bằng 1

và cho kết quả là vị trí của ngày trong vùng tìm kiếm có giá trị nhỏ hơn và gần thứ 2 so với ngày tìm kiếm nếu giá trị điều kiện bằng 2.

Hàm này gần giống với hàm MATCH(lookup_value;lookup_array;match_type) trong Excel.

Mong mọi người chung tay giúp mình, mình xin cảm ơn.
 
Hàm tự tạo của bạn đây, xin mời

Những chú í trước khi dùng:

(1) Dữ liệu chứa ngày phải có dạng mm/dd/yyyy
Nều không phải vậy thì chúng ta sẽ tính sau.

(2) Dữ liệu ngày không cần phải xếp theo trật tự nào hết; Có thể trùng nhau
Trong trường hợp trùng vị trí 1 vài ba giá trị, nhưng cần tìm vị trí thứ hai thì hàm trả về sẽ nhỏ hơn ngày trùng này
(Nếu iêu cầu khác hơn thì chúng ta sẽ viết khác hơn)

(3) Hàm có thể tìm trong 1 vùng dữ liệu ngày gồm nhiều hàng & nhiều cột.


PHP:
Option Explicit
Function ViTri(Dat As Date, dRng As Range, Optional Bac As Byte = 2)
 Dim sRng As Range
 
 Set sRng = dRng.Find(Dat, , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then Dat = Dat - 1
 Do
   Dat = Dat - 1
   Set sRng = dRng.Find(Dat)
   If Not sRng Is Nothing Then
      If Bac = 1 Then
         ViTri = sRng.Value
         Exit Function
      Else
         Exit Do
      End If
   End If
 Loop
 Do
   Dat = Dat - 1
   Set sRng = dRng.Find(Dat)
   If Not sRng Is Nothing Then
      ViTri = sRng.Value:           Exit Function
   End If
 Loop
End Function
 
Upvote 0
Hàm theo yêu cầu của adua29
VungTim là 1 hàng chứa các giá trị ngày tháng không liên tục tăng dần từ trái qua phải
NgayTim là giá trị ngày tháng trong khoảng giá trị ngày tháng lớn nhất và nhỏ nhất của VungTim và không trùng với bất kỳ giá trị ngày tháng có VungTim.
Hàm trả về số thứ tự ô (>=1) trong VungTim nếu có.
Hàm trả về 0:không tìm thấy hoặc NgayTim không thỏa các yêu cầu trên.
Mã:
Function ViTri(NgayTim As Date, VungTim As Range, DieuKien As Byte) As Long
Dim n As Long
If VungTim.Rows.Count > 1 Then Exit Function
For Each cell In VungTim
  If cell.Value >= NgayTim Then
    If cell = NgayTim Then Exit Function
    If DieuKien = 1 Then
      ViTri = n
    ElseIf DieuKien = 2 Then
      If n > 1 Then ViTri = n - 1
    End If
    Exit For
  End If
  n = n + 1
Next
End Function
 
Upvote 0
Hàm theo yêu cầu của adua29
VungTim là 1 hàng chứa các giá trị ngày tháng không liên tục tăng dần từ trái qua phải
NgayTim là giá trị ngày tháng trong khoảng giá trị ngày tháng lớn nhất và nhỏ nhất của VungTim và không trùng với bất kỳ giá trị ngày tháng có VungTim.
Hàm trả về số thứ tự ô (>=1) trong VungTim nếu có.
Hàm trả về 0:không tìm thấy hoặc NgayTim không thỏa các yêu cầu trên.

Vậy hàm sẽ có nội dung sau:

PHP:
Option Explicit
Function ViTri(Dat As Date, dRng As Range, Optional Bac As Byte = 2)
 Dim sRng As Range, Clls As Range
 Dim Dem As Byte, Ngay As Date
 
 Set sRng = dRng.Find(Dat, , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then Dat = Dat - 1
 Do
   Dem = Dem + 1
   Ngay = Dat - Dem
   Set sRng = dRng.Find(Ngay)
   If Not sRng Is Nothing Then
      Exit Do
   End If
   If Dem = dRng.Cells.Count Then
      ViTri = 0:        Exit Function
   End If
 Loop
 For Each Clls In dRng
   ViTri = ViTri + 1
   If Clls.Value = Ngay Then
      ViTri = ViTri - Bac:    Exit Function
   End If
 Next Clls
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
xin cảm ơn các bạn, mình sử dụng hàm của bạn SA_DQ thì VBA thông báo lỗi ở dòng thứ 2
mình đã chạy hàm của bạn phamduylong chạy ổn định mình xin cảm ơn.
 
Upvote 0
Các bạn giúp mình lập thêm một hàm này nhé

Có một hàng gồm các ô có chứa dữ liệu số (có giá trị >1) hoặc không chứa dữ liệu số (hoặc có giá trị = 0) gọi là vungtimkiem (ô đầu tiên luôn có dữ liệu)

mình cần một hàm như sau:

=giatri(vungtimkiem;n;dieukien)

cho kết quả là:

- giá trị của ô chứa dữ liệu gần nhất phía bên trái ô thứ n trong vungtimkiem nếu dieukien bằng 1
(ô đầu tiên phía bên trái trong vungtimkiem là ô thứ 1)

- giá trị của ô chứa dữ liệu gần thứ 2 phía bên trái ô thứ n trong vungtimkiem nếu dieukien bằng 2
(ô đầu tiên phía bên trái trong vungtimkiem là ô thứ 1)

- giá trị ô đầu tiên trong vùng tìm kiếm nếu 2 kết quả trên có giá trị bằng không.
 
Upvote 0
Viết hàm theo yêu cầu của adua29 (bài 5)
Hàm cho kết quà=0 khi:
- DieuKien<1 hoặc DieuKien>2
- n=0 hoặc n> số ô của VungTim

Mã:
Function GiaTri(VungTim As Range, n As Double, DieuKien As Byte) As Long
If VungTim.Rows.Count > 1 Or n > VungTim.Cells.Count Then Exit Function
If DieuKien = 1 Or DieuKien = 2 Then
  n = n - DieuKien
  If n > 0 Then
    GiaTri = Application.WorksheetFunction.Index(VungTim, 1, n)
    If GiaTri = 0 Then GiaTri = VungTim.Cells(1)
  Else
    GiaTri = VungTim.Cells(1)
  End If
End If
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom