Hỏi về sự khác nhau giữa 2 công thức với ABS()

Liên hệ QC

ngocmaipretty

Thành viên tiêu biểu
Tham gia
3/3/08
Bài viết
511
Được thích
1,308
Giới tính
Nữ
Xin cho hỏi 2 công thức mảng sau có chỗ nào khác nhau, mà ra kết quả khác nhau:
1. Công thức này cho kết quả là hiệu nhỏ nhất giữa 2 số bất kỳ trong mảng C5:C9: (sưu tầm)

=MIN(IF( (C5:C9 - TRANSPOSE(C5:C9)) < 0; ABS(C5:C9 - TRANSPOSE(C5:C9) ) ) )

2. Công thức này lẽ ra thì tương đương nhưng luôn cho giá trị zero:

=MIN(ABS(C5:C9 - TRANSPOSE(C5:C9) ) )

Xin cám ơn trước.

Ngọc Mai
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cả 2 công thức trên đều tính min của 1 mảng 2 chiều 5 x 5 = 25 phần tử

- Công thức 2: Trong các phần tử tồn tại các giá trị zero khi 1 số nào đó trừ cho chính nó.

- Công thức 1: Cũng như trên nhưng loại bỏ các trường hợp zero và dương, các trường hợp zero và dương bị thay thế bằng False vì If cụt (thiếu giá trị để gán khi logical expression = False)

Cũng có thể chỉ loại các trường hợp zero, hoặc loại zero và âm nếu dùng dấu <>0 hoặc >0 trong công thức. Miễn làm sao loại zero ra là được.

Note: Công thức 1 chỉ đúng khi không có số nào trong dãy sô bị trùng (nghĩa là có 2 hoặc nhiều số trùng nhau). Trong trường hợp đó kết quả phải bằng zero vì zero là hiệu nhỏ nhất của 2 số bất kỳ.
 
Lần chỉnh sửa cuối:
Note: Công thức 1 chỉ đúng khi không có số nào trong dãy sô bị trùng (nghĩa là có 2 hoặc nhiều số trùng nhau). Trong trường hợp đó kết quả phải bằng zero vì là hiệu nhỏ nhất của 2 số bất kỳ.

Vậy làm cách nào cho tổng quát hả huynh? Dùng công thức hay là phải xài UDF như trong topic này? Và nếu không phải 1 dòng hoặc 1 cột đơn lẻ thì làm sao?

VBA (UDF) thì muội mù tịt!
PHP:
Function MinofDiff(Rng)
Dim ArrRng
Dim TempDiff
    Set ArrRng = Rng
    MinofDiff = Application.Max(ArrRng)
    For i = 1 To ArrRng.Count - 1
        For j = i + 1 To ArrRng.Count
            TempDiff = Abs(ArrRng(i) - ArrRng(j))
            MinofDiff = Application.Min(TempDiff, MinofDiff)
Next: Next
End Function
 
Lần chỉnh sửa cuối:
Vậy làm cách nào cho tổng quát hả huynh? Dùng công thức hay là phải xài UDF như trong topic này? Và nếu không phải 1 dòng hoặc 1 cột đơn lẻ thì làm sao?

[/php]
Công thức cũng có thể đấy ---> Tuy nhiên phải xét xem trong dảy số có trùng hay không?
PHP:
=IF(SUMPRODUCT(1/COUNTIF(Rng,Rng))=COUNT(Rng),MIN(IF(Rng-TRANSPOSE(Rng)>0,Rng-TRANSPOSE(Rng),"")),0)
Hơi dài ---> Không biết còn cách nào ngắn hơn không ta
???
 

File đính kèm

Lần chỉnh sửa cuối:
ngocmaipretty đã viết:
Và nếu không phải 1 dòng hoặc 1 cột đơn lẻ thì làm sao?

Nếu không phải 1 dòng hay 1 cột đơn lẻ, mà là MinOfDifferences của 1 mảng 2 chiều, thì áp dụng thuật toán chuyển 2 chiều thành 1 chiều rồi tính.
(Cũng dùng UDF)

PHP:
Option Base 1
Function MinofDiff(Rng As Range)
Dim Amt, TempDiff As Double, iRow As Integer, iRows As Integer
Dim jCol As Integer, jCols As Integer, TempArr

    iRows = Rng.Rows.Count
    jCols = Rng.Columns.Count
    Amt = iRows * jCols
    ReDim TempArr(1 To Amt, 1)

For k = 1 To Amt
    iRow = Int(k / (jCols + 0.001)) + 1
    jCol = k - (iRow - 1) * jCols
    TempArr(k, 1) = Rng(iRow, jCol)
Next

MinofDiff = Application.Max(TempArr)
For i = 1 To Amt - 1
    For j = i + 1 To Amt
        TempDiff = Abs(TempArr(i, 1) - TempArr(j, 1))
        MinofDiff = Application.Min(TempDiff, MinofDiff)
Next: Next
End Function
 
Web KT

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

Back
Top Bottom