Có hàm nào trong VBA tính được giá trị của 1 biểu thức không?

Liên hệ QC

bkxd98

Thành viên mới
Tham gia
2/8/06
Bài viết
15
Được thích
26
VD : có một biểu thức "6/3+2*(4-1)"
Xin hỏi các bác có hàm nào của VBA tính được giá trị của biểu thức trên không ?
Tôi đang viết 1 function, ban đầu có ý định gán 1 cell trong excel có công thức (formula) như trên rồi lấy giá trị tính (value) của nó, nhưng dòng lệch gán 1 biểu thức cho 1 cell không có tác dụng trong function.
Thanks.
 
VD : có một biểu thức "6/3+2*(4-1)"
Xin hỏi các bác có hàm nào của VBA tính được giá trị của biểu thức trên không ?
Tôi đang viết 1 function, ban đầu có ý định gán 1 cell trong excel có công thức (formula) như trên rồi lấy giá trị tính (value) của nó, nhưng dòng lệch gán 1 biểu thức cho 1 cell không có tác dụng trong function.
Thanks.

cần gì phải dùng đao to búa lớn (VBA) để tính
sao không thêm dấu = trước biểu thức của bạn =6/3+2*(4-1) ra kết quả là 8 luôn
 
Upvote 0
cần gì phải dùng đao to búa lớn (VBA) để tính
sao không thêm dấu = trước biểu thức của bạn =6/3+2*(4-1) ra kết quả là 8 luôn

Chắc bác Boyxin chưa gặp trường hợp nào như này. Nếu thêm "=" thì làm thủ công đến bao giờ xong. Hơn nữa rõ ràng là đã có phép tính rồi chỉ cần lập 1 hàm xử lý là xong. Mình ngiên cứu excel là để xử dụng trong lúc này, bác thầy có đúng ko?

Mình cũng gặp trường hợp như bạn, nhưng hiện tại cũng đang loay hoay chưa ra. Mong các bạn giúp đỡ
 
Upvote 0
Chắc bác Boyxin chưa gặp trường hợp nào như này. Nếu thêm "=" thì làm thủ công đến bao giờ xong. Hơn nữa rõ ràng là đã có phép tính rồi chỉ cần lập 1 hàm xử lý là xong. Mình ngiên cứu excel là để xử dụng trong lúc này, bác thầy có đúng ko?

Mình cũng gặp trường hợp như bạn, nhưng hiện tại cũng đang loay hoay chưa ra. Mong các bạn giúp đỡ

Bạn thử nhé :

PHP:
Function KetQua(BieuThuc As String)
    Application.Volatile (False)
    On Error GoTo Thoat
    If Len(BieuThuc) < 3 Then Exit Function
    Dim i As Long, Temp As String
    For i = 1 To Len(BieuThuc)
        Select Case Mid$(BieuThuc, i, 1)
        Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/", "*", "+", "-", "(", ")"
            Temp = Temp & Mid$(BieuThuc, i, 1)
        End Select
    Next
    Temp = "=" & Temp
    KetQua = Application.Evaluate(Temp)
Thoat:
End Function



Thân!
 

File đính kèm

  • Tinh Bieu Thuc_OB.xls
    18.5 KB · Đọc: 222
Upvote 0
Chắc bác Boyxin chưa gặp trường hợp nào như này. Nếu thêm "=" thì làm thủ công đến bao giờ xong. Hơn nữa rõ ràng là đã có phép tính rồi chỉ cần lập 1 hàm xử lý là xong. Mình ngiên cứu excel là để xử dụng trong lúc này, bác thầy có đúng ko?

Mình cũng gặp trường hợp như bạn, nhưng hiện tại cũng đang loay hoay chưa ra. Mong các bạn giúp đỡ

hic hic hic
  1. Edit\Replace (Ctrl + H) lên bảng Find and Replace rồi thêm dấu "=" đâu có gì khó khăn
  2. Không thích thế thì xem file đính kèm
 

File đính kèm

  • tinh bieu thuc.xls
    13.5 KB · Đọc: 141
Upvote 0
Hàm KetQua của Okebab và name tinh của boyxin quá hay. Học thêm được cái Application.Evaluate của VBA và EVALUATE của macro 4 qua bài của 2 bạn.
Nhưng qua chạy thử, mỗi cái còn 1 vấn đề cần phát triển cho nó mang tính tổng quát hơn.
Okebab : hàm Ketqua chạy tốt với số nguyên nhưng chưa nhận dạng được số thập phân. Okebab có thể viết hàm Ketqua cho nó tính luôn được số thập phân thì dễ sử dụng hơn.
boyxin : name tinh chạy tốt với số nguyên, thập phân nhưng không linh hoạt trong việc chọn ô nguồn. Nó chỉ tính được ô kế bên trái. Có thể nào cho phép gán ô nguồn bất kỳ như hàm Ketqua không ?
 
