1 công thức cho ra 2 kết quả????

Liên hệ QC

connhangheo

Thành viên thường trực
Tham gia
18/5/07
Bài viết
214
Được thích
225
Nghề nghiệp
Sinh Viên
Các bác xem giúp em 2 cái file này với , em ko hiểu trong file nemmongtuananh nó có vấn đề gì mà lại ra kết quả sai??? Thanks các bác trước
20 lần tải rồi mà chưa bác nào giúp được em ạ. Em đã thử dùng hàm dưới dạng add-in những vẫn ko được. Em mở file mới, thấy hàm vẫn okei. Những file đã tồn tại từ trước thì có file ra kết quả đúng, có file ra kết quả sai??? Ko thể nào hiểu nổi//////
 

File đính kèm

Lần chỉnh sửa cuối:
Cụ thể là công thức nào cho ra 2 kết quả. Bạn miêu tả chi tiết thêm chút nữa. Tôi đọc mà chưa hiểu bạn hỏi gì.
 
Upvote 0
bác mở 2 file ra thấy ngay 2 ô màu vàng đó, tong 2 ô đó có công thức với nội dung như nhau nhưng cho ra 2 kết quả khác nhau. Ô K14 trong sheet2 file nenmongtuananh, và ô I18 trong sheet 2chieu của file noisuy. Trong file noisuy thì công thức ra kết quả đúng còn trong file nenmongtuananh thì thử chỗ nào cũng thấy sai. Ko biết là do đâu, mong các bác giúp đỡ. Thanks
 
Upvote 0
* Oh, funtion noisuy2 của bạn cho kết quả k ổn định; đã sửa rồi

@ Oh, funtion noisuy2 của bạn cho kết quả k ổn định; bạn hãy tham khảo Func tigertiger đã viết lại cho bạn rồi nhé, giờ thì kết quả ổn định,
nhưng lưu ý kết quả chính xác (thuật toán nội suy) hay ko - thì bạn tự kiểm tra nhé vì mình giữ nguyên phần này của bạn mà,

@ tôi chưa xem noisuy1, nhưng bạn tự sửa lại sau khi tham khảo funtion NoiSuy2 đã sửa nhé (tôi nghi ngờ nó sai lun vì vungtra.cells.count là trả về số ô của toàn bộ vùng đó)


PHP:
Function NoiSuy2(vungtra As Range, X As Double, Y As Double) As Double
    'ham noi suy 2 chieu DA SUA BOI tigertiger GPE
    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
    Dim kQ As Double
    
    kQ = -999999
    kTra = False
    For j = 2 To vungtra.Columns.Count - 1
      If vungtra(1, j) <= Y And vungtra(1, j + 1) >= Y Then
       For i = 2 To vungtra.Rows.Count - 1
        
        If vungtra(i, 1) <= X And vungtra(i + 1, 1) >= X Then
         x1 = vungtra(i, 1): x2 = vungtra(i + 1, 1)
         y1 = vungtra(1, j): y2 = vungtra(1, j + 1)
         a11 = vungtra(i, j): a12 = vungtra(i, j + 1)
         a21 = vungtra(i + 1, j): a22 = vungtra(i + 1, j + 1)
         t1 = (a12 - a11) * (Y - y1) / (y2 - y1) + a11
         t2 = (a22 - a21) * (Y - y1) / (y2 - y1) + a21
         kQ = (t2 - t1) * (X - x1) / (x2 - x1) + t1
         kTra = True
        End If
        If kTra Then Exit For
       Next i
      End If
       If kTra Then Exit For
    Next j
    
    If Not kTra Then MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
     
    NoiSuy2 = kQ
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
cho em hỏi là vì sao kết quả nó lại ko ổn định khi mình dùng vungtra.cells (đáng ra phải cùng vungtra.rows/columns)????
 
