Liệt kê tất cả dạng ví dụ lênAnh/ chị chỉ giúp em làm thế nào chỉ replace "*" và "/" nội dung trong dấu ngoặc ( ) bằng "x" và ":" ví dụ như sau:
Đầu vào 2*(1+1*12)*(2+2*2)*(3*2/10)/100
Kết quả 2*(1+1x12)*(2+2x2)*(3x2:10)/100
Bài toán của em đây. Anh giúp em với ạ
Nội dung =0,096 hoặc tương tự là do em copy từ file người đi trước làm bằng phần mềm dự toán ra nó có kết quả tính toán của dãy số đó, cái đó em chưa xóa hết ạ. Em mong muốn bổ sung ở cột D tách sau dấu : và bỏ kí tự từ sau dấu "=" đi ạ.
Kết quả là: 1*1*(((3,0+0,76-0,11)x2)+(6,0+0,76x2))*0,65/100 tươn ứng với công thức tổng quát của em là (Số lượng)*(Dài)*(Rộng)*(Cao)/Hệ số phụ. Ở cột E luôn luôn chỉ còn tồn tai 3 dấu "*" thôi ạ
Function BieuThuc(ByVal iStr As String, Optional ByVal iType As Byte = 0) As String
Dim tmp As String, n As Byte, k As Byte
Dim i As Integer, d As Integer, iFist As Integer, iLast As Integer
iFist = InStr(1, iStr, ":") + 1
If iFist > 1 Then iFist = iFist + 1
If Mid(iStr, iFist, 1) = "-" Then iFist = iFist + 1
iLast = InStr(1, iStr, "=") - 2
If iLast = -2 Then iLast = Len(iStr)
If iLast < iFist Then BieuThuc = "": Exit Function
iStr = Mid(iStr, iFist, iLast - iFist + 1)
d = Len(iStr)
iFist = InStr(1, iStr, "(")
Do While iFist > 0
k = 0
For i = iFist To d
If Mid(iStr, i, 1) = "(" Then
k = k + 1
ElseIf Mid(iStr, i, 1) = ")" Then
k = k - 1
If k = 0 Then iFist = InStr(i + 1, iStr, "("): Exit For
ElseIf Mid(iStr, i, 1) = "*" Then
Mid(iStr, i, 1) = "x"
ElseIf Mid(iStr, i, 1) = "/" Then
Mid(iStr, i, 1) = ":"
End If
Next i
Loop
n = Len(iStr) - Len(Replace(iStr, "*", ""))
If n = 1 Then tmp = "1*1*" Else If n = 2 Then tmp = "1*"
tmp = tmp & iStr
Select Case iType
Case 1
BieuThuc = Split(tmp, "*")(0)
Case 2
BieuThuc = Split(tmp, "*")(1)
Case 3
BieuThuc = Split(tmp, "*")(2)
Case 4
BieuThuc = Split(Split(tmp, "*")(3), "/")(0)
Case 5
BieuThuc = Split(Split(tmp, "*")(3), "/")(1)
Case Else
BieuThuc = tmp
End Select
End Function
Xem cách dùng Function trong file
Mã:Function BieuThuc(ByVal iStr As String, Optional ByVal iType As Byte = 0) As String Dim tmp As String, n As Byte, k As Byte Dim i As Integer, d As Integer, iFist As Integer, iLast As Integer iFist = InStr(1, iStr, ":") + 1 If iFist > 1 Then iFist = iFist + 1 If Mid(iStr, iFist, 1) = "-" Then iFist = iFist + 1 iLast = InStr(1, iStr, "=") - 2 If iLast = -2 Then iLast = Len(iStr) If iLast < iFist Then BieuThuc = "": Exit Function iStr = Mid(iStr, iFist, iLast - iFist + 1) d = Len(iStr) iFist = InStr(1, iStr, "(") Do While iFist > 0 k = 0 For i = iFist To d If Mid(iStr, i, 1) = "(" Then k = k + 1 ElseIf Mid(iStr, i, 1) = ")" Then k = k - 1 If k = 0 Then iFist = InStr(i + 1, iStr, "("): Exit For ElseIf Mid(iStr, i, 1) = "*" Then Mid(iStr, i, 1) = "x" ElseIf Mid(iStr, i, 1) = "/" Then Mid(iStr, i, 1) = ":" End If Next i Loop n = Len(iStr) - Len(Replace(iStr, "*", "")) If n = 1 Then tmp = "1*1*" Else If n = 2 Then tmp = "1*" tmp = tmp & iStr Select Case iType Case 1 BieuThuc = Split(tmp, "*")(0) Case 2 BieuThuc = Split(tmp, "*")(1) Case 3 BieuThuc = Split(tmp, "*")(2) Case 4 BieuThuc = Split(Split(tmp, "*")(3), "/")(0) Case 5 BieuThuc = Split(Split(tmp, "*")(3), "/")(1) Case Else BieuThuc = tmp End Select End Function
------------------------- Tham Khảo---------------------------------------------
Kiểm thử kết quả Mảng trong Immediate với hàm dbPrint
Đánh thứ tự ký tự bằng Hàm hoặc Code - Sử dụng toán chỉnh hợp
Bài này thì đúng là nên dùng regexp, nhưng không dễ ăn, bạn có cách nào khác dùng regexp cho tôi tham khảo với.
Function repl(ByVal str As String, ByVal n As Long) As String
Static reg As Object
str = StrReverse(str)
If reg Is Nothing Then Set reg = CreateObject("vbscript.regexp")
reg.Pattern = "(?:([\d\,]+))(?:\/(\).*\(|[\d\,]+))" & Application.Rept("(?:\*(\).*\(|[\d\,]+))?", 3)
If reg.test(str) Then
repl = Replace(Replace(StrReverse(reg.Execute(str)(0).SubMatches(5 - n)), "*", "x"), "/", ":")
If repl = Empty Then repl = 1
Else
repl = ""
End If
End Function
Nhìn tùy biến các tham số của regexp rối quá nên mình không bao giờ dùng
Lúc đầu chưa biết nhìn thì rối thật nhưng sau khi đã học sâu thì tuyệt vời.Nhìn tùy biến các tham số của regexp rối quá nên mình không bao giờ dùng![]()
Dữ liệu ở đây không hoàn toàn chuẩn. Nếu đạt đến trình độ lập mẫu pattern động, uyển chuyển thì mới xứng đáng từ "tuyệt vời".Lúc đầu chưa biết nhìn thì rối thật nhưng sau khi đã học sâu thì tuyệt vời.
"Tuyệt vời" của mình là với tài nguyên hạn chế vẫn giải quyết được vấn đề, chỉ khi nào không còn cách mới dùng tới "búa tạ"Lúc đầu chưa biết nhìn thì rối thật nhưng sau khi đã học sâu thì tuyệt vời.