Xin hỏi về hàm diện giải công thức đặc biệt

Liên hệ QC

vietnam1988

Thành viên mới
Tham gia
19/8/10
Bài viết
6
Được thích
0
Xin chào mọi người
Cho em hỏi nếu trong ô A1 có diễn giải: 10thanh*0.5m*4mặt*1m+0.5m*10m
Thì dùng công gì để ra kết quả ở ô B1 là: 25
Em xin chân thành cám ơn.
 
Chưa có cao thủ nào ra tay giúp đỡ hộ em ah
 
Dùng hàm SUBSTITUTE để thay thế các từ "thanh", "mặt", "m" thành "". Tức là được chuỗi thuần toán.
Đặt nó vào một name.
Dùng hàm EVALUATE để tính

(*) hàm Evaluate không chịu tính thẳng trên chuỗi cho nên phải đặt name.
 
Xin chào mọi người
Cho em hỏi nếu trong ô A1 có diễn giải: 10thanh*0.5m*4mặt*1m+0.5m*10m
Thì dùng công gì để ra kết quả ở ô B1 là: 25
Em xin chân thành cám ơn.
Tôi nghĩ excel đâu đủ thông minh để hiểu được bạn muốn gì ở biểu thức trên. Excel làm sao hiểu được "thanh" hay "m" hay "mặt" là cái GÌ?. Lại còn 0.5 nữa (theo tôi là 0,5 thì mới tính toán được)
Tôi ví dụ biểu thức như thế này thì còn có thể tính toán được
Diễn giải : 10*0,5*4*1+0,5*10
 
Tôi nghĩ excel đâu đủ thông minh để hiểu được bạn muốn gì ở biểu thức trên. Excel làm sao hiểu được "thanh" hay "m" hay "mặt" là cái GÌ?. Lại còn 0.5 nữa (theo tôi là 0,5 thì mới tính toán được)
Tôi ví dụ biểu thức như thế này thì còn có thể tính toán được
Diễn giải : 10*0,5*4*1+0,5*10
Anh, Mỹ ký hiệu dấu phân cách phần thập phân là dấu chấm, phân cách hàng nghìn là dấu phẩy.
Có thể dùng hàm tự tạo. Hàm có đối số là chuỗi, trong hàm dùng Replace để thay thế "thanh", "mặt", "m" thành "" rồi dùng hàm Evaluate để tính. Mình đang vướng chỗ vb không hỗ trợ unicode nên không biết thay thế chữ "mặt" thế nào, có thể đi vòng bằng cách dùng Substitute để thay chữ "mặt".
Mã:
Function tinh(byval s as string)
S=replace(s,"thanh","")
S=replace(s,"m","")
Tinh=evaluate(s)
End Function
Tại ô A1 chứa chuỗi, nhập công thức A2=Tinh(Substitute(A1,"mặt",""))
 
Anh, Mỹ ký hiệu dấu phân cách phần thập phân là dấu chấm, phân cách hàng nghìn là dấu phẩy.
Có thể dùng hàm tự tạo. Hàm có đối số là chuỗi, trong hàm dùng Replace để thay thế "thanh", "mặt", "m" thành "" rồi dùng hàm Evaluate để tính. Mình đang vướng chỗ vb không hỗ trợ unicode nên không biết thay thế chữ "mặt" thế nào, có thể đi vòng bằng cách dùng Substitute để thay chữ "mặt".
Mã:
Function tinh(byval s as string)
S=replace(s,"thanh","")
S=replace(s,"m","")
Tinh=evaluate(s)
End Function
Tại ô A1 chứa chuỗi, nhập công thức A2=Tinh(Substitute(A1,"mặt",""))

Nếu dùng hàm tự viết ra thì dễ lắm. Chỉ cần xoá những ký tự không nằm trong danh sách các ký tự toán học.

Function tinh(ByVal s As String) As Double
Const dsKT = "0123456789.,+-*/^()"
Dim i As Integer
For i = 1 To Len(s)
If InStr(dsKT, Mid(s, i, 1)) <= 0 Then Mid(s, i, 1) = " "
Next i
tinh = Evaluate(s)
End Function
 
Lại còn 0.5 nữa (theo tôi là 0,5 thì mới tính toán được)
Tôi ví dụ biểu thức như thế này thì còn có thể tính toán được
Diễn giải : 10*0,5*4*1+0,5*10

0.5 là được. Chính 0,5 mới là không được.

Bất luận thiết lập trong CP như thế nào thì chỉ có 2 lựa chọn
1. Hoặc khi gõ chuỗi thì phải nhớ là dùng dấu chấm "." để gõ dấu thập phân
2. Hoặc code chuyển tất cả các dấu phẩy nếu có thành dấu chấm.

Tính được Evaluate(s) với s = "10*0.5*4*1+0.5*10"
Không tính được Evaluate(s) với s = "10*0,5*4*1+0,5*10"

Đấy là dùng VBA. Hướng đi thì bạn VetMini đã chỉ ra.
 
