Giúp đọc chuỗi công thức thành kết quả. (1 người xem)

Liên hệ QC

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

Vinh TN

Thành viên mới
Tham gia
27/12/18
Bài viết
12
Được thích
0
Chào các bác trong diễn đàn. Mình có 1 vấn đề nhờ giúp đỡ. Bên mảng dự toán xây dựng (Bắc Nam, Eta, G8,...) thường hay có maccro đọc chuỗi thành số (cột D là công thức, Cột E sẽ tự động ra kết quả là số). Mình đã thử tách file maccro của phần mềm sang máy thường để sử dụng nhưng không được. Nhờ diễn đàn phân tìm giải pháp giúp chứ mỗi dự án phải mua 1 phần mềm riêng để đọc thì ốm đòn.
Cảm ơn cả nhà trước.
 

File đính kèm

Chào các bác trong diễn đàn. Mình có 1 vấn đề nhờ giúp đỡ. Bên mảng dự toán xây dựng (Bắc Nam, Eta, G8,...) thường hay có maccro đọc chuỗi thành số (cột D là công thức, Cột E sẽ tự động ra kết quả là số). Mình đã thử tách file maccro của phần mềm sang máy thường để sử dụng nhưng không được. Nhờ diễn đàn phân tìm giải pháp giúp chứ mỗi dự án phải mua 1 phần mềm riêng để đọc thì ốm đòn.
Cảm ơn cả nhà trước.
Copy addins sau theo file sang máy không có là sẽ đọc được
C:\Users\.......AppData\Roaming\Microsoft\Excel\XLSTART\NOISUY.VIR'
... là trên user trên máy tính của bạn
sang máy mới thì add addins đó vào
 
Chào các bác trong diễn đàn. Mình có 1 vấn đề nhờ giúp đỡ. Bên mảng dự toán xây dựng (Bắc Nam, Eta, G8,...) thường hay có maccro đọc chuỗi thành số (cột D là công thức, Cột E sẽ tự động ra kết quả là số). Mình đã thử tách file maccro của phần mềm sang máy thường để sử dụng nhưng không được. Nhờ diễn đàn phân tìm giải pháp giúp chứ mỗi dự án phải mua 1 phần mềm riêng để đọc thì ốm đòn.
Cảm ơn cả nhà trước.
Của bạn đây.! dùng hàm tự tạo nhé!!!!!!

Function Congthuc(chuoi)
Set obj = CreateObject("vbscript.regexp")
obj.Global = True
obj.Pattern = "[a-zA-Z\s\$]*"
Congthuc = Evaluate(obj.Replace(Replace(chuoi, ",", "."), ""))
End Function
 

File đính kèm

Chào các bác trong diễn đàn. Mình có 1 vấn đề nhờ giúp đỡ. Bên mảng dự toán xây dựng (Bắc Nam, Eta, G8,...) thường hay có maccro đọc chuỗi thành số (cột D là công thức, Cột E sẽ tự động ra kết quả là số). Mình đã thử tách file maccro của phần mềm sang máy thường để sử dụng nhưng không được. Nhờ diễn đàn phân tìm giải pháp giúp chứ mỗi dự án phải mua 1 phần mềm riêng để đọc thì ốm đòn.
Cảm ơn cả nhà trước.
Giúp bạn thêm một Hàm sử dụng Regular Expression (rất dễ học, học nhanh).
Cần thêm các Win API : Microsoft Scripting Runtime, Microsoft Regular expression 1.0 - > 5.5
Trong của sổ VBA -> Tools -> References... tìm và Tick


