Thêm hàm mới để tìm giá trị lớn hơn 1 giá trị cho trước và nhỏ nhất bằng VBA.

Liên hệ QC

diemngoc.ts

Thành viên mới
Tham gia
1/8/18
Bài viết
16
Được thích
0
Mọi người cho mình hỏi mình muốn thêm hàm mới để tìm giá trị lớn hơn 1 giá trị cho trước và nhỏ nhất bằng VBA, nhưng nó cứ trả về giá trị lớn nhất, chứ không phải giá trị nhỏ nhất, mong mọi người giúp đỡ ạ.
Function gt(dauvao)
Application.ScreenUpdating = False
Sheets("sheet1").Activate
Set giatri_cell = Range("B1")
m = Cells(Rows.Count, "B").End(xlUp).Row - 1
giatri = giatri_cell.Offset(1, 0)
For k = 1 To m
If giatri_cell.Offset(k, 0) > dauvao Then gt = giatri_cell.Offset(k, 0)
Next k
End Function
 

File đính kèm

  • gia.xlsx
    10.3 KB · Đọc: 16
Mọi người cho mình hỏi mình muốn thêm hàm mới để tìm giá trị lớn hơn 1 giá trị cho trước và nhỏ nhất bằng VBA, nhưng nó cứ trả về giá trị lớn nhất, chứ không phải giá trị nhỏ nhất, mong mọi người giúp đỡ ạ.
Function gt(dauvao)
Application.ScreenUpdating = False
Sheets("sheet1").Activate
Set giatri_cell = Range("B1")
m = Cells(Rows.Count, "B").End(xlUp).Row - 1
giatri = giatri_cell.Offset(1, 0)
For k = 1 To m
If giatri_cell.Offset(k, 0) > dauvao Then gt = giatri_cell.Offset(k, 0)
Next k
End Function
Cái hàm này trên máy Bạn nó trả về được kết quả là may quá rồi. Máy mình nó ra cái gì ấy :p:p:p
 
Upvote 0
Mọi người cho mình hỏi mình muốn thêm hàm mới để tìm giá trị lớn hơn 1 giá trị cho trước và nhỏ nhất bằng VBA, nhưng nó cứ trả về giá trị lớn nhất, chứ không phải giá trị nhỏ nhất, mong mọi người giúp đỡ ạ.
Function gt(dauvao)
Application.ScreenUpdating = False
Sheets("sheet1").Activate
Set giatri_cell = Range("B1")
m = Cells(Rows.Count, "B").End(xlUp).Row - 1
giatri = giatri_cell.Offset(1, 0)
For k = 1 To m
If giatri_cell.Offset(k, 0) > dauvao Then gt = giatri_cell.Offset(k, 0)
Next k
End Function
Có cần thiết phải VBA không vậy? Dùng công thức cũng được mà:
Mã:
=IFERROR(INDEX($B$2:$B$85,MATCH(E2,$B$2:$B$84,1)+1),0)
 
Upvote 0
Cái hàm này trên máy Bạn nó trả về được kết quả là may quá rồi. Máy mình nó ra cái gì ấy :p:p:p
Dạ máy tính em ra là 83 ạ, nhưng kết quả phải là 28.
Bài đã được tự động gộp:

Có cần thiết phải VBA không vậy? Dùng công thức cũng được mà:
Mã:
=IFERROR(INDEX($B$2:$B$85,MATCH(E2,$B$2:$B$84,1)+1),0)
Dạ e muốn viết thành hàm rồi sau này dùng luôn cho gọn ạ, vì em rât shay dùng nó.
 
Upvote 0
Dạ máy tính em ra là 83 ạ, nhưng kết quả phải là 28.
Bài đã được tự động gộp:


Dạ e muốn viết thành hàm rồi sau này dùng luôn cho gọn ạ, vì em rât shay dùng nó.
Nếu giá trị cột đã được sắp xếp như trong bài thì:
1) Dùng hàm MATCH
2) Dùng VBA như của bạn thì khi kiếm được giá trị lới hơn "dauvao" thì gán kết quả và thoát luôn Function
Mã:
If giatri_cell.Offset(k, 0) > dauvao Then gt = giatri_cell.Offset(k, 0): Exit Function
Thân
 
Upvote 0

File đính kèm

  • gia.xlsm
    16.9 KB · Đọc: 7
