Tính toán chuỗi biểu thức (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nguyenthuan

Thành viên mới
Tham gia
12/12/06
Bài viết
28
Được thích
4
Nghề nghiệp
Đi học lóm
Mong các bác giúp tính kết quả biểu thức chuỗi này
Trong 1 ô ví dụ A1 thông qua các phép nối chuỗi "&" em được kết quả là :
=(4.5×1.5×12.25)×2.5
Kết quả này chẳng qua là thể hiện cách tính toán cho tường minh
Và em muốn từ nó lập hàm để tính ra kết quả
Em lập hàm ValueTh với CODE như sau
Mã:
Function ValueTh(Text)
Dim i As Integer
Dim TextStr As String
Dim TextCount As Integer
Dim TextNew As String
TextCount = Len(Text)
TextNew = ""
For i = 1 To TextCount
    If Mid(Text, i, 1) = Chr(61) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(34) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(38) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(215) Then
        TextStr = "*"
    Else: TextStr = Mid(Text, i, 1)
    End If
    TextNew = TextNew & TextStr
Next i
TextNew = Trim(TextNew)
ValueTh =  "=" & TextNew
End Function
Kết quả sau khi dùng hàm là ví dụ ở ô B1 là : =(4.5*1.5*12.25)*2.5
Khi lập hàm này mình nghĩ là nó sẽ ra kết quả luôn nhưng nó lại không ra được.Mình thử hàm value() nhưng không mang lại kết quả gì cả .Mong được sự tư vấn về cách làm và cách hiểu của mình.
 
Mong các bác giúp tính kết quả biểu thức chuỗi này
Trong 1 ô ví dụ A1 thông qua các phép nối chuỗi "&" em được kết quả là :
=(4.5×1.5×12.25)×2.5
Kết quả này chẳng qua là thể hiện cách tính toán cho tường minh
Và em muốn từ nó lập hàm để tính ra kết quả
Em lập hàm ValueTh với CODE như sau
Mã:
Function ValueTh(Text)
Dim i As Integer
Dim TextStr As String
Dim TextCount As Integer
Dim TextNew As String
TextCount = Len(Text)
TextNew = ""
For i = 1 To TextCount
    If Mid(Text, i, 1) = Chr(61) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(34) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(38) Then
        TextStr = ""
    ElseIf Mid(Text, i, 1) = Chr(215) Then
        TextStr = "*"
    Else: TextStr = Mid(Text, i, 1)
    End If
    TextNew = TextNew & TextStr
Next i
TextNew = Trim(TextNew)
ValueTh =  "=" & TextNew
End Function
Kết quả sau khi dùng hàm là ví dụ ở ô B1 là : =(4.5*1.5*12.25)*2.5
Khi lập hàm này mình nghĩ là nó sẽ ra kết quả luôn nhưng nó lại không ra được.Mình thử hàm value() nhưng không mang lại kết quả gì cả .Mong được sự tư vấn về cách làm và cách hiểu của mình.
Bạn xem bài này nhé!
Code cực ngắn, không For, không IF eo gì cả
http://www.giaiphapexcel.com/forum/showpost.php?p=150955&postcount=12
 
Upvote 0
Rất cảm ơn nd96081631 đã giúp mình rất nhanh và rất gọn ,mình mới biết VBA nên không giỏi mấy cái đó lắm .
Nhưng mà mình không hiểu sao khi mình tham chiếu đến ô công thức đó thì nó ra kết quả là 20671875 trong khi kết quả thật sự là 206.719 có nghĩa là nó gấp 10^5 lần .Mình thử với (0.4*2.2*(12.25-2*0.5))*2.5 thì kết quả là 134772000 thay vì đúng là 24.75
Mong bác giúp đỡ
 
Upvote 0
Rất cảm ơn nd96081631 đã giúp mình rất nhanh và rất gọn ,mình mới biết VBA nên không giỏi mấy cái đó lắm .
Nhưng mà mình không hiểu sao khi mình tham chiếu đến ô công thức đó thì nó ra kết quả là 20671875 trong khi kết quả thật sự là 206.719 có nghĩa là nó gấp 10^5 lần .Mình thử với (0.4*2.2*(12.25-2*0.5))*2.5 thì kết quả là 134772000 thay vì đúng là 24.75
Mong bác giúp đỡ
Cảm ơn bạn đã phát hiện, đúng là có sai sót
Tôi sửa lại đây!
 

File đính kèm

Upvote 0
Mình có chút thắc mắc, mong được giải đáp

Rằng không ít lần thấy đề cập đến vấn đề này, vấn đề biến 1 biểu thức ra thành kết quả;

Điều thắc mắc của mình là: Liệu trong thực tế có những lúc nào ta phải làm thế không nhỉ?
 
Upvote 0
Rằng không ít lần thấy đề cập đến vấn đề này, vấn đề biến 1 biểu thức ra thành kết quả;

Điều thắc mắc của mình là: Liệu trong thực tế có những lúc nào ta phải làm thế không nhỉ?
Cũng có thể có đấy anh! Khi ta nhận 1 văn bản do người khác đưa tới (không phải do ta tạo ra) --> Trong đó có ghi các công thức, biểu thức tính toán... và đôi lúc ta muốn lấy luôn kết quả từ những biểu thức ấy ---> Lúc đó cần đến UDF này là hợp lý rồi
Tuy nhiên, việc chuyển biểu thức dạng TEXT thành kết quả cũng chỉ chính xác ở 1 mức độ nào đó... nó vẫn đòi hỏi người dùng phải tuân thủ 1 số quy định nhập liệu chứ không thể tùy tiện
Ví dụ:
7m*4tấc+5kg thì cho kết quả = 33
thế còn
7m*4tấc+5m² thì cho kết quả bao nhiêu?
Lưu ý rằng số 2 trong 5m² là do người ta Format Superscript mà ra
hoặc giả như người ta viết:
2 nhân với 3
mà bắt UDF phải hiểu ý người ta muốn nói đấy là:
2*3
thì chắc.... chết
vân vân...
 
Lần chỉnh sửa cuối:
Upvote 0
Em thì.... hổng hiểu cái nì:
7m*4tấc+5kg = 33​
33 chính là kết quả của 7*4+5
Vậy đơn vị tính của 33 là gì vậy ? Là kg, hay là m, hay là cm (tấc) ?
Sao mà lấy 7m nhân với 4 tấc ? Lấy 7m x 4 thôi thì còn hiểu được...
Rồi mét thì làm sao mà cộng với kg ?
 
Upvote 0
Em thì.... hổng hiểu cái nì:
7m*4tấc+5kg = 33​
33 chính là kết quả của 7*4+5
Vậy đơn vị tính của 33 là gì vậy ? Là kg, hay là m, hay là cm (tấc) ?
Sao mà lấy 7m nhân với 4 tấc ? Lấy 7m x 4 thôi thì còn hiểu được...
Rồi mét thì làm sao mà cộng với kg ?
Đấy chỉ là ví dụ thôi mà BNTT (giả lập để chắc chắn code làm được việc) ---> Thực tế đương nhiên đâu phải vô lý thế!
Ví dụ:
P = 5A * 0.4 KV * 0.85
vậy ổn chứ!
 
Upvote 0
Spam một chút. Sẽ tự xóa nội trong ngày hôm nay.

Đấy chỉ là ví dụ thôi mà BNTT (giả lập để chắc chắn code làm được việc) ---> Thực tế đương nhiên đâu phải vô lý thế!
Ví dụ:
P = 5A * 0.4 KV * 0.85
vậy ổn chứ!
Thì biết là ví dụ rồi. Nhưng ví dụ thì cũng phải thực tế chút.
Hồi trưa, em chợt nghĩ ra cái này (đọc lẹ đi, em sẽ xóa nó đấy):
7 mét * 4 tấc + 5 kg = lon 33​
Đã vô lý cho nó vô lý luôn thể, hì hì....
 
Upvote 0
Hàm ValExp() của bạn ndu96081631 rất hay, nhưng khi dùng AutoSum để tính tổng những giá trị vừa tính được bằng hàm này thì không ra kết quả, có lẽ những giá trị trên ở dạng text thì phải? nhờ bạn chỉ giáo thêm.
 
Upvote 0
Hàm ValExp() của bạn ndu96081631 rất hay, nhưng khi dùng AutoSum để tính tổng những giá trị vừa tính được bằng hàm này thì không ra kết quả, có lẽ những giá trị trên ở dạng text thì phải? nhờ bạn chỉ giáo thêm.
Không có vấn đề đâu! (đúng như bạn nói những giá trị ấy ở dạng text)
Nếu bạn có nhu cầu SUM các kết quả trên thì ta có thể xài 2 cách:
1> Cách 1:
Thay vì dùng công thức:
SUM(Vùng)
Bạn thay bằng công thức:
SUMPRODUCT((Vùng)*1)

2> Cách 2:
bấm Alt + F11 vào xem code! Đầu code là:
Function ValExp(Cell As Range) As String
Bạn sửa lại thành:
Function ValExp(Cell As Range) As Double
 
Upvote 0
Không có vấn đề đâu! (đúng như bạn nói những giá trị ấy ở dạng text)
Nếu bạn có nhu cầu SUM các kết quả trên thì ta có thể xài 2 cách:
1> Cách 1:
Thay vì dùng công thức:
SUM(Vùng)
Bạn thay bằng công thức:
SUMPRODUCT((Vùng)*1)

2> Cách 2:
bấm Alt + F11 vào xem code! Đầu code là:
Function ValExp(Cell As Range) As String
Bạn sửa lại thành:
Function ValExp(Cell As Range) As Double
Hàm này ứng dụng vào trong các phần mềm dự toán xây dựng rất hay.
Khi dùng hàm này, nếu chuỗi biểu thức là rỗng thì đang còn lỗi #Value!, bác sửa giùm em (đang còn lỗi ở D2 và ô mới thêm vào E2)
(Vì nhiều trường hợp chuỗi nhập vào là blank)
 

File đính kèm

Upvote 0
Hàm này ứng dụng vào trong các phần mềm dự toán xây dựng rất hay.
Khi dùng hàm này, nếu chuỗi biểu thức là rỗng thì đang còn lỗi #Value!, bác sửa giùm em (đang còn lỗi ở D2 và ô mới thêm vào E2)
(Vì nhiều trường hợp chuỗi nhập vào là blank)
Sửa thành vầy xem:
Mã:
Function ValExp(ByVal Exp As String) As Double
  Dim Tmp As String
  On Error Resume Next
  Tmp = Replace(Exp, "[", "(")
  Tmp = Replace(Tmp, "]", ")")
  Tmp = Replace(Tmp, "{", "(")
  Tmp = Replace(Tmp, "}", ")")
  Tmp = Replace(Tmp, "x", "*")
  Tmp = Replace(Tmp, ":", "/")
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9,+,.,*,/,:,(,),-]"
    ValExp = Evaluate(.Replace(Tmp, ""))
  End With