Diễn giải:
RegExp sẽ tìm các ký tự trong chuỗi. Nếu không phải là 0-9 , +, -, *, ( , ), ^, . thì lấy, sau đó thay thế chúng thành Rỗng
thì các ký tự còn lại sẽ là 0-9 , +, -, *, ( , ), ^, .
Sử dụng:
A1 = ReFormula("Tính1+2") -> 3 (Trả kết quả phép tính)
B1 = ReFormula("Tính1+2", False) -> "1+2" (Trả lại Phép tính)
Lời khuyên: Những hàm dạng này đã được các Thầy Cô, Anh chị trên GPE đã đăng rất nhiều. Bạn nên tìm kiếm trước khi đăng bài
PHP:
  Function ReFormula(Text As String, Optional Eval As Boolean = True, Optional usedDot As Boolean = True) As Variant
    Text = iif (usedDot = True, Text, Replace(Replace(Text, "." , ""), "," , "."))
    With CreateObject("VbScript.RegExp")' Hoặc With New RegExp
      .Global = True
      .Pattern = "[^0-9\+\-\*\/\(\)\^\.]"
      ReFormula = IIf(Eval, Evaluate(.Replace(Text, "")), .Replace(Text, ""))
    End With
  End Function
 
Lần chỉnh sửa cuối:
Ai lại chơi kiểu (2.4+1)*0.5=1,7 hoặc (2,4+1)*0,5=1.7
 
Ai lại chơi kiểu (2.4+1)*0.5=1,7 hoặc (2,4+1)*0,5=1.7
Nguyên tắc phải như thế này ...

1. Trong chuỗi vd. (2.4+1)*0.5 chỉ được phép dùng dấu thập phân, không dùng dấu phân cách hàng nghìn.

2. Trong chuỗi (2.4+1)*0.5 có thể dùng dấu chấm hoặc phẩy tùy ý, tức thậm chí trong cùng tập tin ở dòng này dùng dấu phẩy ở dòng khác dùng dấu chấm. Tại sao? Nếu trong system của tôi dấu phẩy là dấu thập phân thì dĩ nhiên theo thói quen tôi sẽ nhập (2,4+1)*0,5. Nhưng khi tôi gửi tập tin cho đồng nghiệp mà trong system của họ dấu chấm lại là dấu thập phân thì sao? Hoặc trường hợp ngược lại.

Vì thế nhiệm vụ của code là phải chuyển tất cả các dấu chấm hoặc phẩy có trong biểu thức thành dấu chấm vì Evaluate luôn chỉ chấp nhận dấu chấm trong biểu thức bất luận system dùng dấu gì là dấu thập phân. Lúc này thì với dữ liệu đã có sẵn vd. (2,4+1)*0,5 thì Evaluate sẽ trả về cùng kết quả. Nhưng trên máy tôi thì kết quả là 1,7 (dấu phẩy như thiết lập trong system), còn trên máy đồng nghiệp thì là 1.7
 
Chào các bác trong diễn đàn. Mình có 1 vấn đề nhờ giúp đỡ. Bên mảng dự toán xây dựng (Bắc Nam, Eta, G8,...) thường hay có maccro đọc chuỗi thành số (cột D là công thức, Cột E sẽ tự động ra kết quả là số). Mình đã thử tách file maccro của phần mềm sang máy thường để sử dụng nhưng không được. Nhờ diễn đàn phân tìm giải pháp giúp chứ mỗi dự án phải mua 1 phần mềm riêng để đọc thì ốm đòn.
Cảm ơn cả nhà trước.
Thử hàm này xem máy bạn có nhận không nhé
Mã:
Option Explicit

Public Function KetQua(Chuoi As String)
Dim Chuoi_
If Chuoi = "" Then
    KetQua = ""
Else
    Chuoi_ = Replace(Chuoi, ",", ".")
    KetQua = Evaluate(Chuoi_)
End If
End Function
 
Nguyên tắc phải như thế này ...

1. Trong chuỗi vd. (2.4+1)*0.5 chỉ được phép dùng dấu thập phân, không dùng dấu phân cách hàng nghìn.

2. Trong chuỗi (2.4+1)*0.5 có thể dùng dấu chấm hoặc phẩy tùy ý, tức thậm chí trong cùng tập tin ở dòng này dùng dấu phẩy ở dòng khác dùng dấu chấm. Tại sao? Nếu trong system của tôi dấu phẩy là dấu thập phân thì dĩ nhiên theo thói quen tôi sẽ nhập (2,4+1)*0,5. Nhưng khi tôi gửi tập tin cho đồng nghiệp mà trong system của họ dấu chấm lại là dấu thập phân thì sao? Hoặc trường hợp ngược lại.

