Function RealValue : trả về kết quả thực của một biểu thức toán học

Liên hệ QC

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,303
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Ngoài các phép toán thông thường như : Cộng "+", trừ "-", nhân "*", chia "/", lũy thừa, mũ "^". Hàm Realvalue còn hỗ trợ thêm các phép toán như giai thừa "P!", Tổ hợp "nCk", Chỉnh hợp "nAk" với :

Giai thừa : P! = P(n) = 1*2*3*…*n
Tổ hợp : nCk = n!/k!*(n-k)!
Chỉnh hợp :nAk = n!/(n-k)!

VD :
[A1] = 1/2+2/3+3/4+4/5+5/6+6/7+7/8+8/9 +p(10) - c(10,3)
[A2] =RealValue(A1) = 3,628,686.17


PHP:
Function RealValue(Str As String) As Double
Dim i As Long, j As Long, n As Long, k As Long
Dim Giaithua As Double, Tohop As Double, Chinhhop As Double
Application.Volatile (False)
With Application.WorksheetFunction
Str = Replace(Str, " ", "")
If Str = "" Then Exit Function
For i = 1 To Len(Str)
    Select Case UCase(Mid(Str, i, 1))
    Case "P"
        j = InStr(i, Str, ")")
        Giaithua = .Fact(Mid(Str, i + 2, j - i - 2))
        Str = Replace(Str, Mid(Str, i, j - i + 1), Giaithua)
    Case "C"
        j = InStr(i, Str, ",")
        n = Mid(Str, i + 2, j - i - 2)
        k = Mid(Str, j + 1, InStr(j, Str, ")") - j - 1)
        Tohop = .Combin(n, k)
        Str = Replace(Str, Mid(Str, i, InStr(j, Str, ")") - i + 1), Tohop)
    Case "A"
        j = InStr(i, Str, ",")
        n = Mid(Str, i + 2, j - i - 2)
        k = Mid(Str, j + 1, InStr(j, Str, ")") - j - 1)
        Chinhhop = .Fact(k) * .Combin(n, k)
        Str = Replace(Str, Mid(Str, i, InStr(j, Str, ")") - i + 1), Chinhhop)
    End Select
Next
End With
RealValue = Evaluate(Str)
End Function
 

File đính kèm

Theo như tôi thấy thì mấu chốt ở đây chỉ là Evaluate,
- Nếu ý hoangdanh ở đây muốn nói về Evaluate thì e rằng không đầy đủ. Vì Evaluate của VBA không chỉ để thực hiện có mỗi các phép toán thông thường mà nó còn mang nhiều ý nghĩa khác. Ví dụ thử Evaluate("A1"), hay Evaluate("UPPER(A1)") xem nó ra cái gì.
- Còn nếu ý của hoangdanh ở đây muốn xây dựng 1 hàm để thực thi 1 biểu thức toán học thông thường thì tôi thấy có lẽ hoangdanh nên xây dựng hàm để kiểm tra tính hợp lệ của 1 biểu thức toán học thì hợp lý hơn. Vì bản thân Evaluate đã có thể thực hiện được hết rồi. Nếu là tôi xây dựng hàm trên thì tôi sẽ làm đơn giản hơn như thế này. Thay toàn bộ chữ P thành chữ FACT, thay toàn bộ chữ C thành chữ COMBIN, thay toàn bộ chữ A thành chữ FACT nối với phần trong ngoặc của chữ A và nối với chữ COMBIN. Sau khi thay xong thì tôi Evaluate là xong. Dĩ nhiên trong quá trình làm thay đổi từng bước thì cần chú ý 1 chút ở các bước trung gian.
 
Theo như tôi thấy thì mấu chốt ở đây chỉ là Evaluate,
- Nếu ý hoangdanh ở đây muốn nói về Evaluate thì e rằng không đầy đủ. Vì Evaluate của VBA không chỉ để thực hiện có mỗi các phép toán thông thường mà nó còn mang nhiều ý nghĩa khác. Ví dụ thử Evaluate("A1"), hay Evaluate("UPPER(A1)") xem nó ra cái gì.
- Còn nếu ý của hoangdanh ở đây muốn xây dựng 1 hàm để thực thi 1 biểu thức toán học thông thường thì tôi thấy có lẽ hoangdanh nên xây dựng hàm để kiểm tra tính hợp lệ của 1 biểu thức toán học thì hợp lý hơn. Vì bản thân Evaluate đã có thể thực hiện được hết rồi. Nếu là tôi xây dựng hàm trên thì tôi sẽ làm đơn giản hơn như thế này. Thay toàn bộ chữ P thành chữ FACT, thay toàn bộ chữ C thành chữ COMBIN, thay toàn bộ chữ A thành chữ FACT nối với phần trong ngoặc của chữ A và nối với chữ COMBIN. Sau khi thay xong thì tôi Evaluate là xong. Dĩ nhiên trong quá trình làm thay đổi từng bước thì cần chú ý 1 chút ở các bước trung gian.
Chính xác... Nếu là tôi thì tôi cũng làm thế... Chứ For thì biết bao giờ mới hết các trường hợp
Nói đơn giản thôi: Nếu trên máy tính của tôi định dạng dấu thập phân là dấu phẩy, tôi gõ 3,5*2 rồi dùng hàm trên nó cho kết quả #VALUE!
???
 
