Add-in Nội suy một chiều, nội suy 2 chiều

Liên hệ QC

lemanhhung0302

Thành viên mới
Tham gia
11/4/08
Bài viết
14
Được thích
10
Vẫn biết diễn đàn rất nhiều cao thủ. Cũng biết có nhiều chương trình nội suy khác. Nhưng vẫn xin đóng góp chút ít. :)

Cập nhật link video
[video=youtube;CRUR6t2mJ3w]https://www.youtube.com/watch?v=CRUR6t2mJ3w[/video]

Trong quá trình học tập, công tác, chắc hẳn không ít lần bạn đã phải dùng đến phương pháp nội suy.


Để xây dựng công thức nội suy trên Excel, thường phải mất 1-2p để định hình các tham số, xây dựng hàm để tính Yns.

Trong bài này, tôi xin giới thiệu với các bạn 03 hàm nội suy trong Excel, sẽ giúp cho công việc tính toán nội suy của bạn được hiệu quả hơn.


a)Nội suy 1 chiều:

Loại đơn giản: đã biết cận trên và dưới

Công thức: =Yns(Xns, X1 , X2 , Y1 , Y2)
Công dụng: Tìm giá trị Yns (giá trị nội suy) tương ứng với Xns.

Mô hình:


Nội suy 1 chiều khi đã biết cận trên và dưới

Loại phức tạp: nội suy theo vùng dữ liệu

Công thức: =sip(Xns,Vùng CSDL-X , Vùng CSDL-Y)
Công dụng: Tìm giá trị Yns ứng với Xns trên các hàng (hoặc cột) tương ứng.
Trong đó:



b)Nội suy 2 chiều
Công thức: =xsip(Xns ,Vùng CSDL-X , Yns , Vùng CSDL-Y , Vùng giá trị)

Công dụng: Tìm giá trị xsip (giá trị nội suy) tương ứng với Xns.


Mô hình:



Toàn bộ thư mục XSIP Mediafire


Nguồn: AutoLISP thật là đơn giản www.tankhanh.com.vn

 
Lần chỉnh sửa cuối:
Gởi lemanhhung,
Bạn chia sẻ add-in thì bạn nên đưa link trực tiếp để download, không nên đưa qua link trung gia adfly. Adfly là trang web kiếm tiền qua mạng, và bị cấm trên GPE.

Ngoài ra, tiêu đề của bạn tôi cũng sửa lại, vì nội suy 1 chiều 2 chiều trên excel và GPE đúng là chuyện nhỏ, không cần ghi trên tiêu đề.
 
Thế cái bài này trong chuyên mục Addin thì cũng nên xóa luôn cái tiêu đề Add-in đi mod ạ! Và từ nay những bài nào trong chuyên mục Add-in cũng nên xóa phần Add-in đứng đầu đi cho công bằng :))

Mỗi người có một cách giới thiệu khác nhau, sao phải vì nó là "chuyện nhỏ" nên xóa?! Vớ vẩn!
 
Tiêu đề cũ trước khi sửa là Nội suy một chiều, nội suy 2 chiều: chuyện nhỏ

Thực ra thì tôi không muốn nói thẳng ra rằng tiêu đề đó có tính chất nhấn mạnh tầm quan trọng cho 1 chuyện nhỏ, rất nhỏ.

Tiêu đề bài viết ở GPE cần rõ ràng và phản ảnh nội dung chính của bài viết, chứ không phải 1 bài báo cần phải câu view hay câu like.
 
Mấy cái nội suy này trên GPE có từ lâu rồi bạn.
 
@PhanTuHuong: Mình đã nói ngay từ mở đầu là mình biết trên diễn đàn có rất nhiều rất nhiều rồi. Chắc bạn cũng ko đọc hết được câu đầu tiên của bài viết.

Chẳng nhẽ Nokia ra đời trước thì Apple không được phép kinh doanh điện thoại hay sao bạn? Người dùng không được có quyền lựa chọn thứ 2 thứ 3 nữa hay sao?

@ptm0412: Đúng là mình thích like. Nhưng like đồng nghĩa với chia sẻ, với việc giúp ích cho người khác. Và không phủ nhận giúp ích cho chính mình. Chuyện bình thường. Diễn đàn hoạt động được là nhờ công sức các thành viên nhiệt huyết tham gia. Tôi hỏi bạn nếu chỉ như thế đã đủ chưa? Liệu có bao giờ GPE phải đi marketing chưa? :))

PS: thêm phát nữa, thêm từ Add-in đồng nghĩa với việc SEO Google gì đó :) Như thế có phải là quảng cáo câu view không nhỉ :v
 
Lần chỉnh sửa cuối:
@ptm0412: Đúng là mình thích like. Nhưng like đồng nghĩa với chia sẻ, với việc giúp ích cho người khác. Và không phủ nhận giúp ích cho chính mình. Chuyện bình thường. Diễn đàn hoạt động được là nhờ công sức các thành viên nhiệt huyết tham gia. Tôi hỏi bạn nếu chỉ như thế đã đủ chưa? Liệu có bao giờ GPE phải đi marketing chưa? :))

Vậy nói tóm lại là bạn muốn chia sẻ, giúp ích cho người khác và học hỏi để giúp ích cho chính mình hay muốn ăn thua đủ về văn chương?
Nếu mục đích của bạn là cái màu đỏ tôi tô đậm ở trên thì xin ghi nhận. Nếu ai đó nhờ cái AddIn của bạn mà giúp ích được cho công việc của họ thì xem như bạn đã được LIKE rồi còn gì
Bạn có cần phải thắc mắc mãi cái chuyện SỬA TIÊU ĐỀ thế không? Bạn đã "mất mát" cái gì? cái "CHUYỆN NHỎ" ấy quan trọng với bạn vậy sao?
 
Tôi cũng chả bắt bẻ gì, nhưng nếu đưa code và so sánh với code đã có thì hay hơn (so sánh về thuật toán, tối ưu code).
 
@ndu96081631:
Wow, chính mod diễn đàn đã người khơi nguồn cuộc chiến văn chương, chứ chẳng phải là tôi. Chỉ có điều là phải tranh luận để giải quyết vấn đề. Tôi sai gì thì tôi sẽ sửa.

Tôi cũng chẳng cần cái chuyện nhỏ chuyện to. Đó chỉ là một cách đặt vấn đề của bản thân tôi. Nhưng bạn mod lại nói câu view với câu like. Rồi lại ngỏ ý "với diễn đàn, việc đó là chuyện nhỏ rồi nên phải bỏ hai chữ đấy đi". Thế là sao ta? Vậy là xây dựng diễn đàn sao ta? :v

Vấn đề giúp ích cho chính mình thì có lẽ ko được nữa rồi, vì tôi vi phạm nội quy post link kiếm tiền. OK thì nội quy, tôi hoàn toàn nhất trí và đã sửa link cẩn thận.

Còn việc giúp ích được cho người khác hay không thì thời gian sẽ trả lời thôi.

@PhanTuHuong: Tôi tự nhận thấy kinh nghiệm VBA không nhiều, lại không chuyên. Các vấn đề code nhanh, code chậm thì các cao thủ VBA trong forum đã bàn thảo chán rồi. Nên t không tham gia vụ so sánh :)
 
@ndu96081631:
Wow, chính mod diễn đàn đã người khơi nguồn cuộc chiến văn chương, chứ chẳng phải là tôi. Chỉ có điều là phải tranh luận để giải quyết vấn đề. Tôi sai gì thì tôi sẽ sửa.

Vậy thì bạn cứ tiếp tục TRANH với LUẬN nhé
Tôi không có ý kiến về vấn đề này, chỉ quan tâm đến CODE và GIẢI THUẬT. Nếu bạn có hứng thú, ta sẽ TRANH LUẬN về vấn đề này, đồng ý không?
(Là tranh luận về code của bạn đấy)
 
Lần chỉnh sửa cuối:
Code nội suy chỉ có vài dòng thôi. Post lên đây chắc chắn sẽ bị các cao thủ chê cười :)
 
Code nội suy chỉ có vài dòng thôi. Post lên đây chắc chắn sẽ bị các cao thủ chê cười :)
Ai dám chê!
Cũng như bạn nói ở trên:
Diễn đàn hoạt động được là nhờ công sức các thành viên nhiệt huyết tham gia.
Thì chắc nhiệt huyết của bạn cũng không thiếu! Bạn cứ đưa code lên, ta cùng bàn để học hỏi lẫn nhau chẳng phải tốt hơn không?
(Bạn khóa code mất tiêu, tôi chẳng xem được nên không biết nó có hay hay không? --=0)
 
Nói thật vụ code này em cũng đã từng trải. Đó là bên forum khác. Khi e post code cũng bị ngay các cao thủ bắt bài. Chê này chê nọ. Từ đó cạch đến già.

Trước nay em toàn làm theo ý thích, chẳng có quy chuẩn nào. Nhiều kỹ thuật đơn giản không chịu học hỏi mà cứ làm theo ý mình. Cứ gọi là dấu dốt đi cũng được. Nhưng còn hơn là bị nhìn như loại "ngựa non háu đá" :v

