Chuyển một chuỗi dạng công thức

thuydhpy

Member
Hội viên mới
Mình có 2 cột cần thực hiện trong bảng tính Excel, một cột cần diễn giải công thức tính và một cột hiển thị kết quả của công thức tính,
Ví dụ ô A2 hiển thị 2* 4+ 3 thì ô B2 cho kết quả 11
Trong excel có hàm nào thực hiện việc này hay không? hay mình phải tự viết hàm chuyển theo cách tính biểu thức dùng kí pháp Balan.
Rất mong các bạn giúp đỡ. Xin cảm ơn rất nhiều!
 

TranTuan

www.trantuan.net
Administrator
Super Moderators
Ðề: Chuyển một chuỗi dạng công thức

Mình có 2 cột cần thực hiện trong bảng tính Excel, một cột cần diễn giải công thức tính và một cột hiển thị kết quả của công thức tính,
Ví dụ ô A2 hiển thị 2* 4+ 3 thì ô B2 cho kết quả 11
Trong excel có hàm nào thực hiện việc này hay không? hay mình phải tự viết hàm chuyển theo cách tính biểu thức dùng kí pháp Balan.
Rất mong các bạn giúp đỡ. Xin cảm ơn rất nhiều!
Đơn giản ở cột A và B bạn cài công thức như nhau, sau đó bạn chọn cột A và nhấn Ctr+H, thay tất cả dấu "=" thành ' là được :pangcheo:
 

muontennguoi

Member
Thành viên BQT
Super Moderators
Ðề: Chuyển một chuỗi dạng công thức

Có lẽ bạn phải viết hàm tự tạo thôi.
Trong VBA có hàm evaluate() để tính toán.

Đây là đoạn code lụm được trên net, hình như là bên Giải pháp Excel thì phải:

Public Function Gtr(Dulieu As String, Optional Pcach = ",")
Dim i, temp
If Len(Dulieu) = 0 Then Exit Function
Dulieu = Replace(Dulieu, Pcach, "")
Dulieu = Replace(Dulieu, ",", ".")
For i = 1 To Len(Dulieu)
Select Case Mid(Dulieu, i, 1)
Case "x": temp = temp & "*"
Case ":": temp = temp & "/"
Case "+", "-", "*", "/", "(", ")", ".", 0 To 9: temp = temp & Mid(Dulieu, i, 1)
End Select
Next i
For i = 1 To Len(Dulieu)
Select Case Right(temp, 1)
Case "-", "+", "*", "/": temp = Left(temp, Len(temp) - 1)
End Select
Next
Gtr = Evaluate(temp)
End Function
Như vậy ở trên có xét đến thông thường người Việt ta dùng dấu thập phân là dấu phẩy.
Khi đó cần báo cho biết trong công thức thì dấu phẩy là dấu thập phân.
VD: = Gtr("2,5 * 4", ",") kết quả là 10
 

atmt17

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Cách khác dùng hàm macro 4 mà ít người biết đến:
- Đặt con trỏ chuột tại dòng 2 (cell nào cũng được)
- Bấm Ctrl + F3 để vào Define name
- Khung Names in Workbook gõ chử Tinh
- Khung Refers to gõ công thức: =Evaluate($A2) (chú ý dấu $)
- OK quay lại bảng tính. Tại cell B2, gõ công thức =Tinh
- Có thể kéo fill xuống nếu muốn tính co A3, A4...
Thử xem!
Nếu muốn viết thành 1 UDF cũng có thể áp dụng các hàm macro 4 cho ngắn gọn
 

phatnq2002

Tích cực giảm cân...
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Cách khác dùng hàm macro 4 mà ít người biết đến:
- Đặt con trỏ chuột tại dòng 2 (cell nào cũng được)
- Bấm Ctrl + F3 để vào Define name
- Khung Names in Workbook gõ chử Tinh
- Khung Refers to gõ công thức: =Evaluate($A2) (chú ý dấu $)
- OK quay lại bảng tính. Tại cell B2, gõ công thức =Tinh
- Có thể kéo fill xuống nếu muốn tính co A3, A4...
Thử xem!
Nếu muốn viết thành 1 UDF cũng có thể áp dụng các hàm macro 4 cho ngắn gọn
Hiện tại với Excel 2003 trở lên, bạn sẽ không thể dùng hàm Macro Excel 4 vì nó không tích hợp sẵn, ngay cả trong các Add-ins đính kèm.

Nếu bạn muốn người khác sử dụng các hàm macro Excel 4 thì bạn cần phải chỉ cho người khác biết là phải add cái thư viện đó vào như thế nào và từ đâu. Nếu không, ý kiến của bạn trở nên vô dụng.
 

muontennguoi

Member
Thành viên BQT
Super Moderators
Ðề: Chuyển một chuỗi dạng công thức