Lần chỉnh sửa cuối:
Nếu dùng hàm tự viết ra thì dễ lắm. Chỉ cần xoá những ký tự không nằm trong danh sách các ký tự toán học.

Function tinh(ByVal s As String) As Double
Const dsKT = "0123456789.,+-*/^()"
Dim i As Integer
For i = 1 To Len(s)
If InStr(dsKT, Mid(s, i, 1)) <= 0 Then Mid(s, i, 1) = " "
Next i
tinh = Evaluate(s)
End Function

Nếu trong chuỗi có dấu "/", ví dụ 3thanh*18kg/thanh=??? (kg) thì làm sao hả bạn ?
 
Nếu trong chuỗi có dấu "/", ví dụ 3thanh*18kg/thanh=??? (kg) thì làm sao hả bạn ?

Sao không hỏi nếu chuỗi có đơn vị luỹ thừa (m2, s-1, ...) luôn cho tiện thể?

Nếu chuỗi phức tạp quá thì bắt buộc phải dùng 1 trong 2 phương pháp:

1. duyệt chuỗi, lấy ra những biểu thức toán rồi tính.

2. tạo một mảng những đơn vị có thể có. Dùng hàm replace để đổi các đơn vị thành ""
 
Sao không hỏi nếu chuỗi có đơn vị luỹ thừa (m2, s-1, ...) luôn cho tiện thể?

Nếu chuỗi phức tạp quá thì bắt buộc phải dùng 1 trong 2 phương pháp:

1. duyệt chuỗi, lấy ra những biểu thức toán rồi tính.

2. tạo một mảng những đơn vị có thể có. Dùng hàm replace để đổi các đơn vị thành ""
Bạn viết hàm kiểu đó người ta tưởng thiệt mà áp dụng lung tung thì nguy quá
 
Bạn viết hàm kiểu đó người ta tưởng thiệt mà áp dụng lung tung thì nguy quá

Code viết nhanh nhiều khi chưa lường hết các trường hợp.

Cái quí giá nhất là ý tưởng, là hướng đi. Mọi cái còn lại chỉ là chi tiết thực hiện. Cũng cùng một thuật toán nhưng mỗi người viết ra một code khác vì mỗi người thực hiện chi tiết theo một cách khác, dùng công cụ khác.

Bạn đã có 1 hướng đi, tôi không dám nói là tốt nhất. Vậy bạn thấy có những trường hợp khác thì tự sửa code. Ví dụ (chỉ ví dụ thôi) bạn hãy suy nghĩ chút và tự tìm hiểu. Nếu "/" là toán tử số học thì sẽ thế nào?. Tôi nghĩ (chưa hẳn tối ưu) "/" là toán tử đòi hỏi 2 thành phần: a / b với a và b là số. Vậy thì một trong những bước cuối (trước đó các ký tự "không hợp lệ" được loại, tức thay bằng "") là xét xem nếu có "/" và ít nhất 1 bên không là số thì loại.

Tất nhiên làm thế nào cho đúng thì phải suy nghĩ chút. Khi tôi đọc bài của bạn VetMini thì tôi chỉ quan tâm tới ý tưởng, hướng đi. Vì tôi biết là về chi tiết thì tôi sẽ làm theo cách của mình.

Cứ copy/paste không tự hiểu, không có chút suy nghĩ của chính mình thì tự chịu thôi. Cứ cho vấp ngã vài lần trong đời thì ai cũng sẽ khôn ngoan ngay.
 
Code viết nhanh nhiều khi chưa lường hết các trường hợp.

Cái quí giá nhất là ý tưởng, là hướng đi. Mọi cái còn lại chỉ là chi tiết thực hiện. Cũng cùng một thuật toán nhưng mỗi người viết ra một code khác vì mỗi người thực hiện chi tiết theo một cách khác, dùng công cụ khác.

Bạn đã có 1 hướng đi, tôi không dám nói là tốt nhất. Vậy bạn thấy có những trường hợp khác thì tự sửa code. Ví dụ (chỉ ví dụ thôi) bạn hãy suy nghĩ chút và tự tìm hiểu. Nếu "/" là toán tử số học thì sẽ thế nào?. Tôi nghĩ (chưa hẳn tối ưu) "/" là toán tử đòi hỏi 2 thành phần: a / b với a và b là số. Vậy thì một trong những bước cuối (trước đó các ký tự "không hợp lệ" được loại, tức thay bằng "") là xét xem nếu có "/" và ít nhất 1 bên không là số thì loại.

Tất nhiên làm thế nào cho đúng thì phải suy nghĩ chút. Khi tôi đọc bài của bạn VetMini thì tôi chỉ quan tâm tới ý tưởng, hướng đi. Vì tôi biết là về chi tiết thì tôi sẽ làm theo cách của mình.