Em chỉ biết áp dụng thôi, chứ không hiểu gì về ngôn ngữ lập trình. Code của anh HoangDanh đang rất thiết thực với em, nhưng trong Excel của em định dạng dấu thập phân là đấu phẩy nên đã xẩy ra lỗi như anh nói. Em muốn anh sửa lại giúp em với, e đang cần nó lắm. Em cám ơn anh!!!
 
Em chỉ biết áp dụng thôi, chứ không hiểu gì về ngôn ngữ lập trình. Code của anh HoangDanh đang rất thiết thực với em, nhưng trong Excel của em định dạng dấu thập phân là đấu phẩy nên đã xẩy ra lỗi như anh nói. Em muốn anh sửa lại giúp em với, e đang cần nó lắm. Em cám ơn anh!!!

Bạn tham khảo ở đây
http://www.giaiphapexcel.com/forum/...-biểu-thức-biến-chuỗi-biểu-thức-thành-giá-trị
 
Em chỉ biết áp dụng thôi, chứ không hiểu gì về ngôn ngữ lập trình. Code của anh HoangDanh đang rất thiết thực với em, nhưng trong Excel của em định dạng dấu thập phân là đấu phẩy nên đã xẩy ra lỗi như anh nói. Em muốn anh sửa lại giúp em với, e đang cần nó lắm. Em cám ơn anh!!! giúp em vào mail: vuvinh0986567273@mgial.com
 
Em chỉ biết áp dụng thôi, chứ không hiểu gì về ngôn ngữ lập trình. Code của anh HoangDanh đang rất thiết thực với em, nhưng trong Excel của em định dạng dấu thập phân là đấu phẩy nên đã xẩy ra lỗi như anh nói. Em muốn anh sửa lại giúp em với, e đang cần nó lắm. Em cám ơn anh!!! giúp em vào mail: vuvinh0986567273@mgial.com
chỉnh code lại một chút không biết trên máy bạn chạy được không?
Mã:
Function FunVal(FVal As String) As Double
Dim i As Integer, j As Integer, n As Long, k As Long
Application.Volatile (False)
FVal = UCase(FVal)
If FVal = "" Then Exit Function
    FVal = Replace(FVal, "P", "Fact")
    FVal = Replace(FVal, "C", "Combin")
    If InStr(1, FVal, "A") Then
        For i = 1 To Len(FVal)
            If Mid(FVal, i, 1) = "A" Then
                If IsNumeric("1.234.456,789") Then
                    j = InStr(i, FVal, ";")
                Else
                    j = InStr(i, FVal, ",")
                End If
                n = Mid(FVal, i + 2, j - i - 2)
                k = Mid(FVal, j + 1, InStr(j, FVal, ")") - j - 1)
                With Application.WorksheetFunction
                    FVal = Replace(FVal, Mid(FVal, i, InStr(j, FVal, ")") _
                            - i + 1), .Fact(k) * .Combin(n, k))
                End With
            End If
         Next
    End If
FunVal = Evaluate(FVal)
End Function
 
Ngoài các phép toán thông thường như : Cộng "+", trừ "-", nhân "*", chia "/", lũy thừa, mũ "^". Hàm Realvalue còn hỗ trợ thêm các phép toán như giai thừa "P!", Tổ hợp "nCk", Chỉnh hợp "nAk" với :

Giai thừa : P! = P(n) = 1*2*3*…*n
Tổ hợp : nCk = n!/k!*(n-k)!
Chỉnh hợp :nAk = n!/(n-k)!

VD :
[A1] = 1/2+2/3+3/4+4/5+5/6+6/7+7/8+8/9 +p(10) - c(10,3)
[A2] =RealValue(A1) = 3,628,686.17


PHP:
Function RealValue(Str As String) As Double
Dim i As Long, j As Long, n As Long, k As Long
Dim Giaithua As Double, Tohop As Double, Chinhhop As Double
Application.Volatile (False)
With Application.WorksheetFunction
Str = Replace(Str, " ", "")
If Str = "" Then Exit Function
For i = 1 To Len(Str)
    Select Case UCase(Mid(Str, i, 1))
    Case "P"
        j = InStr(i, Str, ")")
        Giaithua = .Fact(Mid(Str, i + 2, j - i - 2))
        Str = Replace(Str, Mid(Str, i, j - i + 1), Giaithua)
    Case "C"
        j = InStr(i, Str, ",")
        n = Mid(Str, i + 2, j - i - 2)
        k = Mid(Str, j + 1, InStr(j, Str, ")") - j - 1)
        Tohop = .Combin(n, k)
        Str = Replace(Str, Mid(Str, i, InStr(j, Str, ")") - i + 1), Tohop)
    Case "A"
        j = InStr(i, Str, ",")
        n = Mid(Str, i + 2, j - i - 2)
        k = Mid(Str, j + 1, InStr(j, Str, ")") - j - 1)
        Chinhhop = .Fact(k) * .Combin(n, k)
        Str = Replace(Str, Mid(Str, i, InStr(j, Str, ")") - i + 1), Chinhhop)
    End Select
Next
End With
RealValue = Evaluate(Str)
End Function
Em dùng tren điện thoại không dùng code được.cám ơn anh
 
Web KT

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

Back
Top Bottom