Nếu bạn dùng đoạn code tôi đã đưa ở trên thì sẽ có nhiều ứng dụng cần xài tới.
Ví dụ bạn là quyết toán công trình xây dựng thường bạn lên bảng Excel là:

Công việc | số tiền
công sơn lót= 2m * 6m * 2 lần | xxx đ
Công sơn phủ= 2m * 8m * 3 lần | yyy đ

Ở đoạn code trên bạn sẽ thấy là ô B2 có công thức "=gtri(A2)" mà A2 là "công sơn lót= 2m * 6m * 2 lần" gồm cả số lẫn chữ trong đó.
Đoạn code sẽ lọc các con số để tính toán, còn chữ thì bỏ qua.
 

atmt17

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Hiện tại với Excel 2003 trở lên, bạn sẽ không thể dùng hàm Macro Excel 4 vì nó không tích hợp sẵn, ngay cả trong các Add-ins đính kèm.

Nếu bạn muốn người khác sử dụng các hàm macro Excel 4 thì bạn cần phải chỉ cho người khác biết là phải add cái thư viện đó vào như thế nào và từ đâu. Nếu không, ý kiến của bạn trở nên vô dụng.
Có chứ anh! Tôi đang xài Excel 2003 và cả Excel 2007. Tôi xài macro 4 bình thường
Vấn đề không phải nằm ở chổ biến dấu x thành dấu * hay biến dấu : thành dấu /
Ý tôi muốn nói thay vì anh phải dùng For thì ta dùng macro 4 (hàm Evaluate) để biến chuổi công thức thành giá trị
Không tin anh có thể thử (cái này bên www.giaiphapexcel.com có đầy)
 
Sửa lần cuối:

muontennguoi

Member
Thành viên BQT
Super Moderators
Ðề: Chuyển một chuỗi dạng công thức

Xài được.
Nhưng chẳng ai đi ngược thời đại.
Trong khi VBA là ngôn ngữ hổ trợ hướng đối tượng còn Macro 4 thì rất nghèo nàn, còn kém hơn cả VB trình thông dịch đời đầu nữa à.
Cách làm như bạn thì cũng chỉ mới là 1 dòng cuối của đoạn function trên do đó không thể nói là macro 4 ngắn gọn hơn.
Nếu muốn làm được công việc như cả function đó làm mà dùng macro 4 thì sẽ dài dòng hơn nhiều.

===

Nhiều khi người hỏi đưa câu hỏi không rõ ràng, nhưng ta cần nghĩ rằng trên diễn đàn này là những người đã đi làm.
Câu hỏi của người ta thường gắn với 1 công việc nào đó chứ không phải là học sinh mới làm quen với máy tính.
1 cái hàm evaluate() chẳng giúp ích được gì cả.

===

Trong đoạn code có đoạn:

Case ":": temp = temp & "/"

Bạn nên bỏ dòng này vì nó sẽ biến dấu ":" thành dấu chia.
Nhưng thường thì trong hành văn ta cũng ưa sử dụng dấu ":" mà không phải là dấu chia. Ví dụ "Công sơn lót : 2m x 6m x 2 lần x 1000đ"

Đoạn code đó nhìn chung vẫn còn là rất đơn sơ. Trong công việc cụ thể của mình, theo thói quen hành văn của mình, bạn hãy thêm mắm thêm muối cho phù hợp.
 

yeudoi

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Cái này mình thấy đơn giản mà mọi người cứ nói tùm lum hêt. Bạn làm như sau:
Function tinh(chu As String)
tinh = Evaluate(chu)
End Function
VD: A2=1+2
B2 = Tinh(A2)
 

phatnq2002

Tích cực giảm cân...
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Có chứ anh! Tôi đang xài Excel 2003 và cả Excel 2007. Tôi xài macro 4 bình thường
Vấn đề không phải nằm ở chổ biến dấu x thành dấu * hay biến dấu : thành dấu /
Ý tôi muốn nói thay vì anh phải dùng For thì ta dùng macro 4 (hàm Evaluate) để biến chuổi công thức thành giá trị
Không tin anh có thể thử (cái này bên www.giaiphapexcel.com có đầy)
Ý tôi muốn nói rằng, để xài được cái Excel Macro 4 thì bạn phải khuyến cáo hay hướng dẫn người ta cách nào cài thư viện của nó để xài. Bởi vì, khi cái đặt Excel, tôi không cài đặt cái thư viện của Excel macro 4 vì như bác mượn nói, nó xưa rồi và "tiềm tàng hiểm họa". Muốn sử dụng nó, khi cài đặt phải tick vào để chọn hoặc cài Full.

