Hỏi về hàm hoặc code diễn giải cách tính (1 người xem)

  • Thread starter Thread starter civil
  • Ngày gửi Ngày gửi
Liên hệ QC

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

civil

Thành viên mới
Tham gia
19/8/07
Bài viết
12
Được thích
0
Nghề nghiệp
Civil engineer
Mình có vấn đề thế này:
ô "A1" có giá trị là: 5
ô "A2" có giá trị là: 3
ô "A3" có giá trị là: 9
ô "A4" có giá trị là: =A1+A2-A3
Cho mình hỏi có hàm nào trong excel hoặc có macro nào để mình làm việc sau:
Đánh vào "A5" hàm: =diendai(A4)
Thì ô A5 hiện ra gia trị : 5+3-9
Cám ơn mọi người
 
Lần chỉnh sửa cuối:
Cái này tại sao bạn ko đặt name có nó gọn?
 
Upvote 0
E rằng không có, nếu muốn thì phải làm một hàm UDF, mà làm hàm này cũng căng à nha! template cho một địa chỉ là gì đây???
 
Upvote 0
Function FD(mycell)
If mycell = "" Then
FD = ""
Else
If Left(mycell.Formula, 1) <> "=" Then
a = mycell.Address(0, 0)
FD = a + "=Value"
Else
a = mycell.Address(0, 0)
f = mycell.Formula
FD = a + f
End If
End If
End Function
Cái này của ttphong2007, chỉ cần A5 =fd(A4) là OK
 
Upvote 0
Bạn thử đoạn code sau xem.
Mã:
Public Function Diengiai(Rng As Range) As String
If Left(Rng.Formula, 1) = "=" Then
    Diengiai = Right(Rng.Formula, Len(Rng.Formula) - 1)
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các bạn rất nhiều, nhưng 2 macro trên của các bạn mới chỉ cho giá trị ô A5 là:"A1+A2-A3", chứ không được "5+3-9", rất mong các bạn giúp đỡ tiếp, xin hỏi còn cách nào nữa không ?
 
Upvote 0
ví dụ tại a4 có công thức là =sum(a1,a2)-a3, vậy bạn muốn hiện lên tại a5 như thế nào? tức là ngoài những phép toán đơn giản như +,-,*,/ thì các hàm của excel bạn có muốn diễn giải không?
 
Upvote 0
Bài này thật sự ko hiểu... Tại sao ko là =A1&"+"&A2&"-"&A3
???
Còn như lập trình thì ko thể theo nguyên lý như trên sao?
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Bài này thật sự ko hiểu... Tại sao ko là =A1&"+"&A2&"-"&A3
???
Còn như lập trình thì ko thể theo nguyên lý như trên sao?
ANH TUẤN

