Hỏi về hàm hoặc code diễn giải cách tính

Liên hệ QC

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

  • DT-VanYen-ThachDa.rar
    654.1 KB · Đọc: 76
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
Web KT
Back
Top Bottom