Hỏi về code so sánh vùng tiêu chuẩn với tiêu chuẩn đưa ra

Liên hệ QC

doanduy

Thành viên mới
Tham gia
25/11/10
Bài viết
12
Được thích
1
mình có một đoạn code sau
function timmaxif(vungmax as range, vungtc as range, tc as string)
dim i as long
dim so
so = 0
if vungmax.rows.count <> vungtc.rows.count then exit function
for i = 1 to vungtc.rows.count
if eval(vungtc.cells(i) & tc)=-1 then
if so<vungmax.cells(i) then so = vungmax.cells(i)
end if
next
timmaxif=so
end function
khi mình down file cell trên mạng có đoạn code này thì file excell này chạy đc. Nhưng khi mình viết trên excel 2003 thì nó báo lỗi từ khoá eval. mình muốn hỏi là có từ khoá nào để so sánh vùng tiêu chuẩn với tiêu chuẩn nếu vùng tiêu chuẩn thoả mãn vùng tiêu chuẩn. thì từ khoá là gì. vi dụ mình muốn đưa tiêu chuẩn là "tên" , "number" ">number" or "<number" thì để so sánh vùng tiêu chuẩn với cái tiêu chuẩn này xem có thoả mãn hay ko thì như thế nào
 
mình có một đoạn code sau
function timmaxif(vungmax as range, vungtc as range, tc as string)
dim i as long
dim so
so = 0
if vungmax.rows.count <> vungtc.rows.count then exit function
for i = 1 to vungtc.rows.count
if eval(vungtc.cells(i) & tc)=-1 then
if so<vungmax.cells(i) then so = vungmax.cells(i)
end if
next
timmaxif=so
end function
khi mình down file cell trên mạng có đoạn code này thì file excell này chạy đc. Nhưng khi mình viết trên excel 2003 thì nó báo lỗi từ khoá eval. mình muốn hỏi là có từ khoá nào để so sánh vùng tiêu chuẩn với tiêu chuẩn nếu vùng tiêu chuẩn thoả mãn vùng tiêu chuẩn. thì từ khoá là gì. vi dụ mình muốn đưa tiêu chuẩn là "tên" , "number" ">number" or "<number" thì để so sánh vùng tiêu chuẩn với cái tiêu chuẩn này xem có thoả mãn hay ko thì như thế nào
File mà bạn download về đâu, cho xem thử
 
Upvote 0
Nếu bạn dùng code này thì làm thêm thao tác sau:
- Vào menu Tools\References
- Check mục "Microsoft Access 11... "

untitled.JPG

Thử lại hàm
Hoặc bạn có thể sửa lại code thành vầy:
PHP:
Function timmaxif(vungmax As Range, vungtc As Range, tc As String)
  Dim so As Long
  If vungmax.Rows.Count <> vungtc.Rows.Count Then Exit Function
  For i = 1 To vungtc.Rows.Count
    If Evaluate(vungtc.Cells(i) & tc) = -1 Then
      If so < vungmax.Cells(i) Then so = vungmax.Cells(i)
    End If
  Next
  timmaxif = so
End Function
Khỏi cần quan tâm đến vụ check gì gì đó trong Tools\References
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn dùng code này thì làm thêm thao tác sau:
- Vào menu Tools\References
- Check mục "Microsoft Access 11... "

View attachment 70165

Thử lại hàm
Hoặc bạn có thể sửa lại code thành vầy:
PHP:
Function timmaxif(vungmax As Range, vungtc As Range, tc As String)
  Dim so As Long
  If vungmax.Rows.Count <> vungtc.Rows.Count Then Exit Function
  For i = 1 To vungtc.Rows.Count
    If Evaluate(vungtc.Cells(i) & tc) = -1 Then
      If so < vungmax.Cells(i) Then so = vungmax.Cells(i)
    End If
  Next
  timmaxif = so
End Function
Khỏi cần quan tâm đến vụ check gì gì đó trong Tools\References
cảm ơn bạn nhiều nha nó chạy đc rồi. nhưng sao no chi nhân tiêu chuẩn ">number" or "<number" mà không nhận giá trị "number" hay "text" muốn nó nhận giá trị tiêu chuẩn là "text" thì phải làm sao hả bạn
 
Upvote 0
cảm ơn bạn nhiều nha nó chạy đc rồi. nhưng sao no chi nhân tiêu chuẩn ">number" or "<number" mà không nhận giá trị "number" hay "text" muốn nó nhận giá trị tiêu chuẩn là "text" thì phải làm sao hả bạn
Cụ thể là TEXT như thế nào, bạn cho file có kèm ví dụ mà bạn muốn tính toán lên đây
 