End Function
 
Upvote 0
Sửa thành vầy xem:
Mã:
Function ValExp(ByVal Exp As String) As Double
  Dim Tmp As String
  On Error Resume Next
  Tmp = Replace(Exp, "[", "(")
  Tmp = Replace(Tmp, "]", ")")
  Tmp = Replace(Tmp, "{", "(")
  Tmp = Replace(Tmp, "}", ")")
  Tmp = Replace(Tmp, "x", "*")
  Tmp = Replace(Tmp, ":", "/")
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9,+,.,*,/,:,(,),-]"
    ValExp = Evaluate(.Replace(Tmp, ""))
  End With
End Function
Lỗi value thì xử lý xong rồi.
Tuy nhiên, khi nhập chuỗi đơn thuần là số từ 1-9 lúc tính được,lúc không.(ở đây khi nhập số 1 không tính được)
- Bác xem lại hàng thứ 6 trong file em gửi lên xem (ô H6).
- Ngoài ra khi nhập dấu chấm "." (sát cạnh phím enter phải) không tính được - Đang tính được dạng 2.5+2 nhưng em muốn tính bằng dạng 2,5+2 thì làm sao? (mặc định về dấu chấm phẩy trong máy em phải đặt theo kiểu ghi số tiếng việt do cài phần mềm khác)
 

