Board logo

標題: 同一儲存格內資料進行大小比對_整理後找最大值標註V [打印本頁]

作者: Andy2483    時間: 2022-12-13 10:39     標題: 同一儲存格內資料進行大小比對_整理後找最大值標註V

各位前輩好
後學想學習各種不同vba寫法,邀請想練習陣列與字典的同學前輩一起上論壇研討!謝謝
請各位前輩們指導
後學藉 ranceymm前輩的主題範例作為題材,謝謝 ranceymm前輩,如有冒犯 請見諒
不同主題另開題作學習
http://forum.twbts.com/thread-23842-1-1.html
求解.zip (6.93 KB) 範例如上論壇鏈結

後學學習執行結果:
[attach]35595[/attach]

Option Explicit
Sub test_20221213()
Dim Brr, i&, X&, V, Y, Z$(5), A$, N&, j&, R&, C$, Q#(99), P, M#, K&
Set Y = CreateObject("Scripting.Dictionary")
Brr = Range([D3], Cells(Rows.Count, "D").End(3))
For i = 1 To UBound(Brr)
   A = Replace(Replace(Replace(Brr(i, 1), " 長", ","), "、", ","), " ", ",")
   V = Split(A, ",")
   R = R + 1
   N = 0
   P = Q
   For j = 0 To UBound(V)
      If V(j) = "" Then
         M = Application.Max(P)
         For K = 1 To N
            C = "'" & R & "." & K
            P = Y(C)
            If P(4) = M Then
               P(5) = "V"
               Y(C) = P
            End If
         Next
         Exit For
      End If
      X = j Mod 4
      N = IIf(X = 0, N + 1, N)
      If X = 0 Then C = "'" & R & "." & N: Z(X) = C
      Z(X + 1) = V(j)
      If X = 3 Then P(N) = V(j): Y(C) = Z
   Next
Next
Workbooks.Add
[A1].Resize(1, 6) = [{"N0","日期","時間","規格","數值","MX"}]
[A2].Resize(Y.Count, 6) = Application.Transpose(Application.Transpose(Y.ITEMS))
[B:B].NumberFormatLocal = "yyyy/m/d"
Cells.Columns.AutoFit
End Sub
作者: Andy2483    時間: 2022-12-14 08:59

本帖最後由 Andy2483 於 2022-12-14 09:13 編輯

各位前輩早安

請教各位前輩:
這題可以用 正則來解嗎?
不用字典與陣列可以解嗎?
字典中的字典好像可以?
還有什麼方法?
作者: hcm19522    時間: 2022-12-14 10:13

https://blog.xuite.net/hcm19522/twblog/590655290
作者: Andy2483    時間: 2022-12-14 10:25

回復 3# hcm19522


    謝謝前輩指導
這範例好難,可是後學會藉此機會學起來,現在正研究其他帖,遇困難再請教,謝謝
作者: Andy2483    時間: 2022-12-14 15:49

本帖最後由 Andy2483 於 2022-12-14 16:00 編輯

謝謝論壇,謝謝各位前輩
後學還沒上論壇前會用WIith ~End WIith,覺得可以跑就好,耗時就算了!
時間流逝,檔案資料變大,重複FIND()太慢了
上論壇學習陣列與字典後,有些程式碼原來 1 分鐘的舊方法程序,改陣列&字典後現在只要 0.1 秒
以下是這主題範例用以前沒有用陣列和字典的舊方法:
連宣告都不在呼,宣告一個變數可能可以簡化很多行程式碼

Sub test_20221214()
AC_WO_NA = ActiveWorkbook.Name
Workbooks.Add
[A1] = "N0"
[B1] = "日期"
[C1] = "時間"
[D1] = "規格"
[E1] = "數值"
[F1] = "MX"
N = 1
With Workbooks(AC_WO_NA).Sheets("SOS")
   For i = 3 To .[D65536].End(xlUp).Row
      If .Cells(i, "D") Like "*##/## *:* *-* 長* *#*、*" = True Then
        R = R + 1
        C = 0
        For j = 1 To Len(.Cells(i, "D"))
           If Mid(.Cells(i, "D"), j, 5) Like "##/##" = True Then
              C = C + 1
              N = N + 1
              Cells(N, 1) = "'" & R & "." & C
              Cells(N, 2) = Mid(.Cells(i, "D"), j, 5)
           End If
           If Mid(.Cells(i, "D"), j, 5) Like "##:##" = True Then
              Cells(N, 3) = Mid(.Cells(i, "D"), j, 5)
           End If
           If Mid(.Cells(i, "D"), j, 99) Like " AA-* 長*" = True Then
              Cells(N, 4) = Mid(.Cells(i, "D"), j + 1, InStr(Mid(.Cells(i, "D"), j, 99), " 長") - 2)
           End If
           If Mid(.Cells(i, "D"), j, 99) Like " 長#*、*" = True Then
              Cells(N, 5) = Mid(.Cells(i, "D"), j + 2, InStr(Mid(.Cells(i, "D"), j, 99), "、") - 3)
           End If
        Next
      End If
   Next
End With
M = 0
For i = 2 To [A65536].End(xlUp).Row + 1
   If Mid(Cells(i, 1), 1, InStr(Cells(i, 1), ".")) = Mid(Cells(i + 1, 1), 1, InStr(Cells(i + 1, 1), ".")) Then
      If Cells(i, 5) > M Then
         N = i
         M = Cells(i, 5)
      End If
      If Cells(i + 1, 5) > M Then
         N = i + 1
         M = Cells(i + 1, 5)
      End If
      Else
         Cells(N, 6) = "V"
         M = 0
   End If
Next
[B:B].NumberFormatLocal = "yyyy/m/d"
Cells.Columns.AutoFit
End Sub

有練習才會遇到困難和錯誤! 一起來學習
作者: Andy2483    時間: 2022-12-15 15:15

回復 3# hcm19522


    謝謝前輩指導
後學學習陣列公式的第一帖,不知道敘述得是否正確與適當

{=IF(INT(A4)/1%%+MAX((INT(A$2:A$16)=INT(A4))*F$2:F$16)=INT(A4)/1%%+F4,"V","")}
如果 當格同列A欄儲存格值去除小數的10000倍值+A欄指定區間儲存格同整數值儲存格對應的F欄最大值 = 當格同列A欄儲存格值去除小數的10000倍值+當列F欄值,就在當格顯示"V"字元,否則顯示""字元

0.{} : 陣列化公式,指定的區間儲存格是陣列,否則只取當格在指定的區間儲存格的相同列或欄的儲存格
1.IF函數(判斷式,Ture值,False值)
1.1.判斷式: INT(A4)/1%%+MAX((INT(A$2:A$16)=INT(A4))*F$2:F$16)=INT(A4)/1%%+F4
1.1.1.INT(A4)/1%% :  [A4]儲存格捨棄小數後的整數除0.0001
1.1.2.MAX((INT(A$2:A$16)=INT(A4))*F$2:F$16) : [A2:A16]各個儲存格捨棄小數後的整數,與[A4]儲存格捨棄小數後的整數做=邏輯判斷值回傳(0或1),再將此邏輯值與[F2:F16]各儲存格相乘後取最大值
1.1.3.INT(A4)/1%%+F4 : [A4]捨棄小數後的整數除0.0001 + [F4]儲存格值

1.2.Ture值 : "V"

1.3.False值 : ""

[attach]35608[/attach]
作者: hcm19522    時間: 2022-12-16 09:39

回復 6# Andy2483


學習態度佳   按個讚
作者: Andy2483    時間: 2022-12-16 10:13

回復 7# hcm19522


    謝謝前輩
前輩指導的是公式,像是申論題,如果前輩有空,懇請老師指正後學的嚴重錯誤,後學的小錯會自已慢慢改進,謝謝




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