PDA

View Full Version : Cách tính công thức trong TextBox



ThanhThao
28-09-06, 10:17 PM
Nhờ các bác giải cho bài toán này với:

Em có công thức nhập vào trong TextBox, em muốn xác định kết quả của nó thì làm như thế nào vậy. Ví dụ như em nhập vào là "=2-sin(1)+cos(5)".

Có cách nào xác định được không hả các bác ơi?????+-+-+-+ +-+-+-+

hai2hai
29-09-06, 08:49 AM
Nhờ các bác giải cho bài toán này với:

Em có công thức nhập vào trong TextBox, em muốn xác định kết quả của nó thì làm như thế nào vậy. Ví dụ như em nhập vào là "=2-sin(1)+cos(5)".

Có cách nào xác định được không hả các bác ơi?????+-+-+-+ +-+-+-+

Google "Expression Evaluator" + VB

Sau đó kiếm 1 hàm về để giải quyết việc trên (mà ko cần nhờ đến excel vì bản chất excel cũng là làm như vậy mà thôi). Mọi việc trở nên đơn giản với Google

To Cường: Người ta đã gọi là phương thức rồi thì đương nhiến phải nói đến đối tượng mà ko cần giải thích là "không phải là hàm". Bản chất thì ai cũng biết cách viết method là giống như 1 procedure nhưng vì nó là của đối tượng và chỉ có đối tượng đó cung cấp nên người ta mới gọi là method.

Đào Việt Cường
29-09-06, 09:14 AM
Nhờ các bác giải cho bài toán này với:
Em có công thức nhập vào trong TextBox, em muốn xác định kết quả của nó thì làm như thế nào vậy. Ví dụ như em nhập vào là "=2-sin(1)+cos(5)".
Có cách nào xác định được không hả các bác ơi?????
Dear ThanhThao,
----------------
Nếu bạn sử dụng công thức trên Worksheet thì bạn sử dụng một name với Refers To: =EVALUATE(<Công thức của bạn>). Ví dụ name SINCOS có Refers To: =EVALUATE("=2-sin(1)+cos(5)"). Sau đó trên Worksheet bạn sử dụng vào name này: ô A1=SINCOS, kết quả là: 1,44219120065533
EVALUATE() là một phương thức (không phải là hàm) nên bạn không thể sử dụng phương thức này trực tiếp trong Formula như một Worksheet Function. Vì đây là phương thức của ứng dụng (Application) nên nó được sử dụng trong phạm vi toàn cục. Trong VBA, bạn chỉ cần khai báo một biến để lưu trữ lại kết quả của phương thức này (lúc này EVALUATE() đóng vai trò như một hàm):

Dim varSINCOS As Variant
varSINCOS = EVALUATE("=2-sin(1)+cos(5)")
Debug.Print SINCOS

PhanTuHuong
29-09-06, 10:59 AM
Theo mình nghĩ, liệu có tạo được giá trị nhập vào như là công thức không?
Nghĩa là tạo textBox.text giống như của InputBox với khai báo Type:=0 (coi là công thức) được không?

hai2hai
29-09-06, 11:41 AM
Hàm/Method Eval... nói chung (ko chỉ riêng excel mới có) là 1 hàm để tính (evaluate) kết quả của 1 biểu thức nói chung varRet = Eval...(F(x)). Rất nhiều người trên thế giới (tìm qua google) đã viết cái hàm này để tính giá trị 1 biểu thức rồi. Hình như ngày xưa nếu ai đã từng học thì có khi còn làm 1 bài tập viết cái hàm này thì phải.

Mấu chốt của vấn đề là từ tiếng anh: Evaluate (tính toán) và Expression (biểu thức).

Nguyễn Duy Tuân
10-10-06, 02:40 PM
Theo mình nghĩ, liệu có tạo được giá trị nhập vào như là công thức không?
Nghĩa là tạo textBox.text giống như của InputBox với khai báo Type:=0 (coi là công thức) được không?

Hoàn toàn là được!


Private Sub CheckResult()
Dim cFML As String, cValue As Variant
'cFML = TextBox1.text
cFML = "=Sum(2,3)"
If Trim(cFML) = "" Then Exit Sub

cValue = Application.Evaluate(cFML)

MsgBox cValue, , "Result"

End Sub

PhanTuHuong
10-10-06, 11:08 PM
Thực ra đối với VBA trong Excel thì không phải quá khó nhưng mình thử VBA trong AutoCad thì không nhận (khai báo type), thế mới hóc búa chứ. Mình thử dùng các hàm như chỉ dẫn xem có được không vậy.

nvson
12-10-06, 10:59 AM
Ô A1 bạn đánh:
Tổng số mẫu thí nghiệm của 30 lỗ khoan là 5*25+4*10+21*4
Và bạn muốn có kết quả ở ngay trong ô A1 (thêm vào cuối).
Hãy chạy Macro sau đây:



