lỗi code hiện công thức không hiểu số trong dấu ngoặc ( ) (2 người xem)

Liên hệ QC

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

phan_huythai

Thành viên chính thức
Tham gia
15/9/12
Bài viết
60
Được thích
1
các thầy giúp em với ạ. cái code của em nó không hiểu được tex trong ngoặc. Nên khi hiện công thức nó không hiện được các số trong ngoặc. các thầy sửa giúp em với ạ. Em xin cám ơn!
Option Explicit
Public Function ct(rngData As Range)
Dim strText As String, strText2 As String
Dim i As Long, j As Long, dem As Long
Dim subText() As String, dau() As String
Dim Res As Double
If rngData = "" Then Exit Function
strText = rngData.Formula


For i = 1 To Len(strText)
Select Case Mid(strText, i, 1)
Case "+", "-", "*", "/", "^"
ReDim Preserve dau(j)
dau(j) = Mid(strText, i, 1)
j = j + 1
End Select
Next i


strText = Replace(strText, "=", "")
strText = Replace(strText, "+", "@")
strText = Replace(strText, "-", "@")
strText = Replace(strText, "*", "@")
strText = Replace(strText, "/", "@")
strText = Replace(strText, "\", "@")
strText = Replace(strText, "^", "@")


strText = Trim(strText)


subText = Split(strText, "@")
For i = 0 To UBound(subText)
On Error Resume Next
If Not IsNumeric(subText(i)) Then
Err.Clear
Res = Application.WorksheetFunction.Find("(", subText(i))
If Err.Number = 0 Then
dem = 0
For j = 1 To Len(subText(i))
If Mid(subText(i), j, 1) = "(" Then dem = dem + 1
Next j
subText(i) = Replace(subText(i), "(", "")
If IsNumeric(subText(i)) Then
subText(i) = String(dem, "(") & subText(i)
Else
subText(i) = String(dem, "(") & Range(subText(i)).Value
End If
End If


Err.Clear
Res = Application.WorksheetFunction.Find(")", subText(i))
If Err.Number = 0 Then
dem = 0
For j = 1 To Len(subText(i))
If Mid(subText(i), j, 1) = ")" Then dem = dem + 1
Next j
subText(i) = Replace(subText(i), ")", "")
If IsNumeric(subText(i)) Then
subText(i) = subText(i) & String(dem, ")")
Else
subText(i) = Range(subText(i)).Value & String(dem, ")")
End If
End If


subText(i) = Range(subText(i)).Value


End If
Next i


ReDim Preserve dau(UBound(subText))
For i = 0 To UBound(subText)
strText2 = strText2 & Round(subText(i), 3) & dau(i)
Next i


ct = "= " & strText2
End Functionct1.jpg
 
các thầy giúp em với. em đang cần cái này để làm bài.
 
Upvote 0
hjx. em tải lên nó toàn báo " Invalid File ".
nên em đành tải lên mediafile mong thầy thông cảm cho em. http://www.mediafire.com/?z8o3qc0y89xysk6
thầy cố gắng giúp em với. em đang rất cần.

Bạn thử code này xem:
Mã:
Public Function ct(ByVal rCel As Range)
  Dim strText As String, strOp As String
  Dim tmp1 As String, tmp2 As String, ch As String
  Dim j As Long
  Dim Arr, sAddr
  strOp = "+-*/^()\"

  If rCel.HasFormula Then
    strText = rCel.Formula
    strText = Replace(strText, "=", "")
    strText = Replace(strText, " ", "")
    tmp1 = strText
    For j = 1 To Len(strOp)
      ch = Mid(strOp, j, 1)
      tmp1 = Replace(tmp1, ch, " ")
    Next
    tmp1 = WorksheetFunction.Trim(tmp1)
    Arr = Split(tmp1, " ")
    [COLOR=#ff0000]Arr = Sort1DArray(Arr, True, True)[/COLOR]
    For Each sAddr In Arr
      tmp2 = Evaluate(sAddr)
      strText = Replace(strText, sAddr, tmp2)
    Next
    ct = strText
  End If
End Function
(Chú ý chổ màu đỏ: Có dùng hàm hổ trợ Sort Array)
Code chỉ áp dụng đối với công thức chứa các phép tính +,-,*,/ bình thường thôi, nếu cell chứa các hàm phức tạp như SUM, IF gì gì đó... sai ráng chịu nha
--------------
Có lẽ còn phải sửa lại đôi chút (bạn tự mình suy nghĩ nha)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
em cám ơn thầy nhiều nhưng em còn 1 vấn đề muốn hỏi thầy là số sau dấu chấm quá nhiều số . em muốn làm chòn chỉ có 3 số sau dấu chấm thôi. em cũng đã thử nhưng nó toàn báo lỗi ( do trình độ em quá gà). nên em mong thầy giúp em với.
 
Upvote 0
em cám ơn thầy nhiều nhưng em còn 1 vấn đề muốn hỏi thầy là số sau dấu chấm quá nhiều số . em muốn làm chòn chỉ có 3 số sau dấu chấm thôi. em cũng đã thử nhưng nó toàn báo lỗi ( do trình độ em quá gà). nên em mong thầy giúp em với.

Trong code có đoạn
tmp2 = Evaluate(sAddr)
Muốn làm tròn bao nhiêu thì sửa chổ này, chẳng hạn:
tmp2 = Round(Evaluate(sAddr), 3)
-----------------
Xin nói thêm rằng code này vẫn còn 1 số vấn đề (mai này bạn xài sẽ phát hiện) ---> Vậy hãy tự sửa nhé
(tôi nghĩ giải thuật của code trên cũng khá đơn giản)
 
Lần chỉnh sửa cuối:
Upvote 0
em đang dùng code của thầy. em cũng đã thấy lỗi. em sẽ cố gắng nghiên cứu để sửa cho hoàn thiện. em mong thầy giúp đỡ em. em cám ơn thầy nhiều.!
 
Upvote 0
em đang dùng code của thầy. em cũng đã thấy lỗi. em sẽ cố gắng nghiên cứu để sửa cho hoàn thiện. em mong thầy giúp đỡ em. em cám ơn thầy nhiều.!

Thí nghiệm lại code mới này nhé:
Mã:
Public Function ct(ByVal rCel As Range)
  Dim strText As String, strOp As String
  Dim tmp1 As String, tmp2 As String, ch As String
  Dim j As Long
  Dim Arr, sAddr
  strOp = "+-*/^()\"

  If rCel.HasFormula Then
    strText = rCel.Formula
    strText = Replace(strText, "=", "")
    strText = Replace(strText, " ", "")
    tmp1 = strText
    For j = 1 To Len(strOp)
      ch = Mid(strOp, j, 1)
      tmp1 = Replace(tmp1, ch, " ")
    Next
    tmp1 = WorksheetFunction.Trim(tmp1)
    Arr = Split(tmp1, " ")

    [COLOR=#ff0000]For j = 0 To UBound(Arr)
      tmp2 = Evaluate(Arr(j))
      strText = Replace(strText, Arr(j), tmp2, , 1)
    Next[/COLOR]
    ct = strText
  End If
End Function
Chổ màu đỏ là chổ sửa lại và không cần hàm sort hổ trợ
Bạn thử lại xem
 
Upvote 0
vẫn bị lỗi thầy ơi. nó không hiểu công thức ở trong ngoặc sheet khác nó báo #value!.
 
Upvote 0
vẫn bị lỗi thầy ơi. nó không hiểu công thức ở trong ngoặc sheet khác nó báo #value!.

Bạn nói không không vậy khó kiểm tra lắm. Lỗi thế nào phải đưa file lên đây mới được
Lưu ý: GPE không chấp nhận file xlsm, vì thế hoặc là bạn Save As thành xls hoặc là nén file xlsm thành RAR nhé
 
Upvote 0
a thầy em sửa được rồi. thầy cho em hỏi là mình muốn nó tự hiểu là trong kết quả thì mình đánh dấu nhân là " * " nhưng khi muốn nó kiện ra số thì nó tự động thay bằng " x " thì làm sao thầy.
vd: a1= 2*1=2
=ct(a1) = 2 x 1.
 
Upvote 0
a thầy em sửa được rồi. thầy cho em hỏi là mình muốn nó tự hiểu là trong kết quả thì mình đánh dấu nhân là " * " nhưng khi muốn nó kiện ra số thì nó tự động thay bằng " x " thì làm sao thầy.
vd: a1= 2*1=2
=ct(a1) = 2 x 1.

Thì ở dòng code cuối cùng:
ct = strText
Sửa thành:
ct = Replace(strText, "*","x")
 
Upvote 0
To ndu: Trong code trên, thay tmp1 = WorksheetFunction.Trim(tmp1)
bằng tmp1 = Trim(tmp1) là báo lỗi. Bạn giải thích giùm, sao phải dùng hàm Trim của Excel mới chạy được?
 
Upvote 0
em mốn hỏi thầy là các dấu và số sát nhau ( vd +234) thì mình muốn nó xa nhau ra (vd: + 234) thì mình sửa sao thầy.
 
Upvote 0
To ndu: Trong code trên, thay tmp1 = WorksheetFunction.Trim(tmp1)
bằng tmp1 = Trim(tmp1) là báo lỗi. Bạn giải thích giùm, sao phải dùng hàm Trim của Excel mới chạy được?
hàm TRIM của VBA khác với hàm TRIM trên bảng tính mà anh
Giả định code chạy đến đoạn này và có chứa khoảng trắng ở giữa, vậy sau khi Split xong, 1 trong các phần tử của mảng sẽ = vbNullString, làm sao Evaluate được
em mốn hỏi thầy là các dấu và số sát nhau ( vd +234) thì mình muốn nó xa nhau ra (vd: + 234) thì mình sửa sao thầy.
Mấy cái này bạn tự nghiên cứu đi (cũng dễ mà)
 
Lần chỉnh sửa cuối:
Upvote 0
hjx. em chưa học qua vba bao giờ. em cũng chỉ mới tiếp cận cái này cũng chỉ mấy tuần thôi ạ. em sửa hoài mà cũng không được. Xin thầy giúp em cái này với ạ.
 
Upvote 0
hjx. em chưa học qua vba bao giờ. em cũng chỉ mới tiếp cận cái này cũng chỉ mấy tuần thôi ạ. em sửa hoài mà cũng không được. Xin thầy giúp em cái này với ạ.

Dòng này:
ct = strText

thay bằng:
Mã:
For j = 1 To Len(strOp)
  ch = Mid(strOp, j, 1)
  If ch <> "(" And ch <> ")" Then
    strText = Replace(strText, ch, " " & ch & " ")
  End If
 Next
ct = strText
 
Upvote 0
hàm TRIM của VBA khác với hàm TRIM trên bảng tính mà anh
Giả định code chạy đến đoạn này và có chứa khoảng trắng ở giữa, vậy sau khi Split xong, 1 trong các phần tử của mảng sẽ = vbNullString, làm sao Evaluate được

Vậy đố (vui) bạn, nếu không được dùng hàm Trim của Excel thì làm sao?, Ẹc ... ẹc mình loay hoay mãi mới biết, kém thật.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom