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

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
41235532414122
5T2T3T
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
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom