返回列表 上一主題 發帖

[發問] 計算套裝所得的級別

[發問] 計算套裝所得的級別

將L列每個向下順序套裝組合所得的級別, 顯示在O列每個套裝組合最後一個的相對之行數,計算套裝組合級別時, 套裝組合第一個必須跟上一行的一個不同, 及每個套裝組合不可重疊
檔案有想要的結果和現時計算的結果,請先進幫忙如何修改VBA, 謝謝!
test1C.zip (31.67 KB)

  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
複製代碼

TOP

L1 ~ L4 四個"良"為何不編碼, 至少有個"良良"符合吧!!!

TOP

8個級別//標示8個顏色
Xl0000131.rar (32.28 KB)

TOP

回復 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)

TOP

回復 3# 准提部林

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

因為有一條件:套裝組合第一個必須跟上一行的一個不同

TOP

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

回復 4# 准提部林

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

TOP

組合的優先順序還是沒說清楚//
Xl0000209.rar (33.8 KB)

最好模擬各種狀況更完整, 反覆檢查正確的資料, 否則太花時間~~~

TOP

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


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


組合是沒有優先順序,對不起,之前沒有說清楚

TOP

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


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

謝謝准提部林先進指導,以下檔案中,工作表1(2),L1至L73已模擬各種狀況套裝1-8
顯示單位,雙位或負數級別,已可以了,這段我可以自己更改級別,感謝先進幫助!
Xl0000209B.zip (48.44 KB)

TOP

        靜思自在 : 生氣,就是拿別人的過錯來懲罰自己。
返回列表 上一主題