Cái cách của bác mượn cũng có "hơi hám" từ giaiphapexcel đấy, và theo tôi đó là một trong những cách giải quyết tốt. Tốt là vì vẫn để cho người ta nhập theo thói quen, khi xử lý sẽ chuyển về chuẩn chung để máy tính (hay Excel) hiểu.
 

atmt17

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Ý tôi muốn nói rằng, để xài được cái Excel Macro 4 thì bạn phải khuyến cáo hay hướng dẫn người ta cách nào cài thư viện của nó để xài. Bởi vì, khi cái đặt Excel, tôi không cài đặt cái thư viện của Excel macro 4 vì như bác mượn nói, nó xưa rồi và "tiềm tàng hiểm họa". Muốn sử dụng nó, khi cài đặt phải tick vào để chọn hoặc cài Full..
Ah... không anh à! Cứ cài Office bình thường là được
Trước giờ chưa từng nghe ai nói về những trục trặc khi xài macro 4 cả!
Anh cứ thử vào bất kỳ máy nào xem, bảo đãm không lổi gì cả
-----------------------------------------------------------------------------------------
Xài được.
Nhưng chẳng ai đi ngược thời đại.
Trong khi VBA là ngôn ngữ hổ trợ hướng đối tượng còn Macro 4 thì rất nghèo nàn, còn kém hơn cả VB trình thông dịch đời đầu nữa à.
.
Ấy... cái này còn tùy... Macro là thứ đồ cổ, nhưng cái gì thuộc về tinh hoa thì ta cứ lấy ra xài
Lấy 1 ví dụ cho anh đây:
- Tạo cột số thứ tự từ A1 đến A65536, với A1 = 1, A2 = 2... đến A65536 = 65536
Với bài toán trên mà anh dùng For thì ăn chắc không bao giờ tốc độ nhanh được
Với macro 4, bài toán trên được giải quyết trong tích tắc
Anh thử xem!
Nói thêm: Có rất nhiều bài toán mà nếu anh dùng VBA theo cách thông thường sẽ rất khó giải quyết, thậm chí là không giải quyết được, trong khi macro 4 lại làm tốt điều này.
Một trong những bài toán mà tôi muốn nói đến đó là: LẤY DỬ LIỆU TỪ 1 FILE ĐANG ĐÓNG
Tôi nói thế không có ý cho rằng VBA thua Macro 4, chỉ muốn nói: TÙY VIỆC MÀ CHỌN CÔNG CỤ PHÙ HỢP. Cái này tối ưu nhất thì ta xài
 
Sửa lần cuối:

thuydhpy

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

công thức của bác Yeudoi thì gọn nhưng chưa giải quyết được các dữ liệu thực tế của bên hạch toán công trình, theo bác Mượn thì y bài rồi - không cần bàn cãi gì nữa.
 

muontennguoi

Member
Thành viên BQT
Super Moderators
Ðề: Chuyển một chuỗi dạng công thức

Ấy... cái này còn tùy... Macro là thứ đồ cổ, nhưng cái gì thuộc về tinh hoa thì ta cứ lấy ra xài
Lấy 1 ví dụ cho anh đây:
- Tạo cột số thứ tự từ A1 đến A65536, với A1 = 1, A2 = 2... đến A65536 = 65536
Với bài toán trên mà anh dùng For thì ăn chắc không bao giờ tốc độ nhanh được
Với macro 4, bài toán trên được giải quyết trong tích tắc
Anh thử xem!
Nói thêm: Có rất nhiều bài toán mà nếu anh dùng VBA theo cách thông thường sẽ rất khó giải quyết, thậm chí là không giải quyết được, trong khi macro 4 lại làm tốt điều này.
Một trong những bài toán mà tôi muốn nói đến đó là: LẤY DỬ LIỆU TỪ 1 FILE ĐANG ĐÓNG
Tôi nói thế không có ý cho rằng VBA thua Macro 4, chỉ muốn nói: TÙY VIỆC MÀ CHỌN CÔNG CỤ PHÙ HỢP. Cái này tối ưu nhất thì ta xài

Bạn chưa hiểu ý tôi.
Có phải là chỉ với 1 hàm duy nhất thì bạn bắt buộc gõ vào ô A2 một chuỗi chỉ gồm các số và các toán tử thì mới tính được, đúng không?

Còn đoạn code VBA kia thì xử lý một câu văn để biến đổi nó về dạng ký pháp toán học rồi sau đó mới tính giá trị.

Nếu dùng Macro 4 thì vẫn tính toán y như thế được. Tuy nhiên tất cả các dòng lệnh sẽ nằm trực tiếp trên sheet.
Và nó sẽ dài dòng hơn so với VBA, và thường sẽ chạy chậm hơn.