Upvote 0
Cụ thể là TEXT như thế nào, bạn cho file có kèm ví dụ mà bạn muốn tính toán lên đây
minh chưa upload đc file lên. ví dụ từ A1:A10 là tên người ủng hộ. B1:B10 là tên các phường trong do có những người ở cùng một phuờng. C1:C10 mình để số tiền của từng người ủng hộ. bây h mình muốn tìm nguời ủng hộ cao nhất của một phuờng nào do =timmaxif(C1:C10;B1:B10;"phuong minh tan") ví dụ là phuờng minh tân thì nó rko ra giá trị
 
Upvote 0
Như ban mô tả thì mình tham gia hàm này đỡ tham chiếu phức tạp mà cơ động hơn trong lấy số liệu.
Ví dụ có thể lấy họ tên hoặc số tiền đều được.

Mã:
Option Explicit
Function MaxIf(Rg As Range, Tc As String, Cot As Integer)
Dim Tmp, Kq, i, j
If Cot > Rg.Columns.Count Or Cot < 1 Then
MaxIf = "#Value"
Exit Function
End If
Tmp = Rg
For i = 1 To UBound(Tmp, 1)
If Tmp(i, 2) = Tc And Tmp(i, 3) > Kq Then
j = i
Kq = Tmp(i, 3)
End If
Next
MaxIf = IIf(j > 0, Tmp(j, Cot), "None")
End Function

Cách dùng như trong file ví dụ.
 

File đính kèm

  • MaxIf.xls
    30.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Như ban mô tả thì mình tham gia hàm này đỡ tham chiếu phức tạp mà cơ động hơn trong lấy số liệu.
Ví dụ có thể lấy họ tên hoặc số tiền đều được.

Mã:
Option Explicit
Function MaxIf(Rg As Range, Tc As String, Cot As Integer)
Dim Tmp, Kq, i, j
If Cot > Rg.Columns.Count Or Cot < 1 Then
MaxIf = "#Value"
Exit Function
End If
Tmp = Rg
For i = 1 To UBound(Tmp, 1)
If Tmp(i, 2) = Tc And Tmp(i, 3) > Kq Then
j = i
Kq = Tmp(i, 3)
End If
Next
MaxIf = IIf(j > 0, Tmp(j, Cot), "None")
End Function

Cách dùng như trong file ví dụ.
Mình hiểu ý bạn. nếu trong từng bài toán cụ thể thì mình có thể tạo ra đc các hàm để giải quyết. Nhưng mình đang muốn tạo ra một hàm linh động động hơn giống như hàm sumif và countif có sẵn trong excel rùi. ví dụ như hàm countif nó có thể đếm đc những giá trị mà có critera là "phuong minh tan", hay những giá trị lớn hơn một giá trị nào đó ví dụ như là ">10" hay đếm những giá trị nhỏ hơn một giá trị nào đó như "<10" và cũng có thể đếm những giá trị bàng một giá trị nào đó ví dụ "10" ý mình muốn làm sao để nhận cái cột tiêu chuẩn và tiêu chuẩn đưa ra là phù hợp nhau. ví dụ có bao giá trị thoả mãn cái critera rùi trong bằng đấy giá trị tìm ra giá trị lơn nhất. mà điều kiện có thể là "phuong minh tan",or ">10" or "<10" or "10" nó đều chạy đc

min
 
Upvote 0
Mình hiểu ý bạn. nếu trong từng bài toán cụ thể thì mình có thể tạo ra đc các hàm để giải quyết. Nhưng mình đang muốn tạo ra một hàm linh động động hơn giống như hàm sumif và countif có sẵn trong excel rùi. ví dụ như hàm countif nó có thể đếm đc những giá trị mà có critera là "phuong minh tan", hay những giá trị lớn hơn một giá trị nào đó ví dụ như là ">10" hay đếm những giá trị nhỏ hơn một giá trị nào đó như "<10" và cũng có thể đếm những giá trị bàng một giá trị nào đó ví dụ "10" ý mình muốn làm sao để nhận cái cột tiêu chuẩn và tiêu chuẩn đưa ra là phù hợp nhau. ví dụ có bao giá trị thoả mãn cái critera rùi trong bằng đấy giá trị tìm ra giá trị lơn nhất. mà điều kiện có thể là "phuong minh tan",or ">10" or "<10" or "10" nó đều chạy đc

