Hàm tách biểu thức số và tính ra kết quả (hỏi dùm bạn) (4 người xem)

Liên hệ QC

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

bebo021999

Thành viên gạo cội
Tham gia
26/1/11
Bài viết
6,011
Được thích
8,786
Giới tính
Nam
Nghề nghiệp
GPE
Kính gửi các ACE,
Bebo có 1 người bạn làm chung có nhờ hỏi trường hợp sau:
Tại cột A có những diễn giải công thức tính dạng text, ví dụ như sau:
Nội dung tại ô A1 :
Công thức tính: 0.7*0.5*(5.5+4.8*3+4*018)*2
Các ô A2... có cấu trúc tương tự, chỉ thay đổi các con số thôi
Tại cột B, muốn tính toán ra kết quả theo biểu thức tại cột A :
ví dụ: B1=0.7*0.5*(5.5+4.8*3+4*018)*2 = 64.33
Hiện tại bây giờ đang dùng right để lấy giá trị biểu thức sau dấu "="; copy value; sau đó thêm dấu = đằng trước cho mỗi dòng mới ra kết quả. Làm thủ công cho từng dòng như vậy.
Xin các ACE chỉ giáo: Chỉ dùng 1 công thức để ra kết quả = 64.33 như ví dụ trên? Sau đó copy cho cả cột B.
Xin cảm ơn!
 
Kính gửi các ACE,
Bebo có 1 người bạn làm chung có nhờ hỏi trường hợp sau:
Tại cột A có những diễn giải công thức tính dạng text, ví dụ như sau:
Nội dung tại ô A1 :
Công thức tính: 0.7*0.5*(5.5+4.8*3+4*018)*2
Các ô A2... có cấu trúc tương tự, chỉ thay đổi các con số thôi
Tại cột B, muốn tính toán ra kết quả theo biểu thức tại cột A :
ví dụ: B1=0.7*0.5*(5.5+4.8*3+4*018)*2 = 64.33
Hiện tại bây giờ đang dùng right để lấy giá trị biểu thức sau dấu "="; copy value; sau đó thêm dấu = đằng trước cho mỗi dòng mới ra kết quả. Làm thủ công cho từng dòng như vậy.
Xin các ACE chỉ giáo: Chỉ dùng 1 công thức để ra kết quả = 64.33 như ví dụ trên? Sau đó copy cho cả cột B.
Xin cảm ơn!
Đặt con trỏ tại dòng 1, vào Define Name, đặt 1 name
PHP:
Eval =EVALUATE(MID(Sheet1!$A1,16,255))
Tại cell B1, gõ công thức =Eval
 
Đặt con trỏ tại dòng 1, vào Define Name, đặt 1 name
PHP:
Eval =EVALUATE(MID(Sheet1!$A1,16,255))
Tại cell B1, gõ công thức =Eval
Rất cám ơn bác Edu. Tuy nhiên, khi em đưa vào bảng tính thì kết quả không mong muốn. (File đính kèm)
Bác cho hỏi thêm:
* MID(A1,16,255) : ý bác là tách chuỗi nào? tại sao lại fix con số 16, trong khi độ dài con số trong chuỗi có thể thay đổi: ví dụ: 0.5;0,25;10.0;10.55
* EVALUATE(...) là hàm gì? Dùng trong 2003 được không? Máy của bạn em dùng Excel 2003.
Xin cảm ơn bác EDU
 

File đính kèm

Rất cám ơn bác Edu. Tuy nhiên, khi em đưa vào bảng tính thì kết quả không mong muốn. (File đính kèm)
Bác cho hỏi thêm:
* MID(A1,16,255) : ý bác là tách chuỗi nào? tại sao lại fix con số 16, trong khi độ dài con số trong chuỗi có thể thay đổi: ví dụ: 0.5;0,25;10.0;10.55
* EVALUATE(...) là hàm gì? Dùng trong 2003 được không? Máy của bạn em dùng Excel 2003.
Xin cảm ơn bác EDU
Vậy bạn kết hợp hàm Find vô để tìm tới con số cần tách trong đây mình thấy có dấu : thì chắc cái đó chung quá thì mình dự vào đó mà chắc anh NDu đánh lộn con số 16 đó đó nếu sửa lại chỉ là 6 thôi. Còn hàm đó thì anh NDU giải thích sẽ dễ hiểu hơn
Tùy theo định dạng máy mà dấu . dấu ,
 

File đính kèm