Upvote 0
boyxin : name tinh chạy tốt với số nguyên, thập phân nhưng không linh hoạt trong việc chọn ô nguồn. Nó chỉ tính được ô kế bên trái. Có thể nào cho phép gán ô nguồn bất kỳ như hàm Ketqua không ?
Linh hoạt dc đấy thầy à! Có điều phải chèn thêm 4 name nữa...
Thầy có thể xem cách mà mọi người đã linh hoạt như thế nào tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=7613
Và gần đây nhất là hàm đọc số của bạn hoangdanh282vn:
http://www.giaiphapexcel.com/forum/showthread.php?t=10557
Mạn phép boyxin sửa lại file tí
Mến
 

File đính kèm

  • Evaluate.xls
    13.5 KB · Đọc: 200
Lần chỉnh sửa cuối:
Upvote 0
Tính biểu thức (Nguồn thuộc GPE)
 

File đính kèm

  • Value2Func.xls
    35 KB · Đọc: 176
Upvote 0
Hàm KetQua của Okebab và name tinh của boyxin quá hay. Học thêm được cái Application.Evaluate của VBA và EVALUATE của macro 4 qua bài của 2 bạn.
Nhưng qua chạy thử, mỗi cái còn 1 vấn đề cần phát triển cho nó mang tính tổng quát hơn.
Okebab : hàm Ketqua chạy tốt với số nguyên nhưng chưa nhận dạng được số thập phân. Okebab có thể viết hàm Ketqua cho nó tính luôn được số thập phân thì dễ sử dụng hơn.

Bác thân!!

Của em cũng chưa hẳn là tổng quát, em còn vướng chỗ đọc giá trị của khóa [HKEY_CURRENT_USER\Control Panel\International\sDecimal], vì vậy vẫn cần thêm tham số Loai nữa.


PHP:
Option Explicit
Function KetQua(BieuThuc As String, Optional Loai As String = ",")
    ' Loai la Dau Thap Phan
    Application.Volatile (False)
    On Error GoTo Thoat
    If Len(BieuThuc) < 3 Then Exit Function
    Dim i As Long, Temp As String
    For i = 1 To Len(BieuThuc)
        Select Case Mid$(BieuThuc, i, 1)
        Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/", "*", "+", "-", "(", ")", "^"
            Temp = Temp & Mid$(BieuThuc, i, 1)
        Case ","
            If Loai = "," Then Temp = Temp & "."
        Case "."
            If Loai = "." Then Temp = Temp & "."
        End Select
    Next
    KetQua = Application.Evaluate(Temp)
Thoat:
End Function


Thân!
 

File đính kèm

  • Tinh Bieu Thuc_OB2.xls
    24.5 KB · Đọc: 43
Upvote 0
Thấy cái này cũng hay, anh đã tìm được cách xác định dấu ngàn, thập phân trong regional and language Options:
Mã:
ngan = Application.ThousandsSeparator
tphan = Application.DecimalSeparator
Tuy nhiên, trong VBA nó không chấp nhận dấu ngàn, thập phân như thế mà dấu ngàn là dấu phẩy và dấu thập phân là dấu chấm. Do đó, phải thay thế dấu ngàn, thập phân về dạng chuẩn của VBA (tốt nhất là loại bỏ dấu ngàn). Ví dụ 1.234,5*3 phải chuyển chuỗi 1.234,5 thành 1234.5 VBA mới hiểu và tính toán.
Một cái hay nữa là không cần phải dùng select case như em làm, mà bản thân Application.Evaluate(Temp) nó tự xác định biểu thức nếu nhập số, toán tử, dấu ngoặc
đúng bài bản là nó tính ngay, còn nhập tào lao là nó báo lỗi #VALUE! nên hàm viết lại rất gọn:
Mã:
Function LamToan(BieuThuc As String) As Double
Dim ngan As String, tphan As String, temp As String
If Trim(BieuThuc) = "" Then Exit Function
ngan = Application.ThousandsSeparator
tphan = Application.DecimalSeparator
BieuThuc = Replace(BieuThuc, ngan, "")
BieuThuc = Replace(BieuThuc, tphan, ".")
LamToan = Application.Evaluate("=" & BieuThuc)
End Function
 
Upvote 0
Xem ra cái hàm EVALUATE của macro 4 khá thông minh nhỉ... Thế mới thấy rằng lên đến Office2007 rồi mà mấy hàm đó MS vẫn chưa dám bỏ
Thầy Long cho em hỏi:
Application.EvaluateEvaluate có gì khác nhau ko?
 
Upvote 0
Xem ra cái hàm EVALUATE của macro 4 khá thông minh nhỉ... Thế mới thấy rằng lên đến Office2007 rồi mà mấy hàm đó MS vẫn chưa dám bỏ
Thầy Long cho em hỏi:
Application.EvaluateEvaluate có gì khác nhau ko?
Theo anh hiểu thì cả 2 đều làm như nhau nhưng Evaluate là của macro4 chỉ chạy trên bảng tính (mới biết qua bài của anhtuan, macro4 anh mù tịt), còn
Application.Evaluate chỉ chạy trong VBA
 
