Tra bảng - Help me!

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

papa2008

Thành viên mới
Tham gia
3/3/08
Bài viết
2
Được thích
1
Mình cần tra bảng dữ liệu (khối lượng dữ liệu tương đối lớn), nhưng không biết cách giải quyết ra sao (minh không biét về VBA), mong các cao thủ giúp đỡ.
b1 b2 b3
a1 C11 C12 C13
a2 C21 C22 C23
a3 C31 C32 C33

[FONT=.VnArial]Tra b¶ng C (a,b) = ? [/FONT]​

[FONT=.VnArial]- TH1: NÕu a = ai vµ b = bj th× C(a,b) = Cij[/FONT]

[FONT=.VnArial]- TH2: NÕu a [/FONT]¹[FONT=.VnArial] ai vµ b [/FONT]¹[FONT=.VnArial] bj[/FONT][FONT=.VnArial] vµ [/FONT][FONT=.VnArial]a i < a < a i + 1[/FONT][FONT=.VnArial]b j < b < [/FONT][FONT=.VnArial]b j + 1[/FONT]
[FONT=.VnArial]khi ®ã [/FONT][FONT=.VnArial]C1 = C i,j + ( C i+1,j - C i,j ) / ( a i+1 - a i ) * ( a - a i )[/FONT]
[FONT=.VnArial] C2 = C i,j+1 + ( C i+1,j+1 - C i,j+1 ) / ( a i+1 - a i ) * ( a - a i )[/FONT]
[FONT=.VnArial] C(a,b) = C1 + ( C2 - C1 ) / ( b j+1 - b j ) * ( b - b j )[/FONT]
 

File đính kèm

Lần chỉnh sửa cuối:
- Dữ liệu trong bảng là ngẫu nhiên, còn dữ liệu ở cột ai và bj có thể được sắp xếp tăng dần hoặc giảm dần (nếu ai và bj không được sắp xếp thì sao?)
- Th a=ai và b<>bj có thể đưa về dạng TH2
( C i+1,j - C i,j ) / ( a i+1 - a i ) * ( a - a i ) là (a-ai) được nhân trên tử số (thực ra đấy là công thức nội suy giá trị ở giữa 2 hàng hay cột)

Mong các bác giúp để giải quyết bài toán trên. Thank.
 
Bạn dùng hàm tự tạo này xem sao.

PHP:
Option Explicit
Dim Rng As Range, Clls As Range
Function TraBangDL(VungTra As Range, xX As Double, yY As Double)
 Dim XxRng As Range, YyRng As Range
 
 Set XxRng = Range(VungTra.Cells(1, 1), Cells(VungTra.Rows.Count, 1))
 Set YyRng = VungTra.Cells(1, 1).Resize(1, VungTra.Columns.Count)
 For Each Clls In XxRng
    With Clls
        If .Value = xX Then
            For Each Rng In YyRng
                If Rng.Value = yY Then
                    TraBangDL = Clls.Offset(, Rng.Column - 1).Value
                    Exit Function
                End If
            Next Rng
        ElseIf .Value > xX Then
            Dim A_A As Double, AA As Double, dTemp2 As Double
            Dim B_B As Double, BB As Double, dTemp1 As Double
            Dim bCot As Byte
            
            A_A = .Value - .Offset(-1):         AA = xX - .Offset(-1)
            For Each Rng In YyRng
                With Rng
                    If .Value > yY Then
                        B_B = .Value - .Offset(, -1).Value
                        BB = yY - .Offset(, -1).Value
                        bCot = .Column - 1
                    End If
                End With
            Next Rng
            dTemp1 = .Offset(, bCot - 1) + (.Offset(1, bCot) - .Offset(, bCot - 1)) / A_A * AA
            dTemp2 = .Offset(, bCot) + (.Offset(1, bCot) - .Offset(, bCot)) / B_B * BB
            Exit For
        End If
    End With
 Next Clls
 TraBangDL = dTemp1 + (dTemp2 - dTemp1) / B_B * BB
End Function

Xem thêm trong file đính kèm!
 

File đính kèm

Trước đây, khi tôi chưa biết về VBA, với bài toán trên tôi dùng toàn là hàm IF trong Excel thì vẫn giải quyết được nhưng khá dài dòng mà rất dễ lộn và phải lập thêm 1 bảng nữa nên rất bất tiện. Tôi khuyên bạn nên viết hàm bằng VBA thì chủ động và dễ kiểm soát hơn đồng thời ngắn gọn đi rất nhiều......

Thực chất vấn đề tra bảng như Papa2008 đã nêu là phương pháp nội suy 2 chiều, đã có rất nhiều bài viết nói về vấn đề này trong diễn đàn. Tôi có làm 1 ví dụ tương tự bằng số, hy vọng là đúng ý của bạn:
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Cái này phải hỏi trực tiếp các chuyên gia về công thức