Rất cám ơn bác Edu. Tuy nhiên, khi em đưa vào bảng tính thì kết quả không mong muốn. (File đính kèm)
Bác cho hỏi thêm:
* MID(A1,16,255) : ý bác là tách chuỗi nào? tại sao lại fix con số 16, trong khi độ dài con số trong chuỗi có thể thay đổi: ví dụ: 0.5;0,25;10.0;10.55
* EVALUATE(...) là hàm gì? Dùng trong 2003 được không? Máy của bạn em dùng Excel 2003.
Xin cảm ơn bác EDU
EVALUATE: là hàm Marcro4. theo em hiểu thì nó chỉ chạy ở trong Name (không biết có chính xác không??)
theo như trong file của bác, thì bác đặt lại Name như sau:
Eval=EVALUATE(RIGHT(Sheet1!$A2,LEN(Sheet1!$A2)-FIND(" ",Sheet1!$A2)))
Tuy nhiên có thể có nhiều trường hợp khác, vì vậy 1 file có nhiều trường hợp sẽ có lời giải tổng quát hơn.
 
Rất cám ơn bác Edu. Tuy nhiên, khi em đưa vào bảng tính thì kết quả không mong muốn. (File đính kèm)
Bác cho hỏi thêm:
* MID(A1,16,255) : ý bác là tách chuỗi nào? tại sao lại fix con số 16, trong khi độ dài con số trong chuỗi có thể thay đổi: ví dụ: 0.5;0,25;10.0;10.55
* EVALUATE(...) là hàm gì? Dùng trong 2003 được không? Máy của bạn em dùng Excel 2003.
Xin cảm ơn bác EDU
Con số 16 tôi có được từ dữ liệu của bạn thôi (Công thức tính: .... ) ---> Dữ liệu của bạn khác hơn thì bạn tự mình tách lấy biểu thức rồi thế vào Evaluate(....)
Rõ ràng bạn nói rằng:
Hiện tại bây giờ đang dùng right để lấy giá trị biểu thức sau dấu "="; copy value; sau đó thêm dấu = đằng trước cho mỗi dòng mới ra kết quả.!
Thì cứ thế mà làm đi ---> Lấy công thức của bạn cho vào Evaluate(...) ---> Hàm Evaluate này thuộc macro 4, chỉ dùng được trong Define name (không gõ trực tiếp được trên sheet) và dùng nó ở version office nào cũng được cả
 
Cảm ơn các bạn đã giúp.
Rút trích ra biểu thức thì có nhiều cách mình đã biết. Tuy nhiên, về Macro4 thì mình mới tiếp xúc lần đầu tiên, cho hỏi: Để Macro4 có tác dụng, cần set lại option như thế nào, mình đang test trên excel 2007.
Hiện tại trên file mình test thì ra kết quả là #NAME?
 
Cảm ơn các bạn đã giúp.
Rút trích ra biểu thức thì có nhiều cách mình đã biết. Tuy nhiên, về Macro4 thì mình mới tiếp xúc lần đầu tiên, cho hỏi: Để Macro4 có tác dụng, cần set lại option như thế nào, mình đang test trên excel 2007.
Hiện tại trên file mình test thì ra kết quả là #NAME?
Kết quả là #VALUE! các bạn ạ.
 
Kết quả là #VALUE! các bạn ạ.
Lỗi đó có thể do phân cách hàng ngàn với phân cách thập phân bạn coi lại xem, với chuỗi bạn lại tinh toán có dư thiếu gì không, mình không cần set gì ráo trội tự nhiên nó có thôi, mình cũng sài trên excel 2007 đâu có lỗi gì đâu
 
Lỗi đó có thể do phân cách hàng ngàn với phân cách thập phân bạn coi lại xem, với chuỗi bạn lại tinh toán có dư thiếu gì không, mình không cần set gì ráo trội tự nhiên nó có thôi, mình cũng sài trên excel 2007 đâu có lỗi gì đâu
Thanks, mình làm được rồi.
Cảm ơn các bạn!
 
Cảm ơn các bạn đã giúp.
Rút trích ra biểu thức thì có nhiều cách mình đã biết. Tuy nhiên, về Macro4 thì mình mới tiếp xúc lần đầu tiên, cho hỏi: Để Macro4 có tác dụng, cần set lại option như thế nào, mình đang test trên excel 2007.
Hiện tại trên file mình test thì ra kết quả là #NAME?
Macro4 cũng là macro, vì thế để chạy được trên Excel 2007 thì vẫn phải tuân thủ "nội quy": Lưu file thành xls hoặc xlsm
Thế thôi
 
Em muốn hoi một câu tương tự như bác bebo nhưng công thức của em nó dạng này: 12,59 c/t x (1+0,5) x 1,12 x 67.794,23 đ/c Từ trước đến nay em toàn tính thủ công >
 
