Giúp về hàm tự tạo biến chuỗi biểu thức thành giá trị

Liên hệ QC

hppavilion

Thành viên mới
Tham gia
22/11/07
Bài viết
3
Được thích
1
Tôi có vấn đề thế này :
nhập diễn giãi vào cell A1 "DK1:2x(34+56)/53x47"
nhập hàm tự tạo RemoveNonNumeric " suu tam của anh em " ra kết quả : "2x(34+56)/53x47"
Và kết quả mình mong muốn là con số kết quả "159.6226415"
Vậy nhờ anh em chỉ giáo giúp mình với

PHP:
Function RemoveNonNumeric(sNumberToClean As String) As String
  Const NUMERIC_CHARS = "0123456789.,x,*,+,-,/,^,(,),=,:"
  Dim lThisChar As Long
  Dim sResult As String
  Dim i As Long
  '  *   '
  For i = 1 To Len(sNumberToClean)
            Var = Mid(sNumberToClean, i, 1)
            If Var = ":" Then
               sNumberToClean = Mid(sNumberToClean, i + 1, Len(sNumberToClean) - i)
               Exit For
            End If
  Next
  '   *    ' 
  For lThisChar = 1 To Len(sNumberToClean)
    If InStr(1, NUMERIC_CHARS, Mid$(sNumberToClean, lThisChar, 1)) > 0 Then
       'Found a numeric character'
       sResult = sResult + Mid$(sNumberToClean, lThisChar, 1)
    End If
  Next
  'Return the result
  RemoveNonNumeric = sResult
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi có vấn đề thế này :
nhập diễn giãi vào cell A1 "DK1:2x(34+56)/53x47"
nhập hàm tự tạo RemoveNonNumeric " suu tam của anh em " ra kết quả : "2x(34+56)/53x47"
Và kết quả mình mong muốn là con số kết quả "159.6226415"
Vậy nhờ anh em chỉ giáo giúp mình với



Function RemoveNonNumeric(sNumberToClean As String) As String
Const NUMERIC_CHARS = "0123456789.,x,*,+,-,/,^,(,),=,:"
Dim lThisChar As Long
Dim sResult As String
Dim i As Long
'
For i = 1 To Len(sNumberToClean)
Var = Mid(sNumberToClean, i, 1)
If Var = ":" Then
sNumberToClean = Mid(sNumberToClean, i + 1, Len(sNumberToClean) - i)
Exit For
End If
Next
'
For lThisChar = 1 To Len(sNumberToClean)
If InStr(1, NUMERIC_CHARS, Mid$(sNumberToClean, lThisChar, 1)) > 0 Then
'Found a numeric character'
sResult = sResult + Mid$(sNumberToClean, lThisChar, 1)
End If
Next
'Return the result
RemoveNonNumeric = sResult
End Function

1. Thay các dấu nhân là "*" thay vì "x" như bạn đang làm.
2. Thay dòng
Mã:
RemoveNonNumeric = sResult
bằng dòng
Mã:
RemoveNonNumeric = Evaluate(sResult)
 
Upvote 0
Cái này khá giống việc tính diễn giải công việc trong lập dự toán xây dựng.
Tôi giải quyết như sau:
Quy định việc nhập số liệu, nếu cần chú thích mục diễn giải thì phải được ngăn cách bởi dấu hai chấm ":" với phần biểu thức diễn giải.
Khi tính toán thì kiểm tra xem nếu có chứa ký tự ":" thì cắt lấy phần biểu thức
If ỉnst(Chuoi,":")>0 then Chuoi = Trim(Split(Chuoi,":")(1))
Còn việc nhập dấu nhân bằng ký tự "x" thì không vì không thuận với bàn phím số, tuy nhiên để cho tiện cho thói quen người dùng thì cũng nên có thêm động tác Replace(Chuoi,"x","*") như hppavilion đã nói.
 
Upvote 0
Tôi có vấn đề thế này :
nhập diễn giãi vào cell A1 "DK1:2x(34+56)/53x47"
nhập hàm tự tạo RemoveNonNumeric " suu tam của anh em " ra kết quả : "2x(34+56)/53x47"
Và kết quả mình mong muốn là con số kết quả "159.6226415"
Vậy nhờ anh em chỉ giáo giúp mình với

Bạn ghi tiêu đề nghe sao sao ấy! Dể bị xóa bài quá
------------------------------------------------
Bạn dùng code này cho nó ngắn gọn nè:

PHP:
Function ValExp(Cell As String) As String
  Dim Temp1, Temp2
  Set Temp1 = CreateObject("VBScript.RegExp")
  Temp1.Global = True
  Temp2 = Mid(Cell, InStr(Cell, ":") + 1, Len(Cell) - InStr(Cell, ":"))
  Temp2 = Replace(Temp2, "[", "(")
  Temp2 = Replace(Temp2, "]", ")")
  Temp2 = Replace(Temp2, "{", "(")
  Temp2 = Replace(Temp2, "}", ")")
  Temp2 = Replace(Temp2, "x", "*")
  Temp1.Pattern = "[^0-9+.*/()-]"
  ValExp = Evaluate(Temp1.Replace(Temp2, ""))
End Function
Chẳng tốn 1 vòng lập nào
 
Upvote 0
Bạn ghi tiêu đề nghe sao sao ấy! Dể bị xóa bài quá
------------------------------------------------
Bạn dùng code này cho nó ngắn gọn nè:

PHP:
Function ValExp(Cell As String) As String
  Dim Temp1, Temp2
  Set Temp1 = CreateObject("VBScript.RegExp")
  Temp1.Global = True
  Temp2 = Mid(Cell, InStr(Cell, ":") + 1, Len(Cell) - InStr(Cell, ":"))
  Temp2 = Replace(Temp2, "[", "(")
  Temp2 = Replace(Temp2, "]", ")")
  Temp2 = Replace(Temp2, "{", "(")
  Temp2 = Replace(Temp2, "}", ")")
  Temp2 = Replace(Temp2, "x", "*")
  Temp1.Pattern = "[^0-9+.*/()-]"
  ValExp = Evaluate(Temp1.Replace(Temp2, ""))
End Function
Chẳng tốn 1 vòng lập nào

Cái này hay! Nhưng mà có cách nào cho nó hiểu luôn mấy hàm trong biểu thức ko? VD như nhập hàm sin hoặc cos nó không có hiểu :(
 
Upvote 0
Cái này hay! Nhưng mà có cách nào cho nó hiểu luôn mấy hàm trong biểu thức ko? VD như nhập hàm sin hoặc cos nó không có hiểu :(
Nếu đối số của các hàm SIN, COS, SUM, COUNT... là 1 số cụ thể nào đó (chứ không phải là tham chiếu qua 1 vùng) thì làm được
PHP:
Function ValExp(Exp As String)
  Dim Tmp
  With CreateObject("VBScript.RegExp")
    .Global = True
    Tmp = Mid(Exp, InStr(Exp, ":") + 1, Len(Exp) - InStr(Exp, ":"))
    Tmp = Replace(Tmp, "[", "(")
    Tmp = Replace(Tmp, "]", ")")
    Tmp = Replace(Tmp, "{", "(")
    Tmp = Replace(Tmp, "}", ")")
    Tmp = Replace(Tmp, "x", "*")
    .Pattern = "/d"
    ValExp = Evaluate(.Replace(Tmp, ""))
  End With
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom