Xác định Min và Max

Mai.Vũ

Thành viên mới
Tham gia ngày
21 Tháng sáu 2019
Bài viết
16
Được thích
0
Điểm
13
Tuổi
21
Em muốn tìm mã code để tìm các giá trị Min, Max và distance như cột Min, Max và distance trong file.
Các giá trị sẽ được xác định lần lượt từ trên xuống dưới và các giá trị distance = abs(min - cumRet) hoặc = abs(max - cumRet)
A/C/B nào có kinh nghiệm thì cho em gợi ý với ạ
 

File đính kèm

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,207
Được thích
1,982
Điểm
360
Em muốn tìm mã code để tìm các giá trị Min, Max và distance như cột Min, Max và distance trong file.
Các giá trị sẽ được xác định lần lượt từ trên xuống dưới và các giá trị distance = abs(min - cumRet) hoặc = abs(max - cumRet)
A/C/B nào có kinh nghiệm thì cho em gợi ý với ạ
Cho hỏi cái nguyên lý hoạt động cái.Bạn giải thích xem nào.
 

Mai.Vũ

Thành viên mới
Tham gia ngày
21 Tháng sáu 2019
Bài viết
16
Được thích
0
Điểm
13
Tuổi
21
Cho hỏi cái nguyên lý hoạt động cái.Bạn giải thích xem nào.
Với số liệu cột cumret, mình muốn xác định các giá cột min max.
Tại 9:30,
giá trị cumret đầu tiên(9:30) sẽ được mặc định là min hoặc max bằng cách:
Nếu distance (9:31) tính được > 1.2 thì sẽ tạm dừng, nếu chưa lớn hơn 1.2 thì tiếp tục tính 9:32,.. cho đến khi giá trị distance >1.2.
Sau đó, nếu giá trị cumret tại thời gian có distance > 1.2 mà lớn hơn giá trị đầu tiên(9:30) thì giá trị đầu ( 9:30 ) là giá trị Min. Nếu nhỏ hơn thì là Max.

Sau khi xác định được hướng đầu, bước đi tiếp theo lại dễ dàng hơn.
* Nếu 9:30 là giá trị Min, sau khi có distance > 1.2 sẽ chuyển sang là giá trị Max.
* Nếu 9:30 là giá trị Max, sau khi có distance >1.2 sẽ chuyển sang là giá trị Min
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,207
Được thích
1,982
Điểm
360
Với số liệu cột cumret, mình muốn xác định các giá cột min max.
Tại 9:30,
giá trị cumret đầu tiên(9:30) sẽ được mặc định là min hoặc max bằng cách:
Nếu distance (9:31) tính được > 1.2 thì sẽ tạm dừng, nếu chưa lớn hơn 1.2 thì tiếp tục tính 9:32,.. cho đến khi giá trị distance >1.2.
Sau đó, nếu giá trị cumret tại thời gian có distance > 1.2 mà lớn hơn giá trị đầu tiên(9:30) thì giá trị đầu ( 9:30 ) là giá trị Min. Nếu nhỏ hơn thì là Max.

Sau khi xác định được hướng đầu, bước đi tiếp theo lại dễ dàng hơn.
* Nếu 9:30 là giá trị Min, sau khi có distance > 1.2 sẽ chuyển sang là giá trị Max.
* Nếu 9:30 là giá trị Max, sau khi có distance >1.2 sẽ chuyển sang là giá trị Min
Bạn xem code nhé.
Mã:
Sub timinmax()
Application.ScreenUpdating = False
    Dim arr, i As Long, max As Double, min As Double, lr As Long, dk As Boolean, a As Long
    With Sheets("sheet1")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         .Range("c2:E" & lr).ClearContents
         arr = .Range("B2:E" & lr).Value
         For i = 1 To UBound(arr)
            arr(i, 4) = arr(1, 1)
            arr(i, 2) = Abs(arr(i, 1) - arr(i, 4))
            If arr(i, 2) > 1.2 Then
               If arr(i, 2) > arr(1, 1) Then
                  dk = False
                  min = arr(i, 1)
               Else
                  dk = True
                  max = arr(i, 1)
               End If
               a = i + 1
               Exit For
           End If
        Next i
        For i = a To UBound(arr)
            If dk = True Then
               If arr(i, 1) > max Then max = arr(i, 1)
                  arr(i, 4) = max
                  arr(i, 2) = Abs(arr(i, 1) - max)
                  If arr(i, 2) > 1.2 Then
                     min = arr(i, 1)
                     dk = False
                  End If
            Else
               If arr(i, 1) < min Then min = arr(i, 1)
                  arr(i, 3) = min
                  arr(i, 2) = Abs(arr(i, 1) - min)
                  If arr(i, 2) > 1.2 Then
                     max = arr(i, 1)
                     dk = True
                  End If
            End If
       Next i
       .Range("B2:E" & lr).Value = arr
End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Mai.Vũ

Thành viên mới
Tham gia ngày
21 Tháng sáu 2019
Bài viết
16
Được thích
0
Điểm
13
Tuổi
21
Ok. Cám ơn bạn nhiều nha
 

Mai.Vũ

Thành viên mới
Tham gia ngày
21 Tháng sáu 2019
Bài viết
16
Được thích
0
Điểm
13
Tuổi
21
@snow25
Bạn ơi, bạn giúp mình xíu nữa được không ạ.
Mình muốn tạo thêm một cột chứa các điểm uốn tên là "inflection point".
Ví dụ như thế này:
Sau khi xác định được các giá trị Min-Max-distance, ta xác định một cột "Threshold judgment" gồm các giá trị "True" nếu giá trị cột distance >1.2 và "False" nếu giá trị cột distance <= 1.2.
Với mỗi giá trị "True" tại cột "Threshold judgment" ta sẽ có các giá trị ở cột "Min" hay "Max" tướng ứng.
và các giá trị điểm uốn chính là các dòng có giá trị bằng đúng với các giá trị trong cột Min hay Max mà ta tìm được.
Bạn có thể gợi ý cho mình code cái phần này nữa không ạ, mình thường làm trên Python, chưa sử dụng VBA bao giờ.
Cám ơn bạn rất nhiều.
 