Còn vấn đề nhiệt huyết thì em đang cố gắng chia sẻ nhiều nhất và đơn giản nhất với người dùng cuối cùng. Kiến thức hạn hẹp, nên không biết các add-in nội suy khác có Hướng dẫn sử dụng, ví dụ mẫu như em không :v

VBA chỉ là một mảng thỉnh thoảng em mới dùng nên cũng ko dám đàm đạo :)
 
Nói thật vụ code này em cũng đã từng trải. Đó là bên forum khác. Khi e post code cũng bị ngay các cao thủ bắt bài. Chê này chê nọ. Từ đó cạch đến già.

Tôi lại khác bạn! Tôi không sợ ai chê code tôi dở mà chỉ sợ chẳng ai thèm góp ý với code của tôi thôi
Nếu ai đó chê code tôi dở, tôi sẽ dùng thí nghiệm để chứng minh rằng nó hay chổ nào. Đương nhiên, những người chỉ chê theo kiểu nói suông tôi chẳng bận tâm
Còn nếu người ta chê và góp ý đúng thì.. quá tốt chứ sao! Tôi lại học được thêm một kinh nghiệm hay
--------------------------------
Chỉ là quan điểm cá nhân của tôi thôi, mỗi người suy nghĩ khác nhau cũng chẳng ai ép nhau được
 
Đúng như bác nói. Nếu góp ý theo kiểu xây dựng thì không nói. Đằng này, một số người có kinh nghiệm, dùng uy tín của cả diễn đàn để nhận xét chê bai này nọ.

Cái tội của em là không tìm hiểu đến nơi đến chốn.

Cơ mà cũng không nên dấu dốt thật :)

Mã:
Public Function yns(xns As Double, x1 As Double, x2 As Double, y1 As Double, y2 As Double) As Variant
    If x1 = x2 Then
        If y1 = y2 Then
            yns = y1
        Else
            MsgBox "X1=X2 ma Y1<>Y2"
            yns = "#DIV/0!"
        End If
    Else
        yns = y2 + (xns - x2) * (y1 - y2) / (x1 - x2)
    End If
End Function
'////////////////////////
Public Function sip(x_sip As Double, a_sip As Range, b_sip As Range) As Variant
'SIP: Super InterPolate (Noi suy tu 2 cot/hang)
'Uu diem:       Tu tim kiem can tren va duoi cua x_sip tren cot/hang a
'                           va gia tri tuong ung tren cot/hang b
    Dim x1_sip As Double, x2_sip As Double, y1_sip As Double, y2_sip As Double
    x1_sip = mar(x_sip, a_sip, 1)
    x2_sip = mar(x_sip, a_sip, -1)
    y1_sip = vlu(x1_sip, a_sip, b_sip)
    y2_sip = vlu(x2_sip, a_sip, b_sip)
    sip = yns(x_sip, x1_sip, x2_sip, y1_sip, y2_sip)
End Function
'////////////////////////
Public Function xsip(x_xsip As Double, a_xsip As Range, y_xsip As Double, b_xsip As Range, c_xsip As Range) As Variant
'XSIP: X-Super InterPolate (Noi suy tu 1 hang, 1 cot va 1 bang)
'Uu diem:   Tu tim kiem can tren cua x_xsip tren cot/hang a
'                       va gia tri tuong ung tren cot/hang b
'Nhuoc diem:        So lieu phai duoc sap xep theo dung thu tu trong bang mau
    Dim x1_xsip As Double, x2_xsip As Double, y1_xsip As Double, y2_xsip As Double
    Dim n_xsip, j_xsip, m_xsip, am1_xsip As Double, am2_xsip As Double
    x1_xsip = mar(x_xsip, a_xsip, -1)
    x2_xsip = mar(x_xsip, a_xsip, 1)
    y1_xsip = mar(y_xsip, b_xsip, -1)
    y2_xsip = mar(y_xsip, b_xsip, 1)
    n_xsip = 0
    For j_xsip = 1 To cellcount(a_xsip)
        n_xsip = n_xsip + 1
        If a_xsip.Cells(j_xsip) = x1_xsip Then
            Exit For
        End If
    Next
    m_xsip = 0
    For j_xsip = 1 To cellcount(b_xsip)
        m_xsip = m_xsip + 1
        If b_xsip.Cells(j_xsip) = y1_xsip Then
            Exit For
        End If
    Next
    If y1_xsip = y2_xsip Then
        If x1_xsip <> x2_xsip Then
             xsip = yns(x_xsip, x1_xsip, x2_xsip, c_xsip.Cells(m_xsip, n_xsip), c_xsip.Cells(m_xsip, n_xsip + 1))
        Else
            xsip = c_xsip.Cells(m_xsip, n_xsip)
        End If
    Else
        If x1_xsip = x2_xsip Then
            am1_xsip = c_xsip.Cells(m_xsip, n_xsip)
            am2_xsip = c_xsip.Cells(m_xsip + 1, n_xsip)
        Else
            am1_xsip = yns(x_xsip, x1_xsip, x2_xsip, c_xsip.Cells(m_xsip, n_xsip), c_xsip.Cells(m_xsip, n_xsip + 1))
            am2_xsip = yns(x_xsip, x1_xsip, x2_xsip, c_xsip.Cells(m_xsip + 1, n_xsip), c_xsip.Cells(m_xsip + 1, n_xsip + 1))
        End If
        xsip = yns(y_xsip, y1_xsip, y2_xsip, am1_xsip, am2_xsip)
    End If