Cứ copy/paste không tự hiểu, không có chút suy nghĩ của chính mình thì tự chịu thôi. Cứ cho vấp ngã vài lần trong đời thì ai cũng sẽ khôn ngoan ngay.
Ý tưởng là 1 chuyện, việc triển khai ý tưởng là chuyện hoàn toàn khác, ai cũng có ý tưởng lên vũ trụ nhưng mấy ai làm được hả bạn?
 
Ý tưởng là 1 chuyện, việc triển khai ý tưởng là chuyện hoàn toàn khác, ai cũng có ý tưởng lên vũ trụ nhưng mấy ai làm được hả bạn?

Nếu được người ta chỉ cho hướng đi mà không tự đi được thì hỏi tiếp.

Nhưng nhìn dòng
Bạn viết hàm kiểu đó người ta tưởng thiệt mà áp dụng lung tung thì nguy quá

khi bạn VetMini đã giải thích thêm thì tôi hiểu là bạn không muốn hỏi gì cả. Bạn muốn: "nói những gì bạn muốn nói".

Cũng chính vì đó mà mọi ý kiến thêm đều vô nghĩa. Vậy tôi chấm dứt ở đây.
 
Nếu được người ta chỉ cho hướng đi mà không tự đi được thì hỏi tiếp.

Nhưng nhìn dòng


khi bạn VetMini đã giải thích thêm thì tôi hiểu là bạn không muốn hỏi gì cả. Bạn muốn: "nói những gì bạn muốn nói".

Cũng chính vì đó mà mọi ý kiến thêm đều vô nghĩa. Vậy tôi chấm dứt ở đây.

Đơn giản là tôi thấy nếu hỏi thêm cũng chảng giải quyết được gì . Còn bạn nói "nói những gì bạn muốn nói". thì câu này phải dành cho bạn mới đúng vì tôi không hề hỏi bạn
 
Em thì chỉ đọc, chỉ hiểu, chi tính toán theo cách của người Việt. Ví dụ là hình phía dưới, tính toán ngon lành với dữ liệu dạng bài #4

trong code nó chỉ hiểu dấu "." là dấu thập phân, mặc kệ bạn set trong control panel là cái gì
vì vậy nếu data của người ta là dấu "," thì phải đổi qua "." tính toán xong hết trả lại kết quả thì đổn ngược lại
 
trong code nó chỉ hiểu dấu "." là dấu thập phân, mặc kệ bạn set trong control panel là cái gì
vì vậy nếu data của người ta là dấu "," thì phải đổi qua "." tính toán xong hết trả lại kết quả thì đổn ngược lại
1) "trong code" có phải là code của hàm Evaluate không?
2) Vậy sao ở cột C của mình trên hình các biểu thức có dạng 10*1,31*0,1 vẫn ra kết quả đúng.
 
1) "trong code" có phải là code của hàm Evaluate không?

Code ở đây là code VBA.
Tôi nói về code VBA. Bạn đọc kỹ bài #7 thì thấy là tôi có dùng từ code, và thậm chí tôi nói rõ hẳn
2. Hoặc code chuyển tất cả các dấu phẩy nếu có thành dấu chấm.
...
Đấy là dùng VBA

Không ngờ là bạn nói về công thức trên sheet, name.

Nếu đã thế thì bạn nên biết

A. Chủ chủ đề có dữ liệu như trong bài #1
10thanh*0.5m*4mặt*1m+0.5m*10m

Bạn định xử lý trên sheet như thế nào cho đơn giản? Vì cái vd. bạn đưa ra trong bài #15 không có những "thanh, m, mặt" mà chỉ có toàn số và các toán tử số học.

2) Vậy sao ở cột C của mình trên hình các biểu thức có dạng 10*1,31*0,1 vẫn ra kết quả đúng.

B. Bạn biết tại sao trong bài #15 bạn không có lỗi không? Vì dữ liệu của bạn có dấu phẩy là dấu thập phân và trong CP bạn cũng thiết lập như thế.

Bạn đã có trong cột C chuỗi 10*1,31*0,1
Bạn hãy nhập thêm vào cột C chuỗi 10*1.31*0.1

Cho dù bạn thiết lập trong CP thế nào thì luôn có 1 kết quả đúng (ứng với chuỗi có dấu thập phân như trong CP) và 1 kết quả sai - #VALUE!. Điều đó có nghĩa là gì? Là bạn chỉ phục vụ một mình bạn thôi. Tập tin của bạn không thể chia sẻ cho người khác. Tất nhiên ở đây không có chuyện bắt đối tác thay đổi CP. Làm gì có chuyện nhận tập tin của đối tác A thì tôi phải thay CP, rồi sau đó nhận của đối tác B lại phải chuyển về cũ. Cứ như thế như đèn cù?

Chính vì thế những bài như của chủ chủ đề nên làm trong VBA. Đơn giản, xử lý cả "thanh, m, mặt" lẫn làm "trơ" với những thiết lập trong CP. Và trong VBA thì Evaluate không chấp nhận "10*0,5*4*1+0,5*10", nó chỉ thích "10*0.5*4*1+0.5*10" thôi
 
Web KT

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

Back
Top Bottom