Nhờ anh em sửa lỗi giúp mình đoạn code này với mình rất cần!!! (1 người xem)

Liên hệ QC

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

hakhoailang

Thành viên mới
Tham gia
25/5/09
Bài viết
30
Được thích
1
mình có đoạn code sau cũng được tải từ diễn đàn mình với chức năng là diễn giải khối lượng nhưng nó có một lỗi cực kỳ oái oăm như sau:
VD:
ô A1 có giá trị là 2
ô B1 có công thức là 3*4
ô C1 = A1+B1
ô D1= dg(C1) thì lần đầu nó cho kết quả là chuỗi 2+3*4
nhưng sau khi tắt đi bật lại nó chỉ còn mỗi dấu +
còn nếu D1= dg(B1) thì nó lại cho kết quả đúng là chuỗi 3*4 dù tắt đi bật lại nó vẫn hiện thị đúng

Khi bắt đầu thực hiện thao tác thì mình add đoạn code này vào file excel để làm việc.
trong lần đầu sử dụng thì nó hiển thị rất mượt nhưng tắt đi bật lại là biết tay nhau.

nhờ các anh em trên diễn đàn giúp mình 1 tay để mình hoàn thành công việc như mong muốn với. Thank all.

Mã:
Function FD(mycell)If mycell = "" Then
  FD = ""
Else
 If Left(mycell.Formula, 1) <> "=" Then
    FD = "=Value"
 Else
 
  f = mycell.Formula
  FD = f
 End If