End Function

Hàm tìm kiếm cận trên và dưới
Mã:
Public Function mar(A_Mar As Double, Ran_Mar As Range, K_Mar As Integer)
    n_mar = 0
    If K_Mar = 1 Then                       'TH tim can tren (lon hon)
        For i = 1 To cellcount(Ran_Mar)
            If A_Mar <= Ran_Mar.Cells(i) Then
                mar = Ran_Mar.Cells(i)
                n_mar = 1
                Exit For
            End If
        Next
        If n_mar = 0 Then
            mar = "#NULL!"
            MsgBox "Khong ton tai can tren! (Up-Marginal doesn't exist)"
        Else
            For i = 1 To cellcount(Ran_Mar)
                If A_Mar <= Ran_Mar.Cells(i) And mar > Ran_Mar.Cells(i) Then
                    mar = Ran_Mar.Cells(i)
                End If
            Next
        End If
    Else
        If K_Mar = -1 Then              'TH tim can duoi (nho hon)
            For i = 1 To cellcount(Ran_Mar)
                If A_Mar >= Ran_Mar.Cells(i) Then
                    mar = Ran_Mar.Cells(i)
                    n_mar = 1
                    Exit For
                End If
            Next
            If n_mar = 0 Then
                mar = "#NULL!"
                MsgBox "Khong ton tai can duoi! (Down-Marginal doesn't exist)"
            Else
                For i = 1 To cellcount(Ran_Mar)
                    If A_Mar >= Ran_Mar.Cells(i) And mar < Ran_Mar.Cells(i) Then
                        mar = Ran_Mar.Cells(i)
                    End If
                Next
            End If
        End If
    End If
End Function
'////////////////////////
Public Function cellcount(rancc As Range)
'Dem so o trong Vung CSDL duoc chon
    Dim mycell
    cellcount = 0
    For Each mycell In rancc.Cells
        cellcount = cellcount + 1
    Next mycell
End Function
'////////////////////////
Public Function vlu(l As Double, a As Range, b As Range)
'Tra gia tri vlu co san trong cot/hang b, tuong ung voi l trong  cot/hang a
    Dim mycell
    Dim n As Integer, i As Integer
    For i = 1 To cellcount(a)
        If a.Cells(i) = l Then
            vlu = b.Cells(i)
            Exit For
        End If
    Next
End Function
 
Lần chỉnh sửa cuối:
Hàm vlu(x1_sip, a_sip, b_sip) là hàm gì vậy a, sao e chạy hok đượcc vậy ?
 
Mã code ở bài 15 nhìn mà hoa cả mắt & tôi đinh ninh là do 1 "Viện sỹ" lập ra, chư không phải tay ngang;

Nhưng dù sao cũng nên biến về dạng bình dân dễ nhìn 1 chút cho mọi người được tiếp cận dễ dàng.

Ý mình là các dòng lệnh nên trong khuôn khổ rõ ràng & thụt đầu dòng ngay ngắc chút đĩnh

Xin cảm ơn rất nhiều nếu được vậy!
 
Mã code ở bài 15 nhìn mà hoa cả mắt & tôi đinh ninh là do 1 "Viện sỹ" lập ra, chư không phải tay ngang;

Nhưng dù sao cũng nên biến về dạng bình dân dễ nhìn 1 chút cho mọi người được tiếp cận dễ dàng.

Ý mình là các dòng lệnh nên trong khuôn khổ rõ ràng & thụt đầu dòng ngay ngắc chút đĩnh

Xin cảm ơn rất nhiều nếu được vậy!

Cảm ơn bác đã góp ý!
 
cám ơn bác , e đang học sắp thi exel
 
mình vướng vào trường hợp2:nhưng trong excel của mình sao ko có lệnh sip() nhỉ
 
Web KT
Back
Top Bottom