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ố:
· 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:
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á)
Mong các thầy giúp hoàn chỉnh mã phân tích xu hướng - Thanks
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 | A | B | C | D | E | F | G | H | I | J | K | L | M | N |
4 | 1 | 2 | 3 | 5 | 5 | 3 | 2 | 4 | 1 | 4 | 12 | 2 | ||
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 |
Đặ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:
A | B | C | D | E |
3 | 1 | 2 | 3 | |
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