Vì thế nhiệm vụ của code là phải chuyển tất cả các dấu chấm hoặc phẩy có trong biểu thức thành dấu chấm vì Evaluate luôn chỉ chấp nhận dấu chấm trong biểu thức bất luận system dùng dấu gì là dấu thập phân. Lúc này thì với dữ liệu đã có sẵn vd. (2,4+1)*0,5 thì Evaluate sẽ trả về cùng kết quả. Nhưng trên máy tôi thì kết quả là 1,7 (dấu phẩy như thiết lập trong system), còn trên máy đồng nghiệp thì là 1.7
Dạ vâng ạ. Hôm trước cháu nhớ cũng đọc 1 bài của Chú hướng dẫn. Nhưng Cháu tìm không được. Chiều nay Cháu mới có ý tưởng là dùng Application.DecimalSeparator và Anh Hữu Thẳng cũng đã đề cập như vấn đề Chú nói ở trên ạ
Cháu sử dụng cái Application.International(xlDecimalSeparator) chuỗi về số sai Chú ạ.
Cháu mong Chú giúp đỡ ạ
 
Lần chỉnh sửa cuối:
Dạ vâng ạ. Hôm trước cháu nhớ cũng đọc 1 bài của Chú hướng dẫn. Nhưng Cháu tìm không được. Chiều nay Cháu mới có ý tưởng là dùng Application.DecimalSeparator và Anh Hữu Thẳng cũng đã đề cập như vấn đề Chú nói ở trên ạ
Cháu sử dụng cái Application.International(xlDecimalSeparator) chuỗi về số sai Chú ạ.
Cháu mong Chú giúp đỡ ạ
. Xét ký tự thứ hai của kết quả phép chia 1/2
 
Dạ vâng ạ. Hôm trước cháu nhớ cũng đọc 1 bài của Chú hướng dẫn. Nhưng Cháu tìm không được. Chiều nay Cháu mới có ý tưởng là dùng Application.DecimalSeparator và Anh Hữu Thẳng cũng đã đề cập như vấn đề Chú nói ở trên ạ
. Xét ký tự thứ hai của kết quả phép chia 1/2
Dạ. Em nhớ bài hôm đó là dùng công thức lấy 1/2 ạ. Cái này cũng giống như mình dùng Application.DecimalSeparator phải không Anh
 
Dạ vâng ạ. Hôm trước cháu nhớ cũng đọc 1 bài của Chú hướng dẫn. Nhưng Cháu tìm không được. Chiều nay Cháu mới có ý tưởng là dùng Application.DecimalSeparator và Anh Hữu Thẳng cũng đã đề cập như vấn đề Chú nói ở trên ạ
Cháu sử dụng cái Application.International(xlDecimalSeparator) chuỗi về số sai Chú ạ.
Cháu mong Chú giúp đỡ ạ
Nhưng bạn muốn dùng Evaluate trong VBA hay trong Name.
Trong VBA thì chuyển hết về dấu chấm thôi. Tức chuyển dấu phẩy thành dấu chấm, vì dấu chấm thì không cần chuyển nữa.
Ngoài ta nếu có
Mã:
Dim a As Double
    a = Evaluate(...)
Thì a chắc chắn là số. Khi đập xuống sheet thì nó sẽ có dấu chấm hoặc phẩy tùy theo thiết lập của system.

Còn nếu dùng Evalute trong Name thì khi mở ở 2 máy mà 1 máy thiết lập dấu chấm một máy thiết lập dấu phẩy thì cho dù cột D là dạng 1.5*2.34+12.4 hay 1,5*2,34+12,4
thì cũng chỉ đúng trên 1 máy còn máy kia sẽ hiện lỗi.
 
Web KT

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

Back
Top Bottom