File đính kèm

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,207
Được thích
1,982
Điểm
360
@snow25
Bạn ơi, bạn giúp mình xíu nữa được không ạ.
Mình muốn tạo thêm một cột chứa các điểm uốn tên là "inflection point".
Ví dụ như thế này:
Sau khi xác định được các giá trị Min-Max-distance, ta xác định một cột "Threshold judgment" gồm các giá trị "True" nếu giá trị cột distance >1.2 và "False" nếu giá trị cột distance <= 1.2.
Với mỗi giá trị "True" tại cột "Threshold judgment" ta sẽ có các giá trị ở cột "Min" hay "Max" tướng ứng.
và các giá trị điểm uốn chính là các dòng có giá trị bằng đúng với các giá trị trong cột Min hay Max mà ta tìm được.
Bạn có thể gợi ý cho mình code cái phần này nữa không ạ, mình thường làm trên Python, chưa sử dụng VBA bao giờ.
Cám ơn bạn rất nhiều.
Bạn xem code nhé.
Mã:
Sub timinmax()
Application.ScreenUpdating = False
    Dim arr, i As Long, max As Double, min As Double, lr As Long, dk As Boolean, a As Long
    With Sheets("sheet1")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         .Range("c2:G" & lr).ClearContents
         arr = .Range("B2:G" & lr).Value
         arr(1, 6) = arr(1, 1)
         For i = 1 To UBound(arr)
            arr(i, 4) = arr(1, 1)
            arr(i, 2) = Abs(arr(i, 1) - arr(i, 4))
            If arr(i, 2) > 1.2 Then
               If arr(i, 2) > arr(1, 1) Then
                  dk = False
                  min = arr(i, 1)
               Else
                  dk = True
                  max = arr(i, 1)
               End If
               a = i + 1
               arr(i, 6) = arr(i, 1)
               arr(i, 5) = "True"
               Exit For
           Else
              arr(i, 5) = "FALSE"
           End If
        Next i
        For i = a To UBound(arr)
            If dk = True Then
               If arr(i, 1) > max Then max = arr(i, 1): arr(i, 6) = max
                  arr(i, 4) = max
                  arr(i, 2) = Abs(arr(i, 1) - max)
                  If arr(i, 2) > 1.2 Then
                     min = arr(i, 1)
                     dk = False
                     arr(i, 5) = "True"
                  Else
                     arr(i, 5) = "FALSE"
                  End If
                  
            Else
               If arr(i, 1) < min Then min = arr(i, 1): arr(i, 6) = min
                  arr(i, 3) = min
                  arr(i, 2) = Abs(arr(i, 1) - min)
                  If arr(i, 2) > 1.2 Then
                     max = arr(i, 1)
                     dk = True
                      arr(i, 5) = "True"
                  Else
                     arr(i, 5) = "FALSE"
                  End If
            End If
       Next i
       .Range("B2:G" & lr).Value = arr
End With
Application.ScreenUpdating = True
End Sub
 

Mai.Vũ

Thành viên mới
Tham gia ngày
21 Tháng sáu 2019
Bài viết
16
Được thích
0
Điểm
13
Tuổi
21
Bạn xem code nhé.
Mã:
Sub timinmax()
Application.ScreenUpdating = False
    Dim arr, i As Long, max As Double, min As Double, lr As Long, dk As Boolean, a As Long
    With Sheets("sheet1")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         .Range("c2:G" & lr).ClearContents
         arr = .Range("B2:G" & lr).Value
         arr(1, 6) = arr(1, 1)
         For i = 1 To UBound(arr)
            arr(i, 4) = arr(1, 1)
            arr(i, 2) = Abs(arr(i, 1) - arr(i, 4))
            If arr(i, 2) > 1.2 Then
               If arr(i, 2) > arr(1, 1) Then
                  dk = False
                  min = arr(i, 1)
               Else
                  dk = True
                  max = arr(i, 1)
               End If
               a = i + 1
               arr(i, 6) = arr(i, 1)
               arr(i, 5) = "True"
               Exit For
           Else
              arr(i, 5) = "FALSE"
           End If
        Next i
        For i = a To UBound(arr)
            If dk = True Then
               If arr(i, 1) > max Then max = arr(i, 1): arr(i, 6) = max
                  arr(i, 4) = max
                  arr(i, 2) = Abs(arr(i, 1) - max)
                  If arr(i, 2) > 1.2 Then
                     min = arr(i, 1)
                     dk = False
                     arr(i, 5) = "True"
                  Else
                     arr(i, 5) = "FALSE"
                  End If
                 
            Else
               If arr(i, 1) < min Then min = arr(i, 1): arr(i, 6) = min
                  arr(i, 3) = min
                  arr(i, 2) = Abs(arr(i, 1) - min)
                  If arr(i, 2) > 1.2 Then
                     max = arr(i, 1)
                     dk = True
                      arr(i, 5) = "True"
                  Else
                     arr(i, 5) = "FALSE"
                  End If
            End If
       Next i
       .Range("B2:G" & lr).Value = arr
End With
Application.ScreenUpdating = True
End Sub
Ok. Cám ơn bạn nha <3
 
Top Bottom