min
Lại thất nghiệp, nghiên cứu bài này chơi (dựa trên cơ sở của code Filter2DArray)
PHP:
Function MaxIf(ByVal CriteriaArr, ByVal Criteria As String, ByVal MaxArr) As Double
  Dim i As Long, j As Long, n As Long, TmpVal As Double, Res As Double
  Dim tmpCrit, tmpMax, Arr(), Chk As Boolean
  tmpCrit = CriteriaArr: tmpMax = MaxArr
  On Error Resume Next
  Res = -(9.99999999999999E+307)
  Chk = (InStr("><=", Left(Criteria, 1)) > 0)
  For i = LBound(tmpCrit, 1) To UBound(tmpCrit, 1)
    For j = LBound(tmpCrit, 2) To UBound(tmpCrit, 2)
      If Chk And Criteria <> "" Then
        TmpVal = CDbl(tmpCrit(i, j))
        If Evaluate(TmpVal & Criteria) Then
          n = n + 1
          If Res < tmpMax(i, j) Then Res = tmpMax(i, j)
        End If
      Else
        If UCase(tmpCrit(i, j)) Like UCase(Criteria) Then
          n = n + 1
          If Res < tmpMax(i, j) Then Res = tmpMax(i, j)
        End If
      End If
    Next
  Next
  If n > 0 Then MaxIf = Res
End Function
Hàm này hoạt động với range hay array đều được (bất kế vùng dữ liệu theo chiều ngang hay dọc)... Có thể lọc theo điều kiện chính xác hoặc gần đúng (gần giống như Filter)
Mời xem file (nhân tiện tặng luôn bạn hàm MinIf với code tương tự)
Bạn vui lòng kiểm tra độ chính xác và phản hồi ý kiến cho tôi biết nếu thấy có điều gì chưa ổn nha!
 

File đính kèm

  • MaxIf&MinIf_01.xls
    85.5 KB · Đọc: 14
Upvote 0
Lại thất nghiệp, nghiên cứu bài này chơi (dựa trên cơ sở của code Filter2DArray)
PHP:
Function MaxIf(ByVal CriteriaArr, ByVal Criteria As String, ByVal MaxArr) As Double
  Dim i As Long, j As Long, n As Long, TmpVal As Double, Res As Double
  Dim tmpCrit, tmpMax, Arr(), Chk As Boolean
  tmpCrit = CriteriaArr: tmpMax = MaxArr
  On Error Resume Next
  Res = -(9.99999999999999E+307)
  Chk = (InStr("><=", Left(Criteria, 1)) > 0)
  For i = LBound(tmpCrit, 1) To UBound(tmpCrit, 1)
    For j = LBound(tmpCrit, 2) To UBound(tmpCrit, 2)
      If Chk And Criteria <> "" Then
        TmpVal = CDbl(tmpCrit(i, j))
        If Evaluate(TmpVal & Criteria) Then
          n = n + 1
          If Res < tmpMax(i, j) Then Res = tmpMax(i, j)
        End If
      Else
        If UCase(tmpCrit(i, j)) Like UCase(Criteria) Then
          n = n + 1
          If Res < tmpMax(i, j) Then Res = tmpMax(i, j)
        End If
      End If
    Next
  Next
  If n > 0 Then MaxIf = Res
End Function
Hàm này hoạt động với range hay array đều được (bất kế vùng dữ liệu theo chiều ngang hay dọc)... Có thể lọc theo điều kiện chính xác hoặc gần đúng (gần giống như Filter)
Mời xem file (nhân tiện tặng luôn bạn hàm MinIf với code tương tự)
Bạn vui lòng kiểm tra độ chính xác và phản hồi ý kiến cho tôi biết nếu thấy có điều gì chưa ổn nha!
tuyệt quá ta đúng ý tưởng mình đang muốn tạo ra. cảm ơn bạn nhiều nha! mình mầy mãi mà chưa làm đc. cái này nhận tất cả các critera. ko trừ cái nào cả
 
Upvote 0
tuyệt quá ta đúng ý tưởng mình đang muốn tạo ra. cảm ơn bạn nhiều nha! mình mầy mãi mà chưa làm đc. cái này nhận tất cả các critera. ko trừ cái nào cả
Vẫn còn 1 vài lỗi đấy bạn à
- Vùng dữ liệu là 1 cell duy nhất ---> Kết quả sai
- Dữ liệu đầu vào là mảng 1 chiều ---> Kết quả sai
------------------
Vụ 1 cell duy nhất ta chỉnh code không khó, riêng vụ mảng 1 chiều thì hơi nhức đầu (chưa nghĩ ra cách)
Càng tiện cho người sử dụng, càng tổng quát thì code càng.. mệt mỏi
Để tiếp tục nghiên cứu xem ---> Các cao thủ khác giúp tôi 1 tay nhé
 
Upvote 0
Web KT
Back
Top Bottom