Có lẽ cứ làm như anh cho đơn giản, nhưng em e rằng ý bạn ấy muốn không phải như vậy (hay là em thích phức tạp hoá vấn đề nhỉ???). Bạn ấy muốn diễn giải một công thức bất kỳ thì sao? như vậy hàm diengiai(cell) phải nhận một công thức bất kỳ, code phải làm sao để nhận ra trog đó có các ô nào? name nào? function nào? operation nào?.... (hoặc ngơ tất, chỉ tìm cái nào là địa chỉ thì lấy giá trị của địa chỉ đó thay thế vào trong công thức....
 
Upvote 0
SoiBien đã viết:
ví dụ tại a4 có công thức là =sum(a1,a2)-a3, vậy bạn muốn hiện lên tại a5 như thế nào? tức là ngoài những phép toán đơn giản như +,-,*,/ thì các hàm của excel bạn có muốn diễn giải không?

Mình chỉ cân diễn giải các phép tính đơn giản +,-,*,/ thôi.

anhtuan1066 đã viết:
Bài này thật sự ko hiểu... Tại sao ko là =A1&"+"&A2&"-"&A3

Mình muốn tự động hoá bạn àh, vì mình có rất nhiều ô kiểu như A5, mình cần diễn dải nó ra là nó được cộng trừ từ những số nào.

 
Upvote 0
Bạn đưa một ít dử liệu lên diển đàn, mọi người sẽ xem thử bạn muốn "tự động" theo kiểu nào? Chưa chắc là cần đên VBA đâu!
 
Upvote 0
Cái mình cần là : làm ngơ tất, chỉ cần tìm cái nào là địa chỉ, thì lấy giá trị số của địa chỉ đó thay thế vào trong công thức.
 
Upvote 0
Đây mình tải 1 file lên, nhờ các bạn giúp đỡ.
 

File đính kèm

Upvote 0
Em có một Hàm xem ô có các công thức các bác xem thử.

Function XemCT(Target As Range) As String
If Target.HasFormula Then XemCT = Target.Formula
End Function
 
Upvote 0
À há, Dự toán công trình, bạn làm ngược với mình tại cái bài này.

http://www.giaiphapexcel.com/forum/showthread.php?t=3982
Bạn tham khảo nhé, cái đó mình làm cho bạn viết công thức trước, rồi ô bên cạnh là tính giá trị, nếu được thì khỏi làm tiếp, bạn cứ áp dụng cái của mình, còn không thì chờ mình viết ngược lại một cái khác.
 
Upvote 0
Cách này cũng khá gọn, nhưng chưa giãi quyết dc vấn đề đâu bạn à... Như A4 có công thức =A1+A2-A3 (với A1=12, A2=7, A3=5) Thì bạn ấy muốn hàm tự tạo này phải ra kết quả =12 + 7 - 5 chứ ko phải ra A1 + A2 - A3 đâu!
ANH TUẤN
 
Upvote 0
SoiBien đã viết:
À há, Dự toán công trình, bạn làm ngược với mình tại cái bài này.

http://www.giaiphapexcel.com/forum/showthread.php?t=3982
Bạn tham khảo nhé, cái đó mình làm cho bạn viết công thức trước, rồi ô bên cạnh là tính giá trị, nếu được thì khỏi làm tiếp, bạn cứ áp dụng cái của mình, còn không thì chờ mình viết ngược lại một cái khác.

Mình nhờ bạn viết ngược lại hộ mình, còn cách làm xuôi như thế rất bất tiện khi khối lượng công việc của mình thay đổi, mình phải đi mò sửa lại từng số trong công thức. Còn nếu có được 1 hàm như mình nói thì rất đơn giản trong việc thay khối lượng và diễn dải cách tính khối lượng.
Cám ơn bạn trước nha. Giúp mình với
 
Upvote 0
Bạn dùng tạm đoạn code sau.
Mới chỉ áp dụng được với các phép toán +, -, *, /, \, ^ thôi và chưa tính đến có dấu (), {}, [],...
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim subText() As String, dau() As String
    
    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 = Replace(strText, "(", "")
    strText = Replace(strText, ")", "")
    strText = Trim(strText)
        
    subText = Split(strText, "@")
    
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            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
    
    Diengiai = strText2
End Function
 
Upvote 0
Cám ơn bạn rất nhiều, nếu xử lý được cả dấu () , mình chỉ cần xử lý được dấu () là đã đạt yêu cầu 90%, công việc của mình chỉ yêu cầu thấp vậy thôi, mong bạn giúp tiếp.
 
Lần chỉnh sửa cuối:
Upvote 0
civil đã viết:
Cám ơn bạn rất nhiều, nếu xử lý được cả dấu () , mình chỉ cần xử lý được dấu () là đã đạt yêu cầu 90%, công việc của mình chỉ yêu cầu thấp vậy thôi, mong bạn giúp tiếp.
Bạn tham khảo code sau:
Mã:
Option Explicit
Public Function Diengiai(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
    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
    
    Diengiai = strText2
End Function
Ví dụ:
A1=10.5
A2=20.4
A3=35.5
A4=19
A5=((22+A3)*4.5)*4+A2*(A3/2+A1)*5+A4^2
B5=Diengiai(A5)=((22+35.5)*4.5)*4+20.4*(35.5/2+10.5)*5+19^2
 
Upvote 0
Lấy ý từ Function FD(mycell) của ttphong2007 cải biên lại theo ý của civil
Mã:
Function DienGiai(mycell) As String
If mycell = "" Then
  DienGiai = ""
ElseIf Left(mycell.Formula, 1) <> "=" Then
  DienGiai = mycell
Else
 ct = Mid(mycell.Formula, 2)
  n = 1
  m = 1
  Do
    dau = Mid(ct, n, 1)
    If dau = "+" Or dau = "-" Or dau = "*" Or dau = "/" Or dau = "(" Or dau = ")" Or dau = "{" Or dau = "}" Or dau = "[" Or dau = "]" Then
      If n = m Then
        DienGiai = DienGiai & dau
      Else
        conso = Range(Mid(ct, m, n - m)).Value
        DienGiai = DienGiai & conso & dau
      End If
      m = n + 1
    ElseIf n = Len(ct) Then
      conso = Range(Mid(ct, m)).Value
      DienGiai = DienGiai & conso
      Exit Do
    End If
    n = n + 1
  Loop While n <= Len(ct)
End If
End Function
 
Upvote 0
Bạn dùng tạm đoạn code sau.
Mới chỉ áp dụng được với các phép toán +, -, *, /, \, ^ thôi và chưa tính đến có dấu (), {}, [],...
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim subText() As String, dau() As String
    
    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 = Replace(strText, "(", "")
    strText = Replace(strText, ")", "")
    strText = Trim(strText)
        
    subText = Split(strText, "@")
    
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            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
    
    Diengiai = strText2
End Function

Em sài cái này nhiều rồi. Nhưng có vấn đề là nếu ô chứa số liệu thập phân quá nhiều thì nó cũng liệt kê dài ngoằn theo luôn.
Theo tinh thần là hoàn thiện đoạn code trên, nếu như muốn ô diễn giải này nó tinh gọn thì lọc lại giá trị sau dấu "." để làm tròn số rồi hiển thị hổng biết anh làm được không.

Ví dụ như : ô A1 = 43.1368434184 và ô A2 = 25.68464134
thì khi diễn giải ô A3 = A 1 + A 2 thì nó hiện nguyên hình thế này "= 43.1368434184 + 25.68464134" . Khá nhức mắt, em muốn nó chỉ đơn giản là hiện thế này "= 43.14 + 25.68"
Rất mong nhận được ý kiến đóng góp.
 
Upvote 0
Em sài cái này nhiều rồi. Nhưng có vấn đề là nếu ô chứa số liệu thập phân quá nhiều thì nó cũng liệt kê dài ngoằn theo luôn.
Theo tinh thần là hoàn thiện đoạn code trên, nếu như muốn ô diễn giải này nó tinh gọn thì lọc lại giá trị sau dấu "." để làm tròn số rồi hiển thị hổng biết anh làm được không.

Ví dụ như : ô A1 = 43.1368434184 và ô A2 = 25.68464134
thì khi diễn giải ô A3 = A 1 + A 2 thì nó hiện nguyên hình thế này "= 43.1368434184 + 25.68464134" . Khá nhức mắt, em muốn nó chỉ đơn giản là hiện thế này "= 43.14 + 25.68"
Rất mong nhận được ý kiến đóng góp.

Bạn tham khảo nhé:
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    On Error Resume Next
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim k
    Dim subText() As String, dau() As String
    
    strText = rngData.Formula
    strText = Trim$(Replace(strText, "=", ""))
    
    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 = Replace(strText, ")", "@")
            
    subText = Split(strText, "@")
  
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            Err.Clear
            k = Range(subText(i))
            
            If Err.Number <> 0 Then
                If Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat <> "General" Then
                    subText(i) = Format$(Range(subText(i)).Value, Range(subText(i)).NumberFormat)
                ElseIf Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat = "General" Then
                    subText(i) = Range(subText(i)).Value
                End If
            Else
                subText(i) = subText(i)
            End If
            
        End If
    Next i
        
    ReDim Preserve dau(UBound(subText))
    
    For i = 0 To UBound(subText)
        strText2 = strText2 & subText(i) & dau(i)
    Next i
    
    Diengiai = strText2
End Function

Đoạn Code trên chấp nhận trong công thức có cả dấu ngoặc và các hàm của MS Excel
P/S: Số ký tự sau dấu (.) sẽ được lấy theo đúng định dạng của ô.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tham khảo nhé:

Đoạn Code trên chấp nhận trong công thức có cả dấu ngoặc và các hàm của MS Excel
P/S: Số ký tự sau dấu (.) sẽ được lấy theo đúng định dạng của ô.
E24 = 2/3 = 0.333
E23 = 5/6 = 0.833
Kết quả E27 = 1.166
E28 = diengiai(E27)
e28 hiện nguyên hình "E24+E23"
hổng hiểu.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sorry! Hi hi
Bạn sửa dấu <> 0 thành = 0 nhé
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    On Error Resume Next
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim k
    Dim subText() As String, dau() As String
    
    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 = Trim$(Replace(strText, "=", ""))
    strText = Replace(strText, "+", "@")
    strText = Replace(strText, "-", "@")
    strText = Replace(strText, "*", "@")
    strText = Replace(strText, "/", "@")
    strText = Replace(strText, "\", "@")
    strText = Replace(strText, "^", "@")
    strText = Replace(strText, "(", "@")
    strText = Replace(strText, ")", "@")
            
    subText = Split(strText, "@")
  
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            Err.Clear
            k = Range(subText(i))
            
            If Err.Number [B][COLOR=#ff0000]=[/COLOR][/B] 0 Then
                If Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat <> "General" Then
                    subText(i) = Format$(Range(subText(i)).Value, Range(subText(i)).NumberFormat)
                ElseIf Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat = "General" Then
                    subText(i) = Range(subText(i)).Value
                End If
            End If
            
        End If
    Next i
        
    ReDim Preserve dau(UBound(subText))
    
    For i = 0 To UBound(subText)
        strText2 = strText2 & subText(i) & dau(i)
    Next i
    
    Diengiai = strText2
End Function

Bạn đừng quá khen vội.
Trong code trên chưa "diễn giải" được các thông số nếu bạn sử dụng một hàm Excel nào đó.
Ví dụ:
A5 = ((22+A3)*4.5)*4+A2*(A3/2-A1)*5+A4^2+SUM(A1:A4)
B5 = diengiai(A5) = ............^2+SUM(A1:A4)
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Có một vấn đề phát sinh là khi em làm nối phép tính ở một giá trị ở sheet khác thì nó hiển thị địa chỉ ô thay vì giá trị của ô đó. Bác nvson có thể nào giúp em vấn đề này được không ?
Ví dụ ở sheet 1 có A1 = 567
sheet 2 có B1 = 789

Sheet 1 gõ ô A2 = A1 + Sheet2'B1 thì có hiện là 567 + Sheet2!B1

Trong khi cái code diengiai trước kia chỉ mỗi tội là không lượt bớt số thập phân nhưng nó hiển thị kết quả.
 
Upvote 0
Có một vấn đề phát sinh là khi em làm nối phép tính ở một giá trị ở sheet khác thì nó hiển thị địa chỉ ô thay vì giá trị của ô đó. Bác nvson có thể nào giúp em vấn đề này được không ?
Ví dụ ở sheet 1 có A1 = 567
sheet 2 có B1 = 789

Sheet 1 gõ ô A2 = A1 + Sheet2'B1 thì có hiện là 567 + Sheet2!B1

Trong khi cái code diengiai trước kia chỉ mỗi tội là không lượt bớt số thập phân nhưng nó hiển thị kết quả.

Em tìm ra nguyên nhân là nó có số 0 thì sẽ bất lực bác à.
 
Upvote 0
Sheet 1 gõ ô A2 = A1 + Sheet2'B1 thì có hiện là 567 + Sheet2!B1

Trong khi cái code diengiai trước kia chỉ mỗi tội là không lượt bớt số thập phân nhưng nó hiển thị kết quả.
Bạn sử dụng code sau nhé:
Đoạn code này sẽ đóng ngoặc giá trị âm. Mình không chuyển -- thành +, +- thành - ... vì mình muốn giữ lại các dấu công thức cũ.
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    On Error Resume Next
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim k
    Dim subText() As String, dau() As String
    
    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 = Trim$(Replace(strText, "=", ""))
    strText = Replace(strText, "+", "@")
    strText = Replace(strText, "-", "@")
    strText = Replace(strText, "*", "@")
    strText = Replace(strText, "/", "@")
    strText = Replace(strText, "\", "@")
    strText = Replace(strText, "^", "@")
    strText = Replace(strText, "(", "@")
    strText = Replace(strText, ")", "@")
            
    subText = Split(strText, "@")
  
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            Err.Clear
            k = Range(subText(i))
            
            If Err.Number = 0 Then
                If Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat <> "General" Then
                    subText(i) = Format$(Range(subText(i)).Value, Range(subText(i)).NumberFormat)
                ElseIf Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat = "General" Then
                    subText(i) = Range(subText(i)).Value
                End If
            Else
                subText(i) = subText(i)
            End If
            If Left(subText(i), 1) = "-" Then subText(i) = "(" & subText(i) & ")"
        End If
    Next i
        
    ReDim Preserve dau(UBound(subText))
    
    For i = 0 To UBound(subText)
        strText2 = strText2 & subText(i) & dau(i)
    Next i
    
    Diengiai = strText2
End Function

Em tìm ra nguyên nhân là nó có số 0 thì sẽ bất lực bác à.
Cái này mình chưa hiểu lắm...
 
Upvote 0
Mình có 1 vấn đề tương tự như vậy nhưng mình muốn nhập diễn giải cách tính sau đó thì cột khối lượng tư tính khối lượng không cần nhập lại cách tính. Mình cácm ơn bạn rất nhiều!
 

File đính kèm

Upvote 0
Upvote 0
Bạn sử dụng code sau nhé:
Đoạn code này sẽ đóng ngoặc giá trị âm. Mình không chuyển -- thành +, +- thành - ... vì mình muốn giữ lại các dấu công thức cũ.
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    On Error Resume Next
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim k
    Dim subText() As String, dau() As String
    
    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 = Trim$(Replace(strText, "=", ""))
    strText = Replace(strText, "+", "@")
    strText = Replace(strText, "-", "@")
    strText = Replace(strText, "*", "@")
    strText = Replace(strText, "/", "@")
    strText = Replace(strText, "\", "@")
    strText = Replace(strText, "^", "@")
    strText = Replace(strText, "(", "@")
    strText = Replace(strText, ")", "@")
            
    subText = Split(strText, "@")
  
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            Err.Clear
            k = Range(subText(i))
            
            If Err.Number = 0 Then
                If Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat <> "General" Then
                    subText(i) = Format$(Range(subText(i)).Value, Range(subText(i)).NumberFormat)
                ElseIf Len(Range(subText(i))) > 0 And Range(subText(i)).NumberFormat = "General" Then
                    subText(i) = Range(subText(i)).Value
                End If
            Else
                subText(i) = subText(i)
            End If
            If Left(subText(i), 1) = "-" Then subText(i) = "(" & subText(i) & ")"
        End If
    Next i
        
    ReDim Preserve dau(UBound(subText))
    
    For i = 0 To UBound(subText)
        strText2 = strText2 & subText(i) & dau(i)
    Next i
    
    Diengiai = strText2
End Function


Cái này mình chưa hiểu lắm...

Tức là với ô có giá trị là rỗng hoặc = 0 thì trên công thức diengiai chỉ cho kết quả là địa chỉ của đối tượng cell
 
Upvote 0
Mình thấy ô có giá trị là 0 thì trong công thúc diengiai đúng đấy chứ.
Code sau sẽ thay đổi ô có giá trị rỗng được thay bằng 0, nếu bạn muốn thay bằng một giá trị khác thì thay đổi dòng lệnh màu đỏ nhé.
Mã:
Option Explicit
Public Function Diengiai(rngData As Range)
    On Error Resume Next
    Dim strText As String, strText2 As String
    Dim i As Long, j As Long
    Dim k
    Dim subText() As String, dau() As String
    
    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 = Trim$(Replace(strText, "=", ""))
    strText = Replace(strText, "+", "@")
    strText = Replace(strText, "-", "@")
    strText = Replace(strText, "*", "@")
    strText = Replace(strText, "/", "@")
    strText = Replace(strText, "\", "@")
    strText = Replace(strText, "^", "@")
    strText = Replace(strText, "(", "@")
    strText = Replace(strText, ")", "@")
            
    subText = Split(strText, "@")
  
    For i = 0 To UBound(subText)
        If Not IsNumeric(subText(i)) Then
            Err.Clear
            k = Range(subText(i))
            
            If Err.Number = 0 Then
                [B][COLOR=#ff0000]If IsEmpty(Range(subText(i))) Then subText(i) = 0
[/COLOR][/B]                If Range(subText(i)).NumberFormat <> "General" Then
                    subText(i) = Format$(Range(subText(i)).Value, Range(subText(i)).NumberFormat)
                ElseIf Range(subText(i)).NumberFormat = "General" Then
                    subText(i) = Range(subText(i)).Value
                End If
            Else
                subText(i) = subText(i)
            End If
            If Left(subText(i), 1) = "-" Then subText(i) = "(" & subText(i) & ")"
        End If
    Next i
        
    ReDim Preserve dau(UBound(subText))
    
    For i = 0 To UBound(subText)
        strText2 = strText2 & subText(i) & dau(i)
    Next i
    
    Diengiai = strText2
End Function
 
Upvote 0
Sao mình làm không được nhỉ, nhờ các bạn giúp mình với. Cam ơn rất nhiều!
 

File đính kèm

Upvote 0
Các cao thủ cho minh hỏi cái, ví dụ như ô E2 và E3 mình đăt name với tên ứng với ô bên cột D2 và D3 ở ô E4 mình muốn sử dụng một hàm tính cái diễn giải cách tính bên ô C4 và những giá trị các ô E2 và E3 thay đổi thì ô e4 cũng thay đổi theo có thể viết một hàm như vậy được không
 
Upvote 0

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

Back
Top Bottom