Board logo

標題: [發問] 計算套裝所得的級別 [打印本頁]

作者: cdkee    時間: 2024-1-27 23:57     標題: 計算套裝所得的級別

將L列每個向下順序套裝組合所得的級別, 顯示在O列每個套裝組合最後一個的相對之行數,計算套裝組合級別時, 套裝組合第一個必須跟上一行的一個不同, 及每個套裝組合不可重疊
檔案有想要的結果和現時計算的結果,請先進幫忙如何修改VBA, 謝謝!
[attach]37358[/attach]
作者: cdkee    時間: 2024-1-28 00:41

  1. Option Explicit

  2. Sub 計算套裝級別()
  3.     Dim ws As Worksheet
  4.     Set ws = ThisWorkbook.ActiveSheet
  5.    
  6.     Dim lastRow As Long
  7.     lastRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row
  8.    
  9.     Dim i As Long
  10.     Dim score As String
  11.     Dim skip As Boolean
  12.     Dim combinations As Variant
  13.     Dim scores As Variant
  14.    
  15.     ' 定義套裝和級別
  16.     combinations = Array("良優優良", "優良良優", "良優優優", "優良良良", "良優良", "優良優", "優優", "良良")

  17.     scores = Array("2", "2", "3", "3", "3", "3", "3", "3")
  18.         
  19.     For i = 2 To lastRow
  20.         If Not skip Then ' 如果skip為False,則執行此代碼塊
  21.             Dim j As Long
  22.             '檢查當前的字符序列(combo)是否與combinations數組中的任何一個元素匹配。
  23.             '如果匹配,則根據對應的scores數組中的級別來更新score變量,並在工作表的"O"列中顯示該級別。
  24.             For j = LBound(combinations) To UBound(combinations)
  25.                 Dim combo As String
  26.                 combo = ""
  27.                 On Error Resume Next
  28.                 combo = ws.Cells(i, "L").Value & ws.Cells(i + 1, "L").Value & ws.Cells(i + 2, "L").Value & ws.Cells(i + 3, "L").Value
  29.                 On Error GoTo 0
  30.                 '這段代碼的目的是在找到匹配的套裝時計算並顯示相應的級別。
  31.                 combo = Left(combo, Len(combinations(j))) ' 取組合的長度,這行代碼將combo字符串的左側部分(長度為combinations(j)的長度)賦值給combo。
  32.                                                           ' 這是為了確保combo的長度與當前的套裝combinations(j)的長度相同,以便進行比較。
  33.                 If combo = combinations(j) And ws.Cells(i, "L").Value <> ws.Cells(i - 1, "L").Value Then '檢查combo是否等於當前的套裝combinations(j),並且當前行的"L"列的值與前一行的"L"列的值不同
  34.                     score = scores(j)
  35.                     ws.Cells(i + Len(combinations(j)) - 1, "O").Value = score ' 在O列的相對行數顯示級別
  36.                     If score = 2 Or score = 3 Then
  37.                         skip = True ' 如果skip為True,則執行此代碼塊
  38.                     End If
  39.                     Exit For
  40.                 End If
  41.             Next j
  42.         Else
  43.         '以下這段代碼的目的是在遇到新的字符序列開始時(即當前行的"L"列的值與前一行的"L"列的值不同,並且當前行的"L"列的值等於當前套裝的第一個字符時),停止跳過迭代。
  44.         '如果skip為True,則會跳過當前的迭代,直到遇到新的字符序列開始。這樣可以防止在同一個字符序列中多次計算級別。
  45.             If ws.Cells(i, "L").Value <> ws.Cells(i - 1, "L").Value And ws.Cells(i, "L").Value = Left(combinations(j), 1) Then
  46.                 skip = False
  47.             End If
  48.         End If
  49.     Next i
  50. End Sub
複製代碼

作者: 准提部林    時間: 2024-1-28 09:33

L1 ~ L4 四個"良"為何不編碼, 至少有個"良良"符合吧!!!
作者: 准提部林    時間: 2024-1-28 10:30

8個級別//標示8個顏色
[attach]37359[/attach]
作者: cdkee    時間: 2024-1-28 14:04

回復 4# 准提部林

謝謝准提部林先進回覆, 請問當級別=雙位數或負數,例如以下如何更改:
For Each A In Array("1.2良優優良", "2.19優良良優", "3.3良優優優", "4.3優良良良", "5.3良優良", "6.3優良優", "7.-3優優", "8.-19良良")
    xD(Mid(A, 4)) = Val(A)
作者: cdkee    時間: 2024-1-28 14:21

回復 3# 准提部林

L1 ~ L4 四個"良"為何不編碼, 至少有個"良良"符合吧!!!
准提部林 發表於 2024-1-28 09:33

因為有一條件:套裝組合第一個必須跟上一行的一個不同
作者: cdkee    時間: 2024-1-28 17:31

本帖最後由 cdkee 於 2024-1-28 17:41 編輯

回復 4# 准提部林