papa2008 đã viết:
Cho em hỏi thêm 1 chút là bài toán trên có thể giải quyết được nhờ vào các hàm có sẵn trong excel không ạ?
Trên diễn đàn gần đây, chúng ta dễ xác định các chuyên gia bậc thầy như vậy, ví dụ AnhTuấn, HanDung107, ThuNghi, . . .
Còn nếu tham khảo tiếp về VBA trong nội suy 2 chiều như thế nào, thì bạn thử ghé đến đây: http://giaiphapexcel.com/forum/showthread.php?t=5828&page=2 khi rảnh rỗi, xem sao nha! (Hình như công thức tính hơi khác so với của bạn.)
HoaNguoi.jpg
Thân ái!
 
He... he... Xin hỏi ngoài lề 1 chút: Tôi thường thấy trên diển đàn mọi người hay dùng thuật ngữ NỘI SUY.. vậy cho hỏi nó là cái gì vậy?
Thông cãm, trình độ kém, chưa từng bước chân vào giãng đường ĐH nên có rất nhiều món tôi nghe như vịt nghe sấm...
Mong các bạn giãi thích nôm na cho tôi hiểu với!
(vì ko hiểu nên cũng ko biết phải làm thế nào cả)
Mến
ANH TUẤN
 
Trả lời 'ngoài lề' một chút!

Hỏi ngoài lề 1 chút: Tôi thường thấy thuật ngữ NỘI SUY.. vậy cho hỏi nó là cái gì vậy? Mong các bạn giãi thích nôm na cho tôi hiểu với!
(vì ko hiểu nên cũng ko biết phải làm thế nào cả) ANH TUẤN
Mình cũng mới quen cái ni khi vô diễn đàn này, đó!
Nôm na cái NS 1 chiều trước nha:
Cách đây 10 thế kỉ, cha ông ta biết số PI khoảng 3 hay hơn 3 chút. Nó là = 22/7 để làm ra các bánh xe bò í mà!;
Khi chúng ta học lớp 3 hay lớp 4; chúng ta biết chính xác hơn những bật tiền bối, nó là 3,14;
Lên đến cấp 2 (Ông Bộ GDĐT gọi là phổ thông CS) ta tiến thêm 1 bước;
PI = 3,14159
Nhưng khi cônghệ vũ trụ & tên lữa vượt đai châu ra đời, thì số PI cần xác định chính xác hơn. Điều này nhằm đáp ứng iểu cầu bắn trúng quả táo trên cửa sổ lầu năm góc ở 1 nới cách xa 1 vạn cây số, với quỹ đạo elíp hay gần tròn;
Lúc đó công thức =22/7 không hữu dụng, mà phải máy tính điện tử với 14 chữ số sau con số 3 kia!
Phát triển thêm do nhu cầu tự thân của khoa học & kỹ thuật; không gian có đến 3 chiều; nên những gia trị cần tìm chính xác lại càng nhiều;
Không như số PI chỉ từ đường kính & chu vi; mà các thông số quyết bỡi 3,4,. . . các thông số khác; Ví dụ: PV = rT
Nên r phải suy ra từ 3 biến là vậy;. . . Sau này cái ông Menđeleép còn thêm vô đây cái thông số n nữa để chỉ thành phần hóa học của nó ảnh hưởng NTN đến công thức trên. và còn dài dài. . . . . Cuối cùng trở thành
P = (RT/( V - b) ) - a/V^2 như hiện nay
(Còn sau này thì . . . chưa biết. Lúc cuối đời của anh em mình, còn thứ gì nhào vô nữa không chừng!)


( Có gì sai trái mong các thầy cô bỏ quá cho & hiệu chỉnh kiến thức phổ thông giúp với nha!)

NHỜ CÁC MOD/SMOD XÓA GIÚP BÀI NÀY CHIỀU NAY NHA!
CẢM ƠN NHIỀU​
CamChuongR.jpg
 
Rất đáng nể về kiến thức - trí nhớ & tư duy của bác SA!
Chúc bác luôn mạnh khỏe (để share cho anh em được nhiều điều bổ ích, thú vị)
Thân ái!
 
Ôi Pác SA không những giỏi về VBA mà còn giỏi về viết văn nữa, không chừng Pác kiêm thêm nghiệp báo chí cũng hay lắm đấy.... Theo cách suy nghĩ nông dân của tôi thì nội suy là tìm một giá trị gần đúng nằm ở giữa của cận trên và cận dưới (hàng trên và hàng dưới hay cột bên trái và cột bên phải), nếu suy nghĩ có gì chưa đúng mong các Pác thông cảm và đừng cười nhé ....!!!!!
 
Web KT

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

Back
Top Bottom