Upvote 0
connhangheo đã viết:
cho em hỏi là vì sao kết quả nó lại ko ổn định khi mình dùng vungtra.cells (đáng ra phải cùng vungtra.rows/columns)????

oh, bạn đọc kỹ chưa vậy; Không ổn định là vì

+ Thứ 1: bạn dùng vungtra.cells.count -> trả về là tổng số cell trong vùng có nghĩa là: Vd vùng bạn có 4 hàng (rows) 5 cột (columns) tức là có 20 ô
thay vì bạn quét 4 hàng thui thì bạn lại quét 4 hàng thì bạn quét 20 hàng (=số ô) -> có những hànng trống hoặc Dl khác ko thuộc vùng tra
tương tự cho cột cũng vậy: thay vì bạn quét 5 cột thui thì bạn lại quét 20 20 cột (=số ô) -> có những cột trống hoặc chứa DL khác ko thuộc vùng tra
Như vậy có lúc kết quả đúng nếu nó rơi vào vùng bảng tra có lúc ko đúng nếu nó rơi ra ngoài (chứa những ô k có giá trị -tức =0 kể cả hàng /cột đầu (1) dùng để tra) -> ko ổn định.
+ thứ 2: Mặt khác bạn viết vungtra.cells(<...>) -> đó là chỉ số ô cụ thể (vật lý) -tigertiger nghi ngờ sai - vì nếu vungtra là range thì khi này ta dùng vungtra(<...>) - cái này bạn thử lại xem sao?
+
 
Upvote 0
Thêm 1 phiên bản, thêm 1 tham khảo!

PHP:
Option Explicit
Dim T1 As Double, T2 As Double, kQ As Double
Dim Rng As Range

Function NoiSuyR(VungTra As Range, xX As Double, yY As Double) As Double
'''Ham Noi Suy 2 Chieu DA SUA BOI SaDQ GPE'

    Dim iJ As Integer, wJ As Integer
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
    
    kQ = -9 ^9
    For wJ = 2 To VungTra.Columns.Count - 1
      If VungTra(1, wJ) <= yY And VungTra(1, wJ + 1) >= yY Then
      
       For iJ = 2 To VungTra.Rows.Count - 1
        If VungTra(iJ, 1) <= xX And VungTra(iJ + 1, 1) >= xX Then
         x1 = VungTra(iJ, 1):           x2 = VungTra(iJ + 1, 1)
         y1 = VungTra(1, wJ): y2 = VungTra(1, wJ + 1)
         Set Rng = VungTra(iJ, wJ).Resize(2, 2)
         T1 = (Rng(1, 2) - Rng(1, 1)) * (yY - y1) / (y2 - y1) + Rng(1, 1)
         T2 = (Rng(2, 2) - Rng(2, 1)) * (yY - y1) / (y2 - y1) + Rng(2, 1)
         kQ = (T2 - T1) * (xX - x1) / (x2 - x1) + T1
         Exit For
        End If
       Next iJ
      End If
    Next wJ
    NoiSuyR = kQ
End Function

( Khai báo 1 biến Range thay cho 4 biến #)
 
Lần chỉnh sửa cuối:
Upvote 0
em viết xong thử vài lần thấy đúng nên cũng ko xem lại, đến lúc thấy nó ra kết quả cứ lung tung nên em mới hoảng, trình em còn gà :))
 
Upvote 0
connhangheo đã viết:
em viết xong thử vài lần thấy đúng nên cũng ko xem lại, đến lúc thấy nó ra kết quả cứ lung tung nên em mới hoảng, trình em còn gà :))

Không ai đúng ngay đâu,
Tưởng đúng -> Thử -> Sai _> Thử sai -> Sai -> sửa ->thử ->sai ->Sửa -> đúng
cứ như vậy bạn ah
Nhưng hải thử tất cả các trường hợp: đặc biệt, bao biên, bất kỳ,...
.
 
Upvote 0
Web KT

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

Back
Top Bottom