對不起,我之前的條件有遺漏,套裝組合也有更改,見檔案:
將L列每個向下順序套裝組合所得的級別, 顯示在O列每個套裝組合最後一個的相對之行數,計算套裝組合級別時,每個套裝組合不可重疊,另外一條件,每次發現任何套裝組合,之後必須發現與剛才發現的套裝組合中最後1個不同(為方便溝通稱這個做"測試品")(代替之前的條件:套裝組合第一個必須跟上一行的一個不同),才開始繼續在L列向下檢查
級別會有單位和雙位數或負數
[attach]37363[/attach]
作者: 准提部林    時間: 2024-1-29 13:07

組合的優先順序還是沒說清楚//
[attach]37374[/attach]

最好模擬各種狀況更完整, 反覆檢查正確的資料, 否則太花時間~~~
作者: cdkee    時間: 2024-1-29 13:40

組合的優先順序還是沒說清楚//


最好模擬各種狀況更完整, 反覆檢查正確的資料, 否則太花時間~~~
准提部林 發表於 2024-1-29 13:07


組合是沒有優先順序,對不起,之前沒有說清楚
作者: cdkee    時間: 2024-1-29 15:05

組合的優先順序還是沒說清楚//


最好模擬各種狀況更完整, 反覆檢查正確的資料, 否則太花時間~~~
准提部林 發表於 2024-1-29 13:07

謝謝准提部林先進指導,以下檔案中,工作表1(2),L1至L73已模擬各種狀況套裝1-8
顯示單位,雙位或負數級別,已可以了,這段我可以自己更改級別,感謝先進幫助!
[attach]37375[/attach]
作者: 准提部林    時間: 2024-1-29 16:14

回復 10# cdkee


A欄本來的字段都少了一個字???
"測試品"如何斷定???

完全對不上~~
作者: cdkee    時間: 2024-1-29 16:25

本帖最後由 cdkee 於 2024-1-29 16:32 編輯
回復  cdkee


A欄本來的字段都少了一個字???
"測試品"如何斷定???

完全對不上~~
准提部林 發表於 2024-1-29 16:14

是的,A欄本來的字段都少了一個字,就是本來每個組合的第一個,因為要配合另外一條件(新改的):每次發現任何套裝組合,之後必須發現與剛才發現的套裝組合中最後1個不同(為方便溝通稱這個做"測試品")(這是代替之前的條件:套裝組合第一個必須跟上一行的一個不同)
在檔案中的L1至L73例子中,已將"測試品"的底色顯示為紅色,方便識別及說明
作者: cdkee    時間: 2024-1-30 03:23

我試用lastChar = Right(Tr(1), 1)來存儲當前匹配鍵的最後一個字符,然後檢查下一個單元格的內容與lastChar不同, 才開始繼續在L列向下檢查,但仍然不成功
  1. Sub Test_A1()
  2. Dim Arr, A, Brr, xD, i&, j&, T$, Tr, R, lastChar$
  3. Set xD = CreateObject("Scripting.Dictionary") '創建一個字典對象

  4. '遍歷一個數組,並將每個元素按"\"分割,然後將分割後的第二部分作為鍵,第一部分作為值存入字典
  5. For Each A In Array("1^12\優優良", "2^10\良良優", "3^3\優優優", "4^3\良良良", _
  6.                     "5^3\優良", "6^3\良優", "7^-3\優優", "8^-10\良良")
  7.     Tr = Split(A, "\")
  8.     xD(Tr(1)) = Tr(0)
  9. Next A

  10. '讀取Excel工作表中的一個範圍到Arr數組,然後根據Arr的大小重新定義Brr數組
  11. Arr = Range([L1], [L65536].End(xlUp)(5))
  12. ReDim Brr(1 To UBound(Arr), 0)

  13. '關閉屏幕更新,以提高代碼執行速度
  14. Application.ScreenUpdating = False

  15. '遍歷Arr數組,並根據字典中的條目對Excel工作表中的某些單元格進行格式化
  16. For i = 2 To UBound(Arr) - 4
  17.     T = Arr(i, 1)
  18.     If T <> Arr(i - 1, 1) Then
  19.        For j = i + 1 To i + 2
  20.            T = T & Arr(j, 1)
  21.            R = xD(T)
  22.            If R <> "" Then
  23.               Tr = Split(R, "^")
  24.               lastChar = Right(Tr(1), 1)
  25.               If Arr(j + 1, 1) <> lastChar Then
  26.                  With Range("L" & i & ":L" & j)
  27.                       .BorderAround 1
  28.                       .Interior.ColorIndex = Cells(Tr(0) + 2, 1).Interior.ColorIndex
  29.                  End With
  30.                  Brr(j - 1, 0) = Tr(1): i = j: Exit For
  31.               End If
  32.            End If
  33.        Next j
  34.     End If
  35. Next i

  36. '將Brr數組的內容寫入Excel工作表的一個範圍
  37. [o2].Resize(UBound(Brr)) = Brr
  38. End Sub
複製代碼

作者: cdkee    時間: 2024-1-30 11:39

8個級別//標示8個顏色
准提部林 發表於 2024-1-28 10:30



   原來原先這個已經成功的,只要將級別定義改為之後准提部林先進後來的建議,再次感謝及因我的疏浪費先進時間,在此致歉.




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)