viết code cho phép tính nội suy (1 người xem)

Liên hệ QC

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

van13781

Thành viên mới
Tham gia
4/5/07
Bài viết
2
Được thích
1
Chào tất cả các bạn. Hôm trước mình có xem trên diễn đàn một đoạn code để phục vụ cho phép tính nội suy một chiều như sau:
PHP:
[LEFT]Function MangB(SoA, Arr1, Arr2) As Single
Dim A1, A2, B1, B2 As Single[/LEFT]
 
[LEFT]For Each Cell In Arr1
A1 = Cell.Offset(-1, 0)
A2 = Cell.Offset(0, 0)
B1 = Cell.Offset(-1, 1)
B2 = Cell.Offset(0, 1)[/LEFT]
 
[LEFT]If Cell.Value > SoA Then
MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
Exit For
End If
Next Cell
End Function[/LEFT]

Mình đã làm thử và thấy kết quả đúng khi 2 mảng dữ liệu Arr1 và Arr2 nằm cạnh nhau. Nếu 2 mảng dữ liệu Arr1 và Arr2 nằm cách nhau thì kết quả không đúng.
Mình sẽ đính kèm file mà mình cần tính. Mục đích của mình là chỉ cần nhập giá trị xây lắp vào các ô tương ứng với từng loại công trình (DD, Giao thông, thuỷ lợi...) thì ở dòng tỷ lệ định mức sẽ thể hiện được kết quả nội suy tương ứng với từng loại công trình đó. Có bạn nào biết thì chỉ giúp mình nhé vì công việc của mình cần tính nội suy rất nhiều mà mình thì không muốn tính theo kiểu đặt công thức thủ công vì rất dễ nhầm.
Cảm ơn các bạn nhiều!​
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Sao không dùng hàm TREND trong EXCEL ?
Syntax : TREND(known_y's,known_x's,new_x's,const)
 
Upvote 0
Bạn có thể hướng dẫn cách sử dụng hàm trend được không? mình tìm trên GPE nhưng chỉ có sử dụng bằng tiếng anh thoi.cam on ban nhe.
 
Upvote 0
Sao không dùng hàm TREND trong EXCEL ?
Syntax : TREND(known_y's,known_x's,new_x's,const)
Dùng hàm này để nội suy sẽ không chính xác. Ví dụ như trường hợp của bảng tính dưới đây: Cùng một giá trị xây lắp đưa vào tính nội suy, nhưng ra hai kết quả khác nhau.
 

File đính kèm

Upvote 0
Chào tất cả các bạn. Hôm trước mình có xem trên diễn đàn một đoạn code để phục vụ cho phép tính nội suy một chiều như sau:

Function MangB(SoA, Arr1, Arr2) As Single
Dim A1, A2, B1, B2 As Single​

For Each Cell In Arr1
A1 = Cell.Offset(-1, 0)
A2 = Cell.Offset(0, 0)
B1 = Cell.Offset(-1, 1)
B2 = Cell.Offset(0, 1)​

If Cell.Value > SoA Then
MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
Exit For
End If
Next Cell
End Function​

Mình đã làm thử và thấy kết quả đúng khi 2 mảng dữ liệu Arr1 và Arr2 nằm cạnh nhau. Nếu 2 mảng dữ liệu Arr1 và Arr2 nằm cách nhau thì kết quả không đúng.
Mình sẽ đính kèm file mà mình cần tính. Mục đích của mình là chỉ cần nhập giá trị xây lắp vào các ô tương ứng với từng loại công trình (DD, Giao thông, thuỷ lợi...) thì ở dòng tỷ lệ định mức sẽ thể hiện được kết quả nội suy tương ứng với từng loại công trình đó. Có bạn nào biết thì chỉ giúp mình nhé vì công việc của mình cần tính nội suy rất nhiều mà mình thì không muốn tính theo kiểu đặt công thức thủ công vì rất dễ nhầm.
Cảm ơn các bạn nhiều!​

em cũng đang có nhu cầu về nội suy, nhưng sao mấy dòng này cho vào đâu ạ,
em chưa biết chút nào về code, ngoài mấy công thức +-*/ và vài hàm sum, averagee,...
 
Upvote 0
Hôm trước mình có xem trên diễn đàn một đoạn code để phục vụ cho phép tính nội suy một chiều như sau:
PHP:
Function MangB(SoA, Arr1, Arr2) As Single
Dim A1, A2, B1, B2 As Single
 
For Each Cell In Arr1
   A1 = Cell.Offset(-1, 0)
   A2 = Cell.Offset(0, 0)
   B1 = Cell.Offset(-1, 1)
   B2 = Cell.Offset(0, 1) 
   If Cell.Value > SoA Then
       MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
       Exit For
   End If
Next Cell
End Function

Mình đã làm thử và thấy kết quả đúng khi 2 mảng dữ liệu Arr1 và Arr2 nằm cạnh nhau. Nếu 2 mảng dữ liệu Arr1 và Arr2 nằm cách nhau thì kết quả không đúng.

Đoạn Code của bạn trích dẫn có thể làm chúng ta choáng ngợp đó thôi;
Như tôi thì cứ ngang ngay sổ thẳng như vầy:

PHP:
Option Explicit
Function NoiSuy(SoA, Arr1, Arr2) As Single
  Dim A1 As Double, A2 As Double, B1 As Double, B2 As Double
  Dim Cell As Range

  For Each Cell In Arr1
     A1 = Cell.Offset(-1, 0):          B1 = Cell.Offset(-1, 1)
     A2 = Cell.Offset(0, 0):           B2 = Cell.Offset(0, 1)

     If Cell.Value > SoA Then
       NoiSuy = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
       Exit For
     End If
  Next Cell
End Function

Một khi đã tường minh như vậy, thì thấy ngay rằng mảng Arr2 chả tham gia gì vô tiến trình tính toán của hàm hết
Có nghĩa là không có (nó) không xong, nhưng có chẳng để làm gì.

Chú í thêm rắng, bằng câu lệnh Dim A1, A2, B1, B2 As Single

Tác giả khai 3 biến kiểu variants & 1 biến kiểu Single
Điếu này mình chỉ dám nói là vừa thiếu lại vừa thừa:

Thiếu ở chổ trong tính toàn có fép chia, ai đảm bảo rằng sẽ không fát sinh số thập fân. (Mà thường nội suy là đụng đến số thập fân) vây khai biến kiểu Single sẽ làm thương số không lấy hết các chữ số cần thiết
Thừa ở ba biến kiểu Variant - Là các biến có thể chứa cơ man nào là thứ trong nớ, như mảng, đối tượng,. . . không cần thiết.

Cho nên cái tật tiết kiệm (không dám nói do lười) 1 vài fút mà hại cả cuộc đời của 1 hàm.

Chiêm nghiệm lại ông bà ta nói cấm có sai, rằng "Sai 1 li đi 1 dậm"
Với thời đại tên lữa & vũ trụ thì ta nên cải biên lại: Sai 1 giây, đi tong ngay năm bảy dậm!
 
Upvote 0
Đoạn Code của bạn trích dẫn có thể làm chúng ta choáng ngợp đó thôi;
Như tôi thì cứ ngang ngay sổ thẳng như vầy:

PHP:
Option Explicit
Function NoiSuy(SoA, Arr1, Arr2) As Single
  Dim A1 As Double, A2 As Double, B1 As Double, B2 As Double
  Dim Cell As Range

  For Each Cell In Arr1
     A1 = Cell.Offset(-1, 0):          B1 = Cell.Offset(-1, 1)
     A2 = Cell.Offset(0, 0):           B2 = Cell.Offset(0, 1)

     If Cell.Value > SoA Then
       NoiSuy = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
       Exit For
     End If
  Next Cell
End Function

Một khi đã tường minh như vậy, thì thấy ngay rằng mảng Arr2 chả tham gia gì vô tiến trình tính toán của hàm hết
Có nghĩa là không có (nó) không xong, nhưng có chẳng để làm gì.

Chú í thêm rắng, bằng câu lệnh Dim A1, A2, B1, B2 As Single

Tác giả khai 3 biến kiểu variants & 1 biến kiểu Single
Điếu này mình chỉ dám nói là vừa thiếu lại vừa thừa:

Thiếu ở chổ trong tính toàn có fép chia, ai đảm bảo rằng sẽ không fát sinh số thập fân. (Mà thường nội suy là đụng đến số thập fân) vây khai biến kiểu Single sẽ làm thương số không lấy hết các chữ số cần thiết
Thừa ở ba biến kiểu Variant - Là các biến có thể chứa cơ man nào là thứ trong nớ, như mảng, đối tượng,. . . không cần thiết.

Cho nên cái tật tiết kiệm (không dám nói do lười) 1 vài fút mà hại cả cuộc đời của 1 hàm.

Chiêm nghiệm lại ông bà ta nói cấm có sai, rằng "Sai 1 li đi 1 dậm"
Với thời đại tên lữa & vũ trụ thì ta nên cải biên lại: Sai 1 giây, đi tong ngay năm bảy dậm!
Em đang tự học VBA, thấy đoạn code của a dễ hiểu và rất khoa học. Nhưng câu hỏi của chủ topic đặt ra là khi 2 mang ta đặt ở cạnh nhau thì sử dụng hàm cho kết quả đúng. Khi 2 mảng không đặt cạnh nhau thì cho kết quả sai. Em đã thử và thấy cũng gặp tình trạng như vậy. Ai giải thích giùm đi ạ! Cảm ơn diễn đàn GPE rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom