Xác định xu hướng cấp 1,2,3 (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

vuthienfx

Thành viên mới
Tham gia
9/2/17
Bài viết
5
Được thích
0
Mong các Thầy và các Sư Phụ giúp dùm mình mã VBA với 2 vòng lặp
Xác định xu hướng _cấp 1,2,3
· Vùng dữ liệu đầu vào:
o dãy số nguyên dương A4:AZ4 ( cột 1 đến cột 52)
o Cột nằm tại ô chẵn (2,4,6,…,52)là số của phần tử P
o Cột nằm tại ô lẽ (1,3,5,…,51)là số của phần tử B
o Mỗi cấp 1,2,3 được so sánh với cột 1,2,3 trước đó để xác định xu hướng
o Giả sử dữ liệu nhập vào tại thời điểm hiện tại là dãy số:
row​
ABCDEFGHIJKLMN
4 123553 2414122
5 T 2T 3T
o cell F4=5 có 5 phần tử cùng loại (P)
o Cell G3=3 có 3 phần tử cùng loại (B)
o Giả sử vị trí hiện tại là F4=5 có 5 phần tử so sánh với :
· cột 1 (E4=5) trước đó, sẽ xác định được 5 xu hướng cấp 1
· cột 2 (D4=3) trước đó, sẽ xác định được 5 xu hướng cấp 2
· cột 3 (C4=2) trước đó, sẽ xác định được 5 xu hướng cấp 3
· Quy tắc xu hướng: (so sánh các phần tử cột hiện tại với cột 1,2,3 trước ) theo quy tắc :
Đặt :
i là số cột
r số phần tử trong cột i
- colNow : cột i : cột dòng hiện tại
- valNow : dòng j cột i : giá trị hiện tại
- valTruoc : giá trị dòng trước : valNow = valTruoc + 1
- colTruoc : cột dòng trước
- colPrev : cột trước dòng hiện tại
- valPrev : giá trị cột trước dòng hiện tại
- colTruocPrev : cột trước dòng trước
- valTruocPrev : giá trị cột trước dòng trước

Quy tắc xu hướng như sau :
o Trường hợp đặt biệt: lấy cột 2 trước để so sánh tìm xu hướng
1. Nếu valNow =1 & valTruocPrev = valPrev --> ổn định “OD”
2. Nếu valNow =1 & valTruocPrev ≠ valPrev --> hỗn loạn “HL”
o Trường hợp bình thường: lấy cột 1 trước để so sánh tìm xu hướng
3. Nếu valNow > 1 & valNow - 1 = valPrev --> hỗn loạn “HL”
4. Nếu valNow >1 & valNow - 1 ≠ valPrev --> ổn định “OD”
· Phân tích xu huớng cấp 1,2,3:
o Cấp 1: Phân tích xu hướng so với cột 1 trước trực tiếp từ dãy số ở A4:AZ4, ghi kết quả vào A6:AZ6.
o Cấp 2: Phân tích xu hướng so với cột 2 trước trực tiếp từ dãy số ở A4:AZ4, ghi kết quả vào A8:AZ8.
o Cấp 3: Phân tích xu hướng so với cột 1 trước trực tiếp từ dãy số ở A4:AZ4, ghi kết quả vào A10:AZ10
o Trường hợp xuất hiện T,2T,3T tại cột hàng 5 (A5:AZ5) sẽ ngắt chuỗi xu hướng hiện tại (kết thúc mãng xu hướng tại cột hàng 4 có T) và tiếp tục chuỗi xu hướng mới với cột bắt đầu là cột kề tiếp theo của cột có T tương ứng.
- Nếu cột tiếp theo (của hàng 4) sau T là khác loại cột chẵn/ cột lẽ ( số liệu có ở cột liền kề) --> xu hướng tiếp tục xác định bình thường theo quy tắc xu hướng
- Nếu cột tiếp theo sau T là cùng loại cột chẵn/lẽ ( số liệu cách 1 cột liền kề) thì sẽ được cộng dồn vào cột hàng 4 tương ứng cột T và lấy số liệu phần tử cộng dồn tiếp tục xác định xu hướng theo quy tắc
- Giả sử dãy dữ liệu nhập A4:E4 theo bảng khi T xuất hiện nhưng phần tử chẵn (P) vẫn xuất hiện nên dữ liệu ghi vào cột chẵn (D) và xu hướng khi T xuất hiện sẽ được cộng 2+1=3 và xác định tiếp chuổi xu hướng mới với 2 phần tử D nhưng được gộp vào B và vẫn tính xu hướng cấp 1 so với A theo quy tắc:
ABCDE
3123
T

o Mã hoá thành số : Xu hướng sau khi phân tích được mã hoá thành số “OD” → 1; "HL" → 1 và được công dồn khi xu hướng cùng loại OD/HL liên tiếp xuất hiện
o Xu hướng sau khi phân tích sẽ ghi vào cột lẽ nếu là OD, cột chẵn nếu là HL

o Tự động thay đổi khi nhập dữ liệu hoặc xóa trên vùng A4:AZ4 tương ứng , thêm mã chạy tự động kích hoạt khi nhập dữ liệu
Mã VBA viết chưa chạy được đúng như yêu cầu (khó quá)
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Tự động gọi phân tích khi thay đổi dữ liệu trong A4:AZ4 hoặc A5:AZ5
    If Not Intersect(Target, Range("A4:AZ4,A5:AZ5")) Is Nothing Then
        Application.EnableEvents = False
        Call PhanTichXuHuong
        Application.EnableEvents = True
    End If
End Sub
Sub PhanTichXuHuong()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)

    Dim i As Long, cap As Long, r As Long
    Dim valPrev As Long, valTruocPrev As Long
    Dim data(1 To 52) As Variant, flagT(1 To 52) As Boolean

    ' Đọc dữ liệu hàng 4 và đánh dấu T từ hàng 5
    For i = 1 To 52
        data(i) = ws.Cells(4, i).Value
        flagT(i) = (ws.Cells(5, i).Value = "T" Or ws.Cells(5, i).Value = "2T" Or ws.Cells(5, i).Value = "3T")
    Next i

    ' Xóa dữ liệu cũ ở hàng kết quả
    ws.Range("A6:AZ6").ClearContents
    ws.Range("A8:AZ8").ClearContents
    ws.Range("A10:AZ10").ClearContents

    ' Phân tích xu hướng cấp 1, 2, 3
    For cap = 1 To 3
        Dim rowGhi As Long: rowGhi = 4 + cap * 2
        i = cap + 1

        Do While i <= 52
            If flagT(i) Then
                ' Nếu cột tiếp theo sau T có cùng loại (chẵn/lẻ), cộng dồn phần tử và xác định xu hướng tại cột hiện tại
                If i + 1 <= 52 And IsNumeric(data(i + 1)) Then
                    If (i Mod 2 = (i + 1) Mod 2) Then
                        data(i) = data(i) + data(i + 1)
                        data(i + 1) = 0 ' reset cột sau T đã gộp
                        ' Tiếp tục xử lý xu hướng với data(i)
                    End If
                End If
                i = i + 1 ' bỏ qua cột T
                Continue Do
            End If

            If IsNumeric(data(i)) And data(i) > 0 Then
                Dim valNow As Long: valNow = data(i)

                ' Xác định valPrev nếu đủ điều kiện
                If i - cap >= 1 And IsNumeric(data(i - cap)) Then
                    valPrev = data(i - cap)
                Else
                    GoTo SkipColumn
                End If

                ' Xác định valTruocPrev nếu cần thiết
                Dim hasValTruocPrev As Boolean: hasValTruocPrev = False
                If valNow = 1 Then
                    If i - cap - 1 >= 1 And IsNumeric(data(i - cap - 1)) Then
                        valTruocPrev = data(i - cap - 1)
                        hasValTruocPrev = True
                    Else
                        GoTo SkipColumn
                    End If
                End If

                ' Duyệt từng phần tử r trong cột i
                For r = 1 To valNow
                    Dim xuHuong As String

                    If r = 1 And valNow = 1 Then
                        ' Trường hợp đặc biệt
                        If hasValTruocPrev Then
                            If valTruocPrev = valPrev Then
                                xuHuong = "OD"
                            Else
                                xuHuong = "HL"
                            End If
                        End If
                    Else
                        ' Trường hợp bình thường
                        If (r - 1) = valPrev Then
                            xuHuong = "HL"
                        Else
                            xuHuong = "OD"
                        End If
                    End If

                    ' Ghi xu hướng nếu đúng loại cột
                    If xuHuong = "OD" And i Mod 2 = 1 Then
                        ws.Cells(rowGhi, i).Value = ws.Cells(rowGhi, i).Value + 1
                    ElseIf xuHuong = "HL" And i Mod 2 = 0 Then
                        ws.Cells(rowGhi, i).Value = ws.Cells(rowGhi, i).Value + 1
                    End If
                Next r
            End If
SkipColumn:
            i = i + 1
        Loop
    Next cap
End Sub
Mong các thầy giúp hoàn chỉnh mã phân tích xu hướng - Thanks
 

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

Back
Top Bottom