Upvote 0
Ah... ý em ko phải vậy!
Trong code VBA thầy vẫn gõ dc Evaluate mà ko cần phải thêm Application phía trước nên em muốn hỏi nó có gì khác nhau ko giữa 2 cách viết này...
 
Upvote 0
Ah... ý em ko phải vậy!
Trong code VBA thầy vẫn gõ dc Evaluate mà ko cần phải thêm Application phía trước nên em muốn hỏi nó có gì khác nhau ko giữa 2 cách viết này...

+ 2 cái này tương đương nhau

+ Thực chất là Application là chỉ ra ứng dụng hiện thời (excel) - nhưng chúng ta đang ở trong chương trình này rồi -> không cần

+ Tuy vậy, chúng ta thường gõ Application sau đó dấu "." để nó tự động liệt kê và fill luôn các thuộc tính của nó (tránh gõ sai / và gợi nhớ)
.
 
Upvote 0
Thấy cái này cũng hay, anh đã tìm được cách xác định dấu ngàn, thập phân trong regional and language Options:
Mã:
ngan = Application.ThousandsSeparator
tphan = Application.DecimalSeparator

Bác thân!!
Đây không phải là dấu thập phân và ngàn đang được Excel sử dụng.
Ta có thể hình dung như sau :
  • Khi Application.UseSystemSeparators =False (Tools/Option.../International/User Systems Separators = False) thì : Lấy trong Tools/Option.../International/Decimal Separator và Tools/Option.../International/Thoudsand Separator
  • Thập phận : Application.DecimalSeparator
  • Ngàn : Application.ThousandsSeparator
  • Khi Application.UseSystemSeparators =True thì :Sẽ lấy giá trị của Hệ thống :Regional and Language Options
  • Thập phận : [HKEY_CURRENT_USER\Control Panel\International\sDecimal]sThousand
  • Ngàn : [HKEY_CURRENT_USER\Control Panel\International\sThousand]
Để rõ hơn thì anh có thể theo dõi File dưới.


Một cái hay nữa là không cần phải dùng select case như em làm, mà bản thân Application.Evaluate(Temp) nó tự xác định biểu thức nếu nhập số, toán tử, dấu ngoặc
Nếu trong chuỗi chỉ có con số, dấu thập phân, ngàn và các toán tử thì có thể làm như thế, nếu có các ký tự khác (như VD trong File) thì ta phải loại bỏ nó đi trước khi tính toán bác ạ. Do đó em mới dùng Case. Không biết bác có cao kiến gì không ??

PHP:
Function LamToan(BieuThuc As String) As Double
    Dim ngan As String, tphan As String, temp As String
    If Trim(BieuThuc) = "" Then Exit Function
    ngan = Application.ThousandsSeparator
    tphan = Application.DecimalSeparator
    BieuThuc = Replace(BieuThuc, ngan, "")
    BieuThuc = Replace(BieuThuc, tphan, ".")
    LamToan = Application.Evaluate("=" & BieuThuc)
    
    Application.UseSystemSeparators = False
End Function
Dùng hàm của bác thì tính năng Tools/Option.../International/User Systems Separators sẽ bị mất tác dụng, đúng ra phải là :

PHP:
Function LamToan(BieuThuc As String) As Double
    On Error GoTo Thoat:
    Dim Ngan As String, TPhan As String, Temp As String
    Dim OldUser As Boolean
    
    OldUser = Application.UseSystemSeparators
    Application.UseSystemSeparators = False
    If Trim(BieuThuc) = "" Then Exit Function
    
    Ngan = Application.ThousandsSeparator
    TPhan = Application.DecimalSeparator
    BieuThuc = Replace(BieuThuc, Ngan, "")
    BieuThuc = Replace(BieuThuc, TPhan, ".")
    LamToan = Application.Evaluate("=" & BieuThuc)

Thoat:
    Application.UseSystemSeparators = OldUser
End Function

Còn đây là hàm lấy dấu thập phân : (Hơi chuối)

PHP:
Function DauTPhan() As String
    Dim i As String
    If Application.UseSystemSeparators = True Then
        i = Format(111 / 100, "##0.00")
        If Right$(i, 2) = "11" Then
            DauTPhan = ","
        Else
            DauTPhan = "."
        End If
    Else
        DauTPhan = Application.DecimalSeparator
    End If
End Function






Thân!
 

File đính kèm

  • Tinh Bieu Thuc_OB3.xls
    31.5 KB · Đọc: 64
Upvote 0
Mãi mới tìm thấy
Cảm ơn mọi người nhé. Đánh dấu để khỏi quên
 
Upvote 0
Xin chào mọi người, mình làm xây dựng nên phép toán này rất hay dùng, mình thường dùng Evaluate luôn (do ko biết dùng VBA). Có một vấn đề trong quá trình sử dụng hàm là , nó rất mất ổn định, lâu lâu kết quả tính lại nhảy Value, mỗi lần như thế mình lại phải đặt lại name và kéo lại cột tính đó, các pạn sử dụng có bị như thế không, và cách khắc phục thế nào, mong mọi người chỉ giáo.
Mình cảm ơn!
 
Upvote 0
Web KT

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

Back
Top Bottom