File đính kèm

Upvote 0
Lỗi value thì xử lý xong rồi.
Tuy nhiên, khi nhập chuỗi đơn thuần là số từ 1-9 lúc tính được,lúc không.(ở đây khi nhập số 1 không tính được)
- Bác xem lại hàng thứ 6 trong file em gửi lên xem (ô H6).
- Ngoài ra khi nhập dấu chấm "." (sát cạnh phím enter phải) không tính được - Đang tính được dạng 2.5+2 nhưng em muốn tính bằng dạng 2,5+2 thì làm sao? (mặc định về dấu chấm phẩy trong máy em phải đặt theo kiểu ghi số tiếng việt do cài phần mềm khác)

Thật sự tôi không hiểu nỗi file của bạn bị gì nữa! Tại sao Evaluate(1) lại =0?
Trong khi nếu chèn 1 sheet mới thì Evaluate(1) lại = 1 bình thường
 
Upvote 0
Sửa thành vầy xem:
Mã:
Function ValExp(ByVal Exp As String) As Double
  Dim Tmp As String
  On Error Resume Next
  Tmp = Replace(Exp, "[", "(")
  Tmp = Replace(Tmp, "]", ")")
  Tmp = Replace(Tmp, "{", "(")
  Tmp = Replace(Tmp, "}", ")")
  Tmp = Replace(Tmp, "x", "*")
  Tmp = Replace(Tmp, ":", "/")
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9,+,.,*,/,:,(,),-]"
    ValExp = Evaluate(.Replace(Tmp, ""))
  End With