c/t là viết tắt của công/tấn; đ/c là đồng/công Khi lập dự toán, em phải giải trình công thức.
 
c/t là viết tắt của công/tấn; đ/c là đồng/công Khi lập dự toán, em phải giải trình công thức.
Chuỗi của bạn không đúng chuẩn công thức nên cũng khó lắm. Tôi làm tạm thế này:
PHP:
Function Tinh(Str As String) As String
Str = Replace(Str, "x", "*")
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9(),*/+-]+/[^0-9(),*/+-]+"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9(),*/+-]"
    Str = .Replace(Str, "")
End With
Str = Replace(Str, ",", ".")
Tinh = Evaluate(Str)
End Function
Có thể còn lỗi do chưa lường hết được tất cả các trường hợp của dữ liệu.
 

File đính kèm

Em công nhận bác dự đoán chuẩn, híc. Em vừa thử với công thức kiểu này dính ngay. 3,78c/m3 x (1+0,5) x 58.198,85 đ/c x 40%. Nếu tính tay nó sẽ = 131.995 Nếu dùng hàm = 13.209.974,973 Em toát hết mồ hôi hột vì sợ. Nhân tiện bác có thể làm tròn số đến hàng đơn vị & định dạng luôn giùm em không? Ví dụ như 13209974,973 thành 13.209.975. Cám ơn bác trước ^^
 
Chuỗi của bạn không đúng chuẩn công thức nên cũng khó lắm. Tôi làm tạm thế này:
PHP:
Function Tinh(Str As String) As String
Str = Replace(Str, "x", "*")
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9(),*/+-]+/[^0-9(),*/+-]+"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9(),*/+-]"
    Str = .Replace(Str, "")
End With
Str = Replace(Str, ",", ".")
Tinh = Evaluate(Str)
End Function
Có thể còn lỗi do chưa lường hết được tất cả các trường hợp của dữ liệu.
Khoai nhất là:
- Dấu thập phân
- Chuổi c/t có thể bị nhầm với dấu / (dấu chia)
----------------
Thắng thử hàm với chuổi này xem: [5+5]*2
 
Em công nhận bác dự đoán chuẩn, híc. Em vừa thử với công thức kiểu này dính ngay. 3,78c/m3 x (1+0,5) x 58.198,85 đ/c x 40%. Nếu tính tay nó sẽ = 131.995 Nếu dùng hàm = 13.209.974,973 Em toát hết mồ hôi hột vì sợ.
Sửa lại một chút theo trường hợp mà bạn mới nêu.
PHP:
Function Tinh(Str As String)
Str = Replace(Str, "x", "*")
Str = Replace(Str, " ", "")
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9()%,*/+-]+\d*/[^0-9()%,*/+-]+\d*"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9()%,*/+-]+/[^0-9()%,*/+-]+"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9()%,*/+-]"
    Str = .Replace(Str, "")
End With
Str = Replace(Str, ",", ".")
Tinh = Evaluate(Str)
End Function
Nhân tiện bác có thể làm tròn số đến hàng đơn vị & định dạng luôn giùm em không? Ví dụ như 13209974,973 thành 13.209.975. Cám ơn bác trước ^^
Cái này bạn có thể tự làm được.
Thắng thử hàm với chuổi này xem: [5+5]*2
EVALUATE không chấp nhận các dấu ngoặc khác dấu ngoặc đơn. Nếu muốn thì mình có thể đưa nó về dấu ngoặc đơn:
PHP:
Function Tinh(Str As String)
Str = Replace(Str, "x", "*")
Str = Replace(Str, " ", "")
Str = Replace(Str, "[", "(")
Str = Replace(Str, "{", "(")
Str = Replace(Str, "]", ")")
Str = Replace(Str, "}", ")")
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9()%,*/+-]+\d*/[^0-9()%,*/+-]+\d*"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9()%,*/+-]+/[^0-9()%,*/+-]+"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9()%,*/+-]"
    Str = .Replace(Str, "")
End With
Str = Replace(Str, ",", ".")
Tinh = Evaluate(Str)
End Function
Hình như VBA chỉ nhận dấu thập phân là dấu chấm (.). Em nói vậy không biết có đúng không.
 
Lần chỉnh sửa cuối:
Xin các bác giúp em làm cái này với ạ. Cũng đề bài như trên mà em làm mãi chẳng đc :(( Đc cái là em siêu gà MS nên rất mong đc các bác giúp đỡ tận tình ạ. Thanks các bác nhiều !
 

File đính kèm

Web KT

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

Back
Top Bottom