PDA

View Full Version : Xin add in nội suy 1 chiều và 2 chiều



ohlexus
04-04-12, 08:05 PM
Mình kiếm đc trong diễn đàn các hàm nội suy 1 chiều và 2 chiều rồi nhưng giờ mình muốn tạo thành add in để sử dụng cho bất kỳ bảng tính nào cũng đc, nhưng ko bít làm ntn, mong các bạn giúp đỡ
Đây là hàm mình đang dùng:

Function noisuy1(vungtra As Range, X As Double, cot As Integer) As Double
'ham noi suy 1 chieu
Dim ktra As Boolean
Dim i As Integer
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
For i = 1 To vungtra.Cells.Count
kiemtra = False
If vungtra.Cells(i, 1) <= X And vungtra.Cells(i + 1, 1) >= X Then
x1 = vungtra.Cells(i, 1): x2 = vungtra.Cells(i + 1, 1)
y1 = vungtra.Cells(i, cot): y2 = vungtra.Cells(i + 1, cot)
noisuy1 = (y2 - y1) * (X - x1) / (x2 - x1) + y1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
End Function

Function noisuy2(vungtra As Range, X As Double, Y As Double) As Double
'ham noi suy 2 chieu
Dim ktra As Boolean
Dim i As Integer, j As Integer
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
Dim a11 As Double, a12 As Double, a21 As Double, a22 As Double
Dim t1 As Double, t2 As Double
For j = 2 To vungtra.Cells.Count

If vungtra.Cells(1, j) <= Y And vungtra.Cells(1, j + 1) >= Y Then
For i = 2 To vungtra.Cells.Count
ktra = False
If vungtra.Cells(i, 1) <= X And vungtra.Cells(i + 1, 1) >= X Then
x1 = vungtra.Cells(i, 1): x2 = vungtra.Cells(i + 1, 1)
y1 = vungtra.Cells(1, j): y2 = vungtra.Cells(1, j + 1)
a11 = vungtra.Cells(i, j): a12 = vungtra.Cells(i, j + 1)
a21 = vungtra.Cells(i + 1, j): a22 = vungtra.Cells(i + 1, j + 1)
t1 = (a12 - a11) * (Y - y1) / (y2 - y1) + a11
t2 = (a22 - a21) * (Y - y1) / (y2 - y1) + a21
noisuy2 = (t2 - t1) * (X - x1) / (x2 - x1) + t1

End If
Next i
ktra = True
End If
Next j
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
End Function

ohlexus
05-04-12, 05:15 PM
Có cách nào ko các bạn nhỉ

MicrosoftExcel
30-05-12, 10:55 PM
Cách đơn giản nhất và chuối nhất là bạn mở excel ra, nhấn ALT+F11, chuột phải vào ThisWorkbook, chọn Insert/Module. Copy code, paste vào trang mới mở ra đấy. Trở về cửa sổ excel, xoá sheet2,3 đi. Vào file, chọn save, bước này nhớ chọn định dạng là Add in trong ô Save as type. Thế là xong rồi đấy bạn.

mr.ts91
20-03-13, 12:40 PM
làm sao để chạy được đoạn mã này trong bảng excel. ta nhập công thức như thế nào vậy? ai biết xin chỉ cụ thể giúp với!

hungpecc1
20-03-13, 12:48 PM
làm sao để chạy được đoạn mã này trong bảng excel. ta nhập công thức như thế nào vậy? ai biết xin chỉ cụ thể giúp với!

Lưu code trên vào 1 file excel --> save as addin(1997-2003) ( file này có đuôi là *xla )

với phiên bản 2007-2010
--->Mở file excel mới lên --> File --> Option ---> Addin ---> click vào nút go ở phía dưới bên trái cửa sổ
--> browser và chọn đến file addin ( *xla) của bạn và tích dấu "v" vào khung cửa sổ chọn


--> tại một ô cell bất kỳ trên bảng tính bạn gõ công thức = noisuy2(.....) là ok

quansla
30-03-13, 05:04 PM
Mình kiếm đc trong diễn đàn các hàm nội suy 1 chiều và 2 chiều rồi nhưng giờ mình muốn tạo thành add in để sử dụng cho bất kỳ bảng tính nào cũng đc, nhưng ko bít làm ntn, mong các bạn giúp đỡ
Đây là hàm mình đang dùng:


Mọi người cho mình hỏi, với các hàm phía trên thì nếu trường hợp nội suy không giống như người lập trình viết thì kết quả không đúng, có cách nào để code đúng với mọi trường hợp không
Cụ thể ở đây là:
nếu hàng nội suy đối số Y của hàm không xắp xếp tăng dần mà giảm dần:>>Hàm sẽ thông báo Msg
Nếu cột nội suy tham số X của hàm không xắp xếp tăng dần mà giảm dẫn>> cũng thế
Vậy để code luôn đúng thì sửa code thế nào? trên diễn đàn đã có Code nào đầy đủ đáp ứng yêu cầu này chưa?
Và cũng cho mình hỏi luôn cách làm là hiện Mgs thì nếu vùng tra nội suy có sự thay đổi(nghiêm trọng) mà dẫn đến nhiều công thức (đã viết trước dùng hàm Noisuy1,noisuy2) chuyến sang sai thì kết quả là ô bị sai là số 0 và User liên tục nhấn Ok,(hoặc tick chuột Close) nghe hơi nản, có cách khác không mọi người
Cho mình cảm ơn trước nha