Nội suy tuyến tính theo cột thời gian

Liên hệ QC

Thư Sinh Áo Trắng

Thành viên hoạt động
Tham gia
26/3/21
Bài viết
160
Được thích
31
- Em thấy khó quá và cực quá! Xin giúp đỡ!
- Hình ảnh vấn đề cần giúp đỡ bằng VBA(file đính kèm).Với x, y, z là cột thời gian (ví dụ 00:30, 01:00,...,23:30 và hh:mm có mm là số phút tùm lum nưac ạ), còn ab là các giá trị trên và dưới dấu ?. Hãy tìm giá trị ở vị trí dấu ?. Xin chân thành cảm ơn!
- File gốc 100.000 dòng ( Một trăm ngìn dòng)
minhhoa.jpg

- Hình ảnh công thức nội suy
noisuytuyentinh.jpg
- Xin các anh giúp cho phần code VBA tìm giá trị nội suy theo cột thời gian!Em chân thành cảm ơn!
 

File đính kèm

  • noisuytheocotthoigian.xlsm
    71.4 KB · Đọc: 19
Lần chỉnh sửa cuối:
Sao không cho vào topic bên kia luôn, đẻ ra nhiều quá vậy ? :p
Không cần phân trường hợp a>b hay a<b; Luôn là c = a + [(z-x)/(y-x)]*(b-a)
Nghe gì mà thấy khó dữ quá, khoảng thời gian của để bài luôn là cố định 30'. Vậy thì gia số luôn là [1 / (số khoảng bị thiếu +1 )] * (b-a)
Rồi cứ vậy cộng dồn lên thôi.
 
Upvote 0
Sao không cho vào topic bên kia luôn, đẻ ra nhiều quá vậy ? :p
Sợ không đúng chủ đề không ai giúp ạ.
Luôn là c = a + [(z-x)/(y-x)]*(b-a)
Nghe gì mà thấy khó dữ quá, khoảng thời gian của để bài luôn là cố định 30'. Vậy thì gia số luôn là [1 / (số khoảng bị thiếu +1 )] * (b-a)
Rồi cứ vậy cộng dồn lên thôi.
Dạ có dữ liệu nó dạng thời gian hh:mm tìm lum phút nữa ạ
Xin giúp em code VBA dạng nội suy theo thời gian hh:mm số phút tùm lum với ạ
 
Upvote 0
Sợ không đúng chủ đề không ai giúp ạ.

Dạ có dữ liệu nó dạng thời gian hh:mm tìm lum phút nữa ạ
Xin giúp em code VBA dạng nội suy theo thời gian hh:mm số phút tùm lum với ạ
Bạn điền kết quả mong muốn vào tất cả các dấu hỏi, hy vọng sẽ tìm ra giải pháp.
 
Upvote 0
Bạn điền kết quả mong muốn vào tất cả các dấu hỏi, hy vọng sẽ tìm ra giải pháp.
Em úp lại file và điền kết quả vào các dấu hỏi(Bài #1). Có hình minh họa. Cụ thể em đổi tất cả thời gian có định dạnh hh:mm thành tổng số phút. Và coi tồng số phút này là x, y, z. Mong anh và mọi người giỡ phần code VBA ạ!
 
Upvote 0
Em úp lại file và điền kết quả vào các dấu hỏi(Bài #1). Có hình minh họa. Cụ thể em đổi tất cả thời gian có định dạnh hh:mm thành tổng số phút. Và coi tồng số phút này là x, y, z. Mong anh và mọi người giỡ phần code VBA ạ!
Dữ liệu cột C và D phải là dạng chuổi như trong file
Không cần đổi thời gian sang phút
Chạy code
Mã:
Sub ABC()
  Dim Rng As Range, sRow&, i&, r&, k&, t#, h#
 
  With Sheets("Sheet1")
    Set Rng = .Range("A2:D" & .Range("A" & Rows.Count).End(xlUp).Row)
  End With
  sRow = Rng.Rows.Count
  Application.ScreenUpdating = False
  For i = 1 To sRow - 1
    If TypeName(Rng(i + 1, 3).Value) <> "String" Then
      For r = i + 1 To sRow - 1
        If TypeName(Rng(r + 1, 3).Value) = "String" Then
          t = Rng(r + 1, 1) + Rng(r + 1, 2) - Rng(i, 1) - Rng(i, 2)
          For k = i + 1 To r
            h = (Rng(k, 1) + Rng(k, 2) - Rng(i, 1) - Rng(i, 2)) / t
            Rng(k, 3).Value = Int(Rng(i, 3) + h * (Rng(r + 1, 3) - Rng(i, 3)))
            Rng(k, 4).Value = Int(Rng(i, 4) + h * (Rng(r + 1, 4) - Rng(i, 4)))
          Next k
          i = r + 1: Exit For
        End If
      Next r
    End If
  Next i
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Nghe nói "toán" lại có thêm từ "khó", tưởng đâu phải nội suy theo kiểu chỉnh tối ưu phương sai (least squares fitting - khó bỏ bố thật). Chứ từng cặp điểm thì bài toán chỉ là đơn giản tỷ lệ thay đổi củab y theo tan (đạo hàm).
Hình như thót chỉ vướng cái đơn vị tính thôi.
 
Upvote 0
Nghe nói "toán" lại có thêm từ "khó", tưởng đâu phải nội suy theo kiểu chỉnh tối ưu phương sai (least squares fitting - khó bỏ bố thật). Chứ từng cặp điểm thì bài toán chỉ là đơn giản tỷ lệ thay đổi củab y theo tan (đạo hàm).
Hình như thót chỉ vướng cái đơn vị tính thôi.
Cả toán và vba anh ạ hic hic.
" Nội suy theo kiểu chỉnh tối ưu phương sai" cảm ơn anh đã cho biết từ khóa này.
 
Upvote 0
Cả toán và vba anh ạ hic hic.
" Nội suy theo kiểu chỉnh tối ưu phương sai" cảm ơn anh đã cho biết từ khóa này.
Cái này không biết đang giúp bạn hay hại bạn và những người khác nữa.
Đang đoán là cái này đang là 1 báo cáo quan trắc, hoặc số liệu đo đạc bị "lủng", "thiếu" số liệu, giờ phải dùng đến phương án khó (Toán học + VBA) để nội suy bổ sung số liệu.
 
Upvote 0
Cái này không biết đang giúp bạn hay hại bạn và những người khác nữa.
Đang đoán là cái này đang là 1 báo cáo quan trắc, hoặc số liệu đo đạc bị "lủng", "thiếu" số liệu, giờ phải dùng đến phương án khó (Toán học + VBA) để nội suy bổ sung số liệu.
Chính xác anh ạ. Do chưa ngâm cứu sâu lên em phải tự lập dữ liệu. Nhưng ko đáng tin cậy, một số trang nước ngoài nó bán mấy cái số liệu này.
Em ngâm cho biết thôi. Chứ rất không hiểu sao 1 thứ không tạo ra của cải vật chất, mà nếu đào nó thì rất tốn điện gây hại môi trường mà giá nó cao vậy. Em ngâm cho biết thôi
 
Upvote 0
VBA mốc gì.
Excel có cả mớ hàm làm chuyện này:
Slope
Intercept
Forecast
Trend

Excel 2016 thêm một đống hàm nhóm Forecast. Bài này có thể dùng Forecast.Linear
 
Upvote 0
Nghe nói "toán" lại có thêm từ "khó"

mà nếu đào nó thì rất tốn điện gây hại môi trường mà giá nó cao vậy.
Ủa, vậy ra cái này là bitcoin hoặc cái gì đó tương tự hả bạn?
Bài này "khó" trong ngoặc thôi sếp.
Mình không biết bài này thực sự khó hay dễ nhưng đối với mình là quá khó luôn, huống chi đối với 1 thư sinh?!

1619161116801.png
 
Upvote 0
Ủa, vậy ra cái này là bitcoin hoặc cái gì đó tương tự hả bạn?

Mình không biết bài này thực sự khó hay dễ nhưng đối với mình là quá khó luôn, huống chi đối với 1 thư sinh?!

View attachment 257538
Em đã bẩu em ngâm cứu xem sao mà nó có giá cao đến vậy? Tại sao được gọi tiền ảo nói chung được tạo ra từ "thuật toán nào đó" mà đã là thuật toán thì giải bằng thuật toán mà lại dùng nhiều máy tính cấu hình lớn?
 
Lần chỉnh sửa cuối:
Upvote 0
Dữ liệu cột C và D phải là dạng chuổi như trong file
Không cần đổi thời gian sang phút
- Như vậy là để dùng code thì dữ liệu đầu vào chuyển hết sang dạng String
- Và nếu dữ liệu trống trong 2 cột giá trị là lệch nhau phải tính riêng từng giá trị t và r,h,k
Mò mãi mới ra. Công nhận code toán và vba là khó thât. Cảm ơn anh nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Dữ liệu cột C và D phải là dạng chuổi như trong file
Không cần đổi thời gian sang phút
Anh @HieuCD ơi! Em chạy Sub anh viết xong thì trong bảng vẫn còn dòng trống ạ!
Em post dữ liệu gốc và Sub em chỉnh sửa lên nhờ anh và các anh xử lý giúp em, sao cho nó nội suy hết dòng trống trong bảng dữ liệu em với!
Không biết dữ liệu nó lẫn kiểu dữ liệu gì vào mà nó sót không nội suy được! Hic hu hu
Em cảm ơn!
(file đính kèm)
Untitled.jpg
111.jpg
PHP:
Sub Noisuytuyentinh_mr_HieuCD()
  Dim Rng As Range, sRow&, i&, r&, k&, t#, h#, j&, r1&, k1&, t1#, h1#
  With Sheets("Sheet1")
    Set Rng = .Range("A2:D" & .Range("A" & Rows.Count).End(xlUp).Row)
  End With
  sRow = Rng.Rows.Count
  Application.ScreenUpdating = False
  For i = 1 To sRow - 1
    If TypeName(Rng(i + 1, 3).Value) <> "String" Then
      For r = i + 1 To sRow - 1
        If TypeName(Rng(r + 1, 3).Value) = "String" Then
          t = Rng(r + 1, 1) + Rng(r + 1, 2) - Rng(i, 1) - Rng(i, 2)
          For k = i + 1 To r
            h = (Rng(k, 1) + Rng(k, 2) - Rng(i, 1) - Rng(i, 2)) / t
            Rng(k, 3).Value = Int(Rng(i, 3) + h * (Rng(r + 1, 3) - Rng(i, 3)))
          Next k
          i = r + 1: Exit For
        End If
      Next r
    End If
  Next i

    For j = 1 To sRow - 1
    If TypeName(Rng(j + 1, 4).Value) <> "String" Then
      For r1 = j + 1 To sRow - 1
        If TypeName(Rng(r1 + 1, 4).Value) = "String" Then
          t1 = Rng(r1 + 1, 1) + Rng(r1 + 1, 2) - Rng(j, 1) - Rng(j, 2)
          For k1 = j + 1 To r1
            h1 = (Rng(k1, 1) + Rng(k1, 2) - Rng(j, 1) - Rng(j, 2)) / t1
            Rng(k1, 4).Value = Int(Rng(j, 4) + h1 * (Rng(r1 + 1, 4) - Rng(j, 4)))
          Next k1
          j = r1 + 1: Exit For
        End If
      Next r1
    End If
  Next j
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • noisuytheocotthoigian.xlsm
    3.3 MB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Anh @HieuCD ơi! Em chạy Sub anh viết xong thì trong bảng vẫn còn dòng trống ạ!
Em post dữ liệu gốc và Sub em chỉnh sửa lên nhờ anh và các anh xử lý giúp em, sao cho nó nội suy hết dòng trống trong bảng dữ liệu em với!
Không biết dữ liệu nó lẫn kiểu dữ liệu gì vào mà nó sót không nội suy được! Hic hu hu
Em cảm ơn!
(file đính kèm)
View attachment 257638
View attachment 257640
PHP:
Sub Noisuytuyentinh_mr_HieuCD()
  Dim Rng As Range, sRow&, i&, r&, k&, t#, h#, j&, r1&, k1&, t1#, h1#
  With Sheets("Sheet1")
    Set Rng = .Range("A2:D" & .Range("A" & Rows.Count).End(xlUp).Row)
  End With
  sRow = Rng.Rows.Count
  Application.ScreenUpdating = False
  For i = 1 To sRow - 1
    If TypeName(Rng(i + 1, 3).Value) <> "String" Then
      For r = i + 1 To sRow - 1
        If TypeName(Rng(r + 1, 3).Value) = "String" Then
          t = Rng(r + 1, 1) + Rng(r + 1, 2) - Rng(i, 1) - Rng(i, 2)
          For k = i + 1 To r
            h = (Rng(k, 1) + Rng(k, 2) - Rng(i, 1) - Rng(i, 2)) / t
            Rng(k, 3).Value = Int(Rng(i, 3) + h * (Rng(r + 1, 3) - Rng(i, 3)))
          Next k
          i = r + 1: Exit For
        End If
      Next r
    End If
  Next i

    For j = 1 To sRow - 1
    If TypeName(Rng(j + 1, 4).Value) <> "String" Then
      For r1 = j + 1 To sRow - 1
        If TypeName(Rng(r1 + 1, 4).Value) = "String" Then
          t1 = Rng(r1 + 1, 1) + Rng(r1 + 1, 2) - Rng(j, 1) - Rng(j, 2)
          For k1 = j + 1 To r1
            h1 = (Rng(k1, 1) + Rng(k1, 2) - Rng(j, 1) - Rng(j, 2)) / t1
            Rng(k1, 4).Value = Int(Rng(j, 4) + h1 * (Rng(r1 + 1, 4) - Rng(j, 4)))
          Next k1
          j = r1 + 1: Exit For
        End If
      Next r1
    End If
  Next j
  Application.ScreenUpdating = True
End Sub
Chỉnh lại
Mã:
Sub Noisuytuyentinh_mrHieuCD()
  Dim Rng As Range, sRow&, i&, r&, k&, t#, h#, j&, r1&, k1&, t1#, h1#

  With Sheets("Sheet1")
    i = .Range("A" & Rows.Count).End(xlUp).Row 'Bo lenh nay
    .Range("A2:D" & i).Value = .Range("O2:R" & i).Value 'Bo lenh nay
    Set Rng = .Range("A2:D" & .Range("A" & Rows.Count).End(xlUp).Row)
  End With
  sRow = Rng.Rows.Count
  Application.ScreenUpdating = False
  For i = 1 To sRow - 1
    For j = 3 To 4
      If Rng(i , j).Value <> Empty And Rng(i + 1, j).Value = Empty Then
        For r = i + 1 To sRow - 1
          If Rng(r + 1, j).Value <> Empty Then
            t = Rng(r + 1, 1) + Rng(r + 1, 2) - Rng(i, 1) - Rng(i, 2)
            For k = i + 1 To r
              h = (Rng(k, 1) + Rng(k, 2) - Rng(i, 1) - Rng(i, 2)) / t
              Rng(k, j).Value = Int(Rng(i, j) + h * (Rng(r + 1, j) - Rng(i, j)))
            Next k
            Exit For
          End If
        Next r
      End If
    Next j
  Next i
  Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chỉnh lại
Mã:
Sub Noisuytuyentinh_mrHieuCD()
  Dim Rng As Range, sRow&, i&, r&, k&, t#, h#, j&, r1&, k1&, t1#, h1#

  With Sheets("Sheet1")
    i = .Range("A" & Rows.Count).End(xlUp).Row 'Bo lenh nay
    .Range("A2:D" & i).Value = .Range("O2:R" & i).Value 'Bo lenh nay
    Set Rng = .Range("A2:D" & .Range("A" & Rows.Count).End(xlUp).Row)
  End With
  sRow = Rng.Rows.Count
  Application.ScreenUpdating = False
  For i = 1 To sRow - 1
    For j = 3 To 4
      If Rng(i + 1, j).Value = Empty Then
        For r = i + 1 To sRow - 1
          If Rng(r + 1, j).Value <> Empty Then
            t = Rng(r + 1, 1) + Rng(r + 1, 2) - Rng(i, 1) - Rng(i, 2)
            For k = i + 1 To r
              h = (Rng(k, 1) + Rng(k, 2) - Rng(i, 1) - Rng(i, 2)) / t
              Rng(k, j).Value = Int(Rng(i, j) + h * (Rng(r + 1, j) - Rng(i, j)))
            Next k
            Exit For
          End If
        Next r
      End If
    Next j
  Next i
  Application.ScreenUpdating = True
End Sub
- Cảm ơn anh @HieuCD
- Hóa ra mấy ngày nay không sửa được code do nhầm lẫn do em bỏ Empty vào ngoặc kép "Empty".
- Và còn vẫn chưa hiểu vòng for k và for r. Xin anh chỉ cho biết 3 vòng For này tuần tự ra sao. Hình như code này của anh mới áp dụng đc cho cả bảng dữ liệu, em có tìm nhưng không có cái nào có thể dùng đc vào bài. Mong anh chỉ cho ạ!
 
Upvote 0
- Cảm ơn anh @HieuCD
- Hóa ra mấy ngày nay không sửa được code do nhầm lẫn do em bỏ Empty vào ngoặc kép "Empty".
- Và còn vẫn chưa hiểu vòng for k và for r. Xin anh chỉ cho biết 3 vòng For này tuần tự ra sao. Hình như code này của anh mới áp dụng đc cho cả bảng dữ liệu, em có tìm nhưng không có cái nào có thể dùng đc vào bài. Mong anh chỉ cho ạ!
Mình đã chỉnh 1 dòng lệnh code bài #17 cho code chạy nhanh hơn, chuẩn hơn và dể hiểu hơn
If Rng(i , j).Value <> Empty And Rng(i + 1, j).Value = Empty Then

Cột "C", "D": Tìm dòng i khác rổngdòng i+1 rổng

For r = i + 1 To sRow - 1
Cột "C", "D": Dòng i + 1 rổng nên dòng r rổng

If Rng(r + 1, j).Value <> Empty Then
Cột "C", "D": Tìm dòng r với điều kiện dòng r là rổng dòng r+1 khác rổng

For k = i + 1 To r
Các dòng có cột C và D rổng cần nội suy
 
Upvote 0
Mình đã chỉnh 1 dòng lệnh code bài #17 cho code chạy nhanh hơn, chuẩn hơn và dể hiểu hơn
If Rng(i , j).Value <> Empty And Rng(i + 1, j).Value = Empty Then

Cột "C", "D": Tìm dòng i khác rổngdòng i+1 rổng

For r = i + 1 To sRow - 1
Cột "C", "D": Dòng i + 1 rổng nên dòng r rổng

If Rng(r + 1, j).Value <> Empty Then
Cột "C", "D": Tìm dòng r với điều kiện dòng r là rổng dòng r+1 khác rổng

For k = i + 1 To r
Các dòng có cột C và D rổng cần nội suy
Cảm ơn anh! Em đọc đi đọc lại vẫn chưa hiểu hết. Em thấy code phức tạp về toán (lồng nhiều vòng for vào nhìn code nó đẹp thật, nhìn thích mắt), 1 2 vòng for còn nhìn ra đc. Nhưng nhiều hơn là phức tạp. Các anh xây dựng lồng nhiều vòng lặp, anh có thể chia sẻ cách xây dựng anh hay làm em học theo với ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom