返回列表 上一主題 發帖

[發問] 不規則文字,取數字驗算

C3{=SUM(RIGHT(SMALL(IFERROR(MID(A3,SMALL(IF(MID(A3,ROW($1:$199),1)="-",ROW($1:$199)),ROW($1:$19))+MATCH(,0/MID(A3,FIND("-",A3)+ROW($1:$9),1),),{1,2,3})*1,)+ROW($1:$19)/1%%,ROW($1:$19)*3),4)-RIGHT(SMALL(IFERROR(MID(A3,SMALL(IF(MID(A3,ROW($1:$199),1)="-",ROW($1:$199)),ROW($1:$19))-{1,2,3},{1,2,3})*1,)+ROW($1:$19)/1%%,ROW($1:$19)*3),4))+LEN(A3)-LEN(SUBSTITUTE(A3,",",))+1

11311.png (20.52 KB)

11311.png

google"EXCEL迷"  blog  或google網址:https://hcm19522.blogspot.com/

TOP

用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 3# PJChen


    謝謝前輩回復,一起學習,謝謝論壇,謝各位前輩
後學藉這帖複習昨天的方案,方案心得註解如下,請前輩參考,請各位前輩指教

Option Explicit
Sub TEST()
Dim Brr, V, i, j&, Z&, xR As Range
'↑宣告變數:(Brr,V,i)是通用型變數,(j,Z)是長整數,xR是儲存格變數
Set xR = Range([A17], Cells(Rows.Count, "A").End(xlUp)): Brr = xR
'↑令xR這儲存格變數是 [A17]到 A欄最後一個有內容儲存格,
'令Brr這通用型變數是 二維陣列,以xR變數(儲存格)值帶入

With xR.Offset(0, 1)
'↑以下是關於xR變數向右偏移一欄的程序
   .Value = Brr
   '↑令其儲存格值是 Brr陣列值
   For Each i In Array("*(", ")*", " "): .Replace i, "", 2: Next
   '↑設逐項迴圈,令i這通用型變數是 一維陣列中的一個字串
   '令該範圍儲存格做字元置換,先將左括弧"(" 左邊的字元都換成空字元
   '再將右括弧")" 右邊的字元都換成空字元
   '最後將空白字元都換成空字元

   For i = 65 To 122: .Replace Chr(i), "", 2: Next
   '↑設順迴圈!i從65 到122
   '令該範圍儲存格做字元置換從A,B,C,D....做置換成空字元,Chr(65)="A"
   ', 2是指儲存格裡字串部分相同就做置換,不需要字串全部相同才置換

   Brr = .Value
   '↑令Brr這通用型變數換裝上述這些迴圈的儲存格結果值
End With
For i = 1 To UBound(Brr)
'↑設順迴圈!i從1 到Brr縱向最大索引列號
   V = Split(Brr(i, 1), ",")
   '↑令V這通用型變數是一維陣列,以i迴圈列1欄Brr陣列值被","分割後的值
   For j = 0 To UBound(V)
   '↑設順迴圈!j從0 到V陣列最大索引號數
      If InStr(V(j), "-") Then
      '↑如果j迴圈V陣列值包含"-"符號??
         Z = Z + Abs(Evaluate("=" & V(j))) + 1
         '↑就令Z這長整數變數是 自身 + 計算值
         '計算值:j迴圈V陣列值在前面加個"="之後做運算
         '例如:Evaluate("=2-14") =-12
         'Abs(-12)=12 :是絕對值,讓值都變正數的意思,
         '最後按照範例意義 +1

         ElseIf V(j) <> "" Then
         '↑否則如果j迴圈V陣列值不是空字元?
            Z = Z + 1
            '↑就令Z變數累加 1
      End If
   Next
   Brr(i, 1) = Z: Z = 0
   '↑令i迴圈列第1欄Brr陣列值是 變數Z,
   '↑令Z變數是 0 (因為要跑i的下一個迴圈了,所以要讓Z歸零重算)

Next
xR.Offset(0, 1) = Brr
'↑令xR變數向右偏移一欄,這範圍儲存格值以Brr陣列值帶入
Set xR = Nothing: Erase Brr, V
'↑令釋放這些變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 PJChen 於 2023-4-17 16:45 編輯

回復 2# Andy2483


感謝,
這個程式太神奇了,不同的組合都可以算得出來~~


請問這段能幫我解說一下嗎?
For i = 65 To 122: .Replace Chr(i), "", 2: Next

TOP

回復 1# PJChen


    謝謝前輩發表此主題與範例
後學藉此帖練習陣列,學習方案如下,請前輩參考

執行前:


執行結果:



Option Explicit
Sub TEST()
Dim Brr, V, Z&, i, j&, xR As Range
Set xR = Range([A17], Cells(Rows.Count, "A").End(xlUp)): Brr = xR
With xR.Offset(0, 1)
   .Value = Brr
   For Each i In Array("*(", ")*", " "): .Replace i, "", 2: Next
   For i = 65 To 122: .Replace Chr(i), "", 2: Next
   Brr = .Value
End With
For i = 1 To UBound(Brr)
   V = Split(Brr(i, 1), ",")
   For j = 0 To UBound(V)
      If InStr(V(j), "-") Then
         Z = Z + Abs(Evaluate("=" & V(j))) + 1
         ElseIf V(j) <> "" Then
            Z = Z + 1
      End If
   Next
   Brr(i, 1) = Z: Z = 0
Next
xR.Offset(0, 1) = Brr
Set xR = Nothing: Erase Brr, V
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 有多少力量就做多少事,不要心存等待,等待才會落空。
返回列表 上一主題