Nếu bạn chỉ dùng duy nhất 1 hàm như bạn đã làm thì: Bạn phải gõ lại các con số và toán tử vào 1 ô nào đó để từ đó tính evaluate().
Hiển nhiên việc gõ lại sẽ chậm hơn so với dùng code xử lý. Chứ thực tế đâu có dễ ăn dữ vậy. Đâu có ai làm sẵn cho mình.

Bạn hiếm khi có sẵn (trong thực tế) các ô có giá trị: "(2*6*2*1000)"
Mà Bản quyết toán công trình người ta gửi cho bạn sẽ có các ô chứa các câu văn như: "Công sơn lót : 2m x 6m x 2 lần x 1000đ"
Thường thì một bản quyết toán sẽ có hàng nghìn dòng như vậy.

Bạn hãy lấy 1 file Quyết toán công trình trong thực tế ra thì sẽ hiểu ở đây đang nói về cái gì.

Do bạn mới tham gia DKT nên có thể bạn chưa quen biết nhiều người ở đây.
Có vài người thành thạo hàng chục ngôn ngữ lập trình, thuydhpy hoàn toàn có thể là 1 trong số đó.
 

atmt17

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Bạn chưa hiểu ý tôi.
Có phải là chỉ với 1 hàm duy nhất thì bạn bắt buộc gõ vào ô A2 một chuỗi chỉ gồm các số và các toán tử thì mới tính được, đúng không?

Còn đoạn code VBA kia thì xử lý một câu văn để biến đổi nó về dạng ký pháp toán học rồi sau đó mới tính giá trị.

Nếu dùng Macro 4 thì vẫn tính toán y như thế được. Tuy nhiên tất cả các dòng lệnh sẽ nằm trực tiếp trên sheet.
Và nó sẽ dài dòng hơn so với VBA, và thường sẽ chạy chậm hơn.

Nếu bạn chỉ dùng duy nhất 1 hàm như bạn đã làm thì: Bạn phải gõ lại các con số và toán tử vào 1 ô nào đó để từ đó tính evaluate().
Hiển nhiên việc gõ lại sẽ chậm hơn so với dùng code xử lý. Chứ thực tế đâu có dễ ăn dữ vậy. Đâu có ai làm sẵn cho mình.

Bạn hiếm khi có sẵn (trong thực tế) các ô có giá trị: "(2*6*2*1000)"
Mà Bản quyết toán công trình người ta gửi cho bạn sẽ có các ô chứa các câu văn như: "Công sơn lót : 2m x 6m x 2 lần x 1000đ"
Thường thì một bản quyết toán sẽ có hàng nghìn dòng như vậy.

Bạn hãy lấy 1 file Quyết toán công trình trong thực tế ra thì sẽ hiểu ở đây đang nói về cái gì.

Do bạn mới tham gia DKT nên có thể bạn chưa quen biết nhiều người ở đây.
Có vài người thành thạo hàng chục ngôn ngữ lập trình, thuydhpy hoàn toàn có thể là 1 trong số đó.
Vâng, đúng tôi là người mới thật, cũng chưa quen ai trên diển đàn này.
Về kế toán thì tôi cũng là dân ngoại đạo. Còn nói về lập trình thì tôi cũng chỉ mới tập tành, là hạt cát giữa sa mạc thôi... Hi.. hi..
Quả đúng là mình chưa hiểu ý nhau lắm. Tuy nhiên tôi vẫn cho rằng với ví dụ: 2m x 6m x 2 lần x 1000đ thì tôi cũng chẳng phải gõ bằng tay gì cả. Tôi dùng SUBSTITUTE để biến mấy chử m, đ thành rổng, biến x thành *, biến : thành / ... (như bạn đã làm trong code đấy thôi)... Và cuối cùng vẫn phải EVALUATE (không tránh đâu được)
Chỉ là vài ý kiến nhỏ, có gì không phải mong bạn bỏ qua cho!
 

atmt17

Member
Hội viên mới
Ðề: Chuyển một chuỗi dạng công thức

Tôi gữi các bạn 1 UDF do tôi tự chế, không có vòng lập nào:
PHP:
Function ValExp(Cell As Range) As String
  Dim Temp, Temp1
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp1 = Replace(Cell, "[", "(")
  Temp1 = Replace(Temp1, "]", ")")
  Temp1 = Replace(Temp1, "{", "(")
  Temp1 = Replace(Temp1, "}", ")")
  Temp1 = Replace(Temp1, "x", "*")
  Temp1 = Replace(Temp1, ":", "/")
  Temp.Pattern = "[^0-9,+,.,*,/,:,(,),-]"
  ValExp = Evaluate(Temp.Replace(Temp1, ""))
End Function
Thử tính chuổi:
=ValExp("công sơn lót= 2m * 6m * 2 lần")
có phải = 24 không?
 
Sửa lần cuối:

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Kỹ thuật giải trình thanh tra BHXH

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top