Public Sub Tinhgiatribieuthuc()
On Error Resume Next
Dim strText As String, congthuc As String
Dim Value1 As Double
Dim i As Integer
strText = ActiveCell.Text
For i = 1 To Len(strText)
Select Case Asc(Mid(strText, Len(strText) - i + 1, 1))
Case Is = 48, Is = 49, Is = 50, Is = 51, Is = 52, Is = 53, Is = 54, Is = 55, Is = 56, Is = 57, _
Is = 43, Is = 45, Is = 42, Is = 47, Is = 40, Is = 41, Is = 91, Is = 93, Is = 32, Is = 46
congthuc = Right(strText, i)
Case Else
Exit For
End Select
Next i
'Thay [ bang ( va ] bang )
congthuc = Replace(congthuc, "[", "(")
congthuc = Replace(congthuc, "]", ")")
congthuc = Trim(congthuc)
Value1 = Evaluate(congthuc)
Value1 = Format(Value1, ActiveCell.NumberFormat)
ActiveCell.FormulaR1C1 = strText & " = " & Value1
'Tim ky tu "=" de lam cho ket qua co mau do
For i = Len(ActiveCell.Text) To 1 Step -1
If Mid(ActiveCell.Text, i, 1) = "=" Then Exit For
Next i
With ActiveCell.Characters(Start:=1, Length:=i).Font
.ColorIndex = xlAutomatic
End With
With ActiveCell.Characters(Start:=i + 1, Length:=Len(ActiveCell.Text) - i).Font
.ColorIndex = 3
End With
End Sub

Bây giở ô A1 sẽ là:
Tổng số mẫu thí nghiệm của 30 lỗ khoan là 5*25+4*10+21*4=249

vuanhxv
24-04-09, 10:28 PM
Ô A1 bạn đánh:
Tổng số mẫu thí nghiệm của 30 lỗ khoan là 5*25+4*10+21*4
Và bạn muốn có kết quả ở ngay trong ô A1 (thêm vào cuối).
Hãy chạy Macro sau đây:.....................
Bây giở ô A1 sẽ là:
Tổng số mẫu thí nghiệm của 30 lỗ khoan là 5*25+4*10+21*4=249
Code rất hay!
nhưng sao khi có các hàm đặc biệt thì không được nhỉ? như hàm sqrt() hay hàm lũy thừa cũng không dùng được. chỉ có "+", "-","*","/" là tính được thôi.
liệu có thể khắc phục được điều này không vậy?
tiện thể cho mình hỏi làm cách nào để thay dấu "*" thành dấu "x" mà không làm ảnh hưởng đến biểu thức được không?

nvson
28-04-09, 11:14 AM
To vuanhxv:
1. Vấn đề là làm sao tách được chuỗi công thức từ câu đó ra mà thôi.
Nếu bạn nhập phần công thúc không có 1 dấu cách nào và đầy đủ các dấu ngoặc thì bạn sử dụng hàm split để tách lấy phần công thức cuối cùng, sau đó dùng hàm Evaluate để tính.
2. Bạn vẫn có thể dùng ký tự "x" để thay "*". Tuy nhiện khi viết code bạn cần thêm dòng lệnh Replace các dấu "x" thành dấu "*" để hàm Evaluate hiểu và tính toán.


Option Explicit
Public Sub tinh2()
Dim strT1, strT2, value1
strT1 = Trim(ActiveCell.Text)
strT2 = Split(strT1, Space(1))
strT1 = strT2(UBound(strT2))
strT1 = Replace(strT1, "x", "*")
value1 = Evaluate(strT1)
value1 = Format(value1, ActiveCell.NumberFormat)
ActiveCell.FormulaR1C1 = ActiveCell.Text & "=" & value1
End Sub

PhanTuHuong
28-04-09, 12:24 PM
Trong phần dự toán xây dựng trên Excel, cần giải trình công thức và thể hiện kết quả tính thì dùng cái của anh nvson là rất hay.

vuanhxv
28-04-09, 04:49 PM
không được rồi bro ơi.
mình dùng code trên nhưng nó chỉ thêm vào cuối "=Ge0eral" nghĩa là sao nhỉ?
giúp mình với! cảm ơn bro rất nhiều.

nvson
02-05-09, 01:31 PM
không được rồi bro ơi.
mình dùng code trên nhưng nó chỉ thêm vào cuối "=Ge0eral" nghĩa là sao nhỉ?
giúp mình với! cảm ơn bro rất nhiều.
Vì mình muốn rút gọn giá trị theo đúng định dạng của ô.
Ge0eral có nghĩa là bạn chưa định dạng số cho ô đó (bạn đang để General). Bạn chỉ cần định dạng Number cho ô đó là được thôi (Format cell...).
Để cho chắc ăn bạn thêm dòngh lệnh


ActiveCell.NumberFormat = "0.00"

vào sau dòng lệnh:


value1 = Evaluate(strT1)

haluat2688
26-07-11, 02:15 PM
To vuanhxv:
1. Vấn đề là làm sao tách được chuỗi công thức từ câu đó ra mà thôi.
Nếu bạn nhập phần công thúc không có 1 dấu cách nào và đầy đủ các dấu ngoặc thì bạn sử dụng hàm split để tách lấy phần công thức cuối cùng, sau đó dùng hàm Evaluate để tính.
2. Bạn vẫn có thể dùng ký tự "x" để thay "*". Tuy nhiện khi viết code bạn cần thêm dòng lệnh Replace các dấu "x" thành dấu "*" để hàm Evaluate hiểu và tính toán.


Option Explicit
Public Sub tinh2()
Dim strT1, strT2, value1
strT1 = Trim(ActiveCell.Text)
strT2 = Split(strT1, Space(1))
strT1 = strT2(UBound(strT2))
strT1 = Replace(strT1, "x", "*")
value1 = Evaluate(strT1)
value1 = Format(value1, ActiveCell.NumberFormat)
ActiveCell.FormulaR1C1 = ActiveCell.Text & "=" & value1
End Sub





Bạn ơi cho mình hỏi làm thế nào để áp dụng được công thức này

Bạn Có thể hưởng dẫn mình cách không

Gửi hộ mình file đính kèm