End Function

Về pattern thì tôi không biết đã chuẩn chưa nhưng thấy nó "lạ lạ" thế nào ấy. Thứ nhất trước đó ta đã thay các ký tự ":" trong chuỗi thành "/" vậy trong pattern không cần loại nó ra, vì trong chuỗi có nó đâu. Thứ nữa là tại sao trong pattern lại có nhiều ký tự "," thế?

a. Nếu "," dùng để phân cách các ký tự trong [...] - nhìn pattern tôi có cảm giác thế - thì không đúng vì các ký tự lấy hay loại thì cứ liệt kê thôi không cần phân cách chúng bằng gì. Mà dùng "," để phân cách có nghĩa là làm sai pattern. Trong trường hợp này thì thừa nhưng trong trường hợp khác thì làm sai pattern - có nghĩa là lấy "," khi [,] và bỏ "," khi [^,], trong khi dụng ý của ta không phải thế

b. Nếu dùng "," với hàm ý loại nó thì cũng chỉ liệt kê 1 lần là đủ.

Lưu ý tới điểm b và ký tự ":" thì tôi rút gọn pattern thành: pattern = "[^0-9,+.*/()-]"

Hay Tuấn định dùng chiêu gì mà tôi không hiểu?
 
Upvote 0
Hay Tuấn định dùng chiêu gì mà tôi không hiểu?

Chiêu gì đâu anh! Tại không biết nên hóa ra rườm rà thôi
----------------
Nhân tiện anh nghiên cứu giúp em cái vụ Evaluate(1) này với
Em thí nghiệm như sau:
- Active sheet Dao+BTLot, gõ vào cửa sổ Immediate lệnh: ?Evaluate(1) rồi Enter---> Báo lỗi:
Run-tim error '438':
Object does't support this property or method
- Chèn thêm 1 sheet mới và Active sheet này, xong gõ vào cửa sổ Immediate lệnh: ?Evaluate(1) rồi Enter ---> Chẳng có lỗi gì (kết quả đương nhiên =1)
===> Lệnh Evaluate(1) thì liên quan gì đến việc ta Active sheet nào nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chiêu gì đâu anh! Tại không biết nên hóa ra rườm rà thôi
----------------
Nhân tiện anh nghiên cứu giúp em cái vụ Evaluate(1) này với
Em thí nghiệm như sau:
- Active sheet Dao+BTLot, gõ vào cửa sổ Immediate lệnh: ?Evaluate(1) rồi Enter---> Báo lỗi:

- Chèn thêm 1 sheet mới và Active sheet này, xong gõ vào cửa sổ Immediate lệnh: ?Evaluate(1) rồi Enter ---> Chẳng có lỗi gì (kết quả đương nhiên =1)
===> Lệnh Evaluate(1) thì liên quan gì đến việc ta Active sheet nào nhỉ?

Tôi nghĩ là file có vấn đề gì đó.
Mà khi tôi mở lần đầu thì nó có báo thế này

View attachment 96464

Cũng chả hiểu gì nữa. Với tập tin khác thì bình thường.
 
Upvote 0
Tôi nghĩ là file có vấn đề gì đó.
Mà khi tôi mở lần đầu thì nó có báo thế này

View attachment 96464

Cũng chả hiểu gì nữa. Với tập tin khác thì bình thường.

Tôi xóa cái CommandButton "Hide" đi thì thấy bình thường.
Bây giờ đóng tập tin và mở book mới (New --> Blank workbook). Tôi đặt lên Sheet1 CommandButton rồi gõ vào cửa sổ Immediate lệnh: ?Evaluate(1) rồi Enter thì .... báo lỗi
 
Upvote 0
Web KT

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

Back
Top Bottom