Upvote 0
Nếu giá trị cột đã được sắp xếp như trong bài thì:
1) Dùng hàm MATCH
2) Dùng VBA như của bạn thì khi kiếm được giá trị lới hơn "dauvao" thì gán kết quả và thoát luôn Function
Mã:
If giatri_cell.Offset(k, 0) > dauvao Then gt = giatri_cell.Offset(k, 0): Exit Function
Thân
Nếu dữ liệu đã được sắp xếp thì tìm theo nhị phân. Nếu không theo nhị phân thì thà làm hàm match nhanh hơn (hàm match dữ liệu sắp xếp tìm theo nhị phân)
 
Upvote 0
Nếu dữ liệu đã được sắp xếp thì tìm theo nhị phân. Nếu không theo nhị phân thì thà làm hàm match nhanh hơn (hàm match dữ liệu sắp xếp tìm theo nhị phân)
Giữ lại nguyên vẹn code của bạn ấy là để giải thích cho bạn ấy biết vì sao code luôn cho kết qủa là giá trị lớn nhất thôi
 
Upvote 0
Có cần thiết phải VBA không vậy? Dùng công thức cũng được mà:
Mã:
=IFERROR(INDEX($B$2:$B$85,MATCH(E2,$B$2:$B$84,1)+1),0)
Hàm này sẽ ra 0 (kết quả sai) nếu số cần tìm là số đầu tiên trong mảng.

Giữ lại nguyên vẹn code của bạn ấy là để giải thích cho bạn ấy biết vì sao code luôn cho kết qủa là giá trị lớn nhất thôi
Nếu bạn giữ lại code tác giả thì có đến 2 cách:
1. exit for khi gặp đúng số (cách bạn đã nêu)
2. xét ngược từ lớn trở lại nhỏ: For k = m To 1 Step -1
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em cảm ơn mội người đã giúp đỡ, em đã viết được hàm như mong muốn, hàm của em:

Function gt(dauvao)
Application.ScreenUpdating = False
Sheets("dulieu").Activate
Set giatri_cell = Range("B1")
m = Cells(Rows.Count, "B").End(xlUp).Row - 1
gt = giatri_cell.Offset(1, 0)
For k = 1 To m
If giatri_cell.Offset(k, 0) > dauvao Then Exit Function
gt = giatri_cell.Offset(k + 1, 0)
Next k
End Function

Tuy nhiên có 1 vấn đề là dữ liệu em cần tra ở sheet("dulieu") và muốn dùng hàm gt(dauvao) để tính trên tất cả các sheet còn lại, còn hiện tài cái hàm em viết lại chỉ tính được trên mỗi sheet("dulieu") còn dùng nó cho các sheet khác cứ trả về kết quả là 0, mọi người có thể hướng dẫn em thêm chỗ này được không ạ, Em cảm ơn mọi người ạ.
 

File đính kèm

  • bangtinhthang.xls
    44 KB · Đọc: 4
Upvote 0
Dạ em cảm ơn mội người đã giúp đỡ, em đã viết được hàm như mong muốn, hàm của em:

Function gt(dauvao)
Application.ScreenUpdating = False
Sheets("dulieu").Activate
Set giatri_cell = Range("B1")
m = Cells(Rows.Count, "B").End(xlUp).Row - 1
gt = giatri_cell.Offset(1, 0)
For k = 1 To m
If giatri_cell.Offset(k, 0) > dauvao Then Exit Function
gt = giatri_cell.Offset(k + 1, 0)
Next k
End Function

Tuy nhiên có 1 vấn đề là dữ liệu em cần tra ở sheet("dulieu") và muốn dùng hàm gt(dauvao) để tính trên tất cả các sheet còn lại, còn hiện tài cái hàm em viết lại chỉ tính được trên mỗi sheet("dulieu") còn dùng nó cho các sheet khác cứ trả về kết quả là 0, mọi người có thể hướng dẫn em thêm chỗ này được không ạ, Em cảm ơn mọi người ạ.
Từ khi vào diễn đàn mình thấy Bạn là người đầu tiên viết hàm kiểu này đấy :p:p:p
 
Upvote 0
Mình có 1 cắt cớ:
Nếu tìm chuỗi lớn hơn & gần với "XXX" nhất thì hàm fải viết làm sao ta?
 
Upvote 0
Upvote 0
Vì diễn đàn này hầu hết mọi người học code từ 1 nguồn chung cho nên bạn thấy lạ.
Kiểu duyệt vòng lặp trong code này là kiểu cổ điển của COBOL.
Dạ ý em là cách truyền dữ liệu vào hàm của Bạn ấy ạ. Nó cứng như 1 cái Sub hì hì
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Web KT
Back
Top Bottom