End If
Exit Function
End Function
Function DG(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 & subText(i) & dau(i)
Next i


DG = strText2
End Function
 
mình có đoạn code sau cũng được tải từ diễn đàn mình với chức năng là diễn giải khối lượng nhưng nó có một lỗi cực kỳ oái oăm như sau:
VD:
ô A1 có giá trị là 2
ô B1 có công thức là 3*4
ô C1 = A1+B1
ô D1= dg(C1) thì lần đầu nó cho kết quả là chuỗi 2+3*4
nhưng sau khi tắt đi bật lại nó chỉ còn mỗi dấu +
còn nếu D1= dg(B1) thì nó lại cho kết quả đúng là chuỗi 3*4 dù tắt đi bật lại nó vẫn hiện thị đúng

Khi bắt đầu thực hiện thao tác thì mình add đoạn code này vào file excel để làm việc.
trong lần đầu sử dụng thì nó hiển thị rất mượt nhưng tắt đi bật lại là biết tay nhau.

nhờ các anh em trên diễn đàn giúp mình 1 tay để mình hoàn thành công việc như mong muốn với. Thank all.

Mã:
Function FD(mycell)If mycell = "" Then
  FD = ""
Else
 If Left(mycell.Formula, 1) <> "=" Then
    FD = "=Value"
 Else
 
  f = mycell.Formula
  FD = f
 End If
End If
Exit Function
End Function
Function DG(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 & subText(i) & dau(i)
Next i


DG = strText2
End Function
Up file bị lỗi của bạn lên đây thử xem, giữa cái bạn mô tả và thực tế mình thử khác nhau hoàn toàn, vì vậy thấy mặt mũi file mới trả lời tiếp.
 
Upvote 0
file đây anh. lỗi nó nằm ở trong file này. e, cũng đã add code vào rồi
 

File đính kèm

Upvote 0
mình có đoạn code sau cũng được tải từ diễn đàn mình với chức năng là diễn giải khối lượng nhưng nó có một lỗi cực kỳ oái oăm như sau:
VD:
ô A1 có giá trị là 2
ô B1 có công thức là 3*4
ô C1 = A1+B1
ô D1= dg(C1) thì lần đầu nó cho kết quả là chuỗi 2+3*4
nhưng sau khi tắt đi bật lại nó chỉ còn mỗi dấu +
còn nếu D1= dg(B1) thì nó lại cho kết quả đúng là chuỗi 3*4 dù tắt đi bật lại nó vẫn hiện thị đúng

Khi bắt đầu thực hiện thao tác thì mình add đoạn code này vào file excel để làm việc.
trong lần đầu sử dụng thì nó hiển thị rất mượt nhưng tắt đi bật lại là biết tay nhau.

nhờ các anh em trên diễn đàn giúp mình 1 tay để mình hoàn thành công việc như mong muốn với. Thank all.

Mã:
Function FD(mycell)If mycell = "" Then
  FD = ""
Else
 If Left(mycell.Formula, 1) <> "=" Then
    FD = "=Value"
 Else
 
  f = mycell.Formula
  FD = f
 End If
End If
Exit Function
End Function
Function DG(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 & subText(i) & dau(i)
Next i


DG = strText2
End Function
Chính cái file của bạn máy của mình không hề bị lỗi như bạn nói.
 
Upvote 0
Bạn đã thử mở các sheet khác chưa. Nó có 6 sheet. Sheet hiện hành khi tắt sẽ ko bị. Các sheet còn lại sẽ bị.
 
Upvote 0
mình kiểm tra lại chế độ vẫn đặt automatic
khó hiểu thật híc.
Bạn có thể viết giúp mình đoạn code khác với chức năng tương tự không?
bạn với mình hiện tại trong trường hợp này thì là 2 đường thằng song song không gặp nhau rồi.
Máy bạn luôn đúng, máy mình thì lỗi. đâm ra gặp rắc rối giữa 2 người.
cách giải quyết hợp lý nhất là nhờ bạn viết một đoạn code giải quyết mình vấn đề này.
 
Upvote 0
mình kiểm tra lại chế độ vẫn đặt automatic
khó hiểu thật híc.
Bạn có thể viết giúp mình đoạn code khác với chức năng tương tự không?
bạn với mình hiện tại trong trường hợp này thì là 2 đường thằng song song không gặp nhau rồi.
Máy bạn luôn đúng, máy mình thì lỗi. đâm ra gặp rắc rối giữa 2 người.
cách giải quyết hợp lý nhất là nhờ bạn viết một đoạn code giải quyết mình vấn đề này.
Bạn xem thử cái này có giúp ích gì không?
http://www.giaiphapexcel.com/forum/...-hàm-diễn-giải&p=725561&highlight=#post725561
 
Upvote 0
cái này chính là cái mà em tải về và sử dụng nó trong file em gửi cho bác. nó ko ăn thua và em đã nhờ người chỉnh sửa đôi tý như ko thành công.
vất vả quá anh à.
cũng nhờ đủ người sửa nó nhưng ko ăn thua.
 
Upvote 0
mình có đoạn code sau cũng được tải từ diễn đàn mình với chức năng là diễn giải khối lượng nhưng nó có một lỗi cực kỳ oái oăm như sau:
VD:
ô A1 có giá trị là 2
ô B1 có công thức là 3*4
ô C1 = A1+B1
ô D1= dg(C1) thì lần đầu nó cho kết quả là chuỗi 2+3*4
nhưng sau khi tắt đi bật lại nó chỉ còn mỗi dấu +
còn nếu D1= dg(B1) thì nó lại cho kết quả đúng là chuỗi 3*4 dù tắt đi bật lại nó vẫn hiện thị đúng

Khi bắt đầu thực hiện thao tác thì mình add đoạn code này vào file excel để làm việc.
trong lần đầu sử dụng thì nó hiển thị rất mượt nhưng tắt đi bật lại là biết tay nhau.

nhờ các anh em trên diễn đàn giúp mình 1 tay để mình hoàn thành công việc như mong muốn với. Thank all.

Mã:
Function FD(mycell)If mycell = "" Then
  FD = ""
Else
 If Left(mycell.Formula, 1) <> "=" Then
    FD = "=Value"
 Else
 
  f = mycell.Formula
  FD = f
 End If
End If
Exit Function
End Function
Function DG(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 & subText(i) & dau(i)
Next i


DG = strText2
End Function
Chạy thử hàm này xem sao
Mã:
Public Function DienGiai(Chuoi) As String
Dim c As Long, Reg As Object
Set Reg = CreateObject("Vbscript.RegExp")
If Chuoi = "" Then
DienGiai = ""
Exit Function
End If
Chuoi = Chuoi.Formula
Reg.Global = True
Reg.Pattern = "([A-Z]+\d+)"
If Reg.Test(Chuoi) = False Then
DienGiai = Replace(Chuoi, "=", "")
Exit Function
Else
Do While Reg.Test(Chuoi) = True
Chuoi = Reg.Replace(Chuoi, " " & "$1" & " ")
Chuoi = Split(Chuoi)
For c = 0 To UBound(Chuoi)
If Reg.Test(Chuoi(c)) = True Then Chuoi(c) = Range(CStr(Chuoi(c))).Formula
Next c
Chuoi = Replace(Join(Chuoi), " ", "")
Loop
DienGiai = Replace(Chuoi, "=", "")
End If
End Function
 
Upvote 0
Chạy thử hàm này xem sao
Mã:
Public Function DienGiai(Chuoi) As String
Dim c As Long, Reg As Object
Set Reg = CreateObject("Vbscript.RegExp")
If Chuoi = "" Then
DienGiai = ""
Exit Function
End If
Chuoi = Chuoi.Formula
Reg.Global = True
Reg.Pattern = "([A-Z]+\d+)"
If Reg.Test(Chuoi) = False Then
DienGiai = Replace(Chuoi, "=", "")
Exit Function
Else
Do While Reg.Test(Chuoi) = True
Chuoi = Reg.Replace(Chuoi, " " & "$1" & " ")
Chuoi = Split(Chuoi)
For c = 0 To UBound(Chuoi)
If Reg.Test(Chuoi(c)) = True Then Chuoi(c) = Range(CStr(Chuoi(c))).Formula
Next c
Chuoi = Replace(Join(Chuoi), " ", "")
Loop
DienGiai = Replace(Chuoi, "=", "")
End If
End Function

Trong trường hợp sử dụng công thức IF để lấy điều kiện đúng có áp dụng được không anh!!! Nhờ anh sửa giúp luôn với nhé
 

File đính kèm

Upvote 0
Trong trường hợp sử dụng công thức IF để lấy điều kiện đúng có áp dụng được không anh!!! Nhờ anh sửa giúp luôn với nhé
Hàm này chỉ để tìm diễn giải tính.
Không biết ý bạn muốn kết quả thế nào
---
Ý bạn muốn lấy kết quả của hàm trong diễn giải?
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy thử hàm này xem sao
Mã:
Public Function DienGiai(Chuoi) As String
Dim c As Long, Reg As Object
Set Reg = CreateObject("Vbscript.RegExp")
If Chuoi = "" Then
DienGiai = ""
Exit Function
End If
Chuoi = Chuoi.Formula
Reg.Global = True
Reg.Pattern = "([A-Z]+\d+)"
If Reg.Test(Chuoi) = False Then
DienGiai = Replace(Chuoi, "=", "")
Exit Function
Else
Do While Reg.Test(Chuoi) = True
Chuoi = Reg.Replace(Chuoi, " " & "$1" & " ")
Chuoi = Split(Chuoi)
For c = 0 To UBound(Chuoi)
If Reg.Test(Chuoi(c)) = True Then Chuoi(c) = Range(CStr(Chuoi(c))).Formula
Next c
Chuoi = Replace(Join(Chuoi), " ", "")
Loop
DienGiai = Replace(Chuoi, "=", "")
End If
End Function

đầu tiên mình chân thành cảm ơn bạn.
sau khi test đoạn code bạn viết giúp mình đã thấy một số điểm đang bất cập như sau:

Chuỗi đã tách được như nó lột luôn cả những ô không cần thiết VD như trong trường hợp sau:
ở ô D49 mình đã dùng hàm diengiai bạn viết như sau:
D49=Diengiai(E49) và nó trả kết quả là 2+3*2*0.4
trong lúc đó E49=E29*2*0.4 tức là 5*2*0.4

vậy kết quả hàm diễn giải bị sai kết quả phép tính ( thực ra là không sai nhưng nó thiếu dấu () và nó lột luôn cát thằng E29)

Mình chỉ cần lấy giá trị chuỗi trong ô được chọn trong hàm Diengiai và thực hiện với phép tính với kết quả được link ở ô được chọn.

VD:
D49=Diengiai(E49)
E49=E29*2*0.4
trong đó E29=2+3
thì mình chỉ cần kết quả trả về của hàm diễn giải là 5*2*0.4
 

File đính kèm

  • loi dien giai.jpg
    loi dien giai.jpg
    34.7 KB · Đọc: 16
Upvote 0
đầu tiên mình chân thành cảm ơn bạn.
sau khi test đoạn code bạn viết giúp mình đã thấy một số điểm đang bất cập như sau:

Chuỗi đã tách được như nó lột luôn cả những ô không cần thiết VD như trong trường hợp sau:
ở ô D49 mình đã dùng hàm diengiai bạn viết như sau:
D49=Diengiai(E49) và nó trả kết quả là 2+3*2*0.4
trong lúc đó E49=E29*2*0.4 tức là 5*2*0.4

vậy kết quả hàm diễn giải bị sai kết quả phép tính ( thực ra là không sai nhưng nó thiếu dấu () và nó lột luôn cát thằng E29)

Mình chỉ cần lấy giá trị chuỗi trong ô được chọn trong hàm Diengiai và thực hiện với phép tính với kết quả được link ở ô được chọn.

VD:
D49=Diengiai(E49)
E49=E29*2*0.4
trong đó E29=2+3
thì mình chỉ cần kết quả trả về của hàm diễn giải là 5*2*0.4
Bỏ vòng lặp Do - loop và chỉ lấy giá trị
Bạn kiểm tra lại cái này xem thế nào
Mã:
Public Function DienGiai(Chuoi) As String
Dim c As Long
Dim Reg As Object
Set Reg = CreateObject("Vbscript.RegExp")
If Chuoi = "" Then
DienGiai = ""
Exit Function
End If
Chuoi = Chuoi.Formula
Reg.Global = True
Reg.Pattern = "([A-Z]+\d+)"
If Reg.Test(Chuoi) = False Then
DienGiai = Replace(Chuoi, "=", "")
Exit Function
Else
Chuoi = Reg.Replace(Chuoi, " " & "$1" & " ")
Chuoi = Split(Chuoi)
For c = 0 To UBound(Chuoi)
If Reg.Test(Chuoi(c)) = True Then Chuoi(c) = Range(CStr(Chuoi(c))).Value
Next c
Chuoi = Replace(Join(Chuoi), " ", "")
DienGiai = Replace(Chuoi, "=", "")
End If
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom