返回列表 上一主題 發帖

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

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

大大好,

請問如附圖JPG所示,能否取出()中的數字,做加減?()中的數字,沒有一定的規則



廠商資料驗算.rar (7.58 KB)

回復 14# 准提部林

准大好,
請教自定義 Function GetSerial(ST$),程式與要計算的檔案放在一起,就可以計算,
但因為我是把程式與計算檔分開存放,但我做了指定仍是無作用??

Function GetSerial(ST$)
Dim Sh As Worksheet, W As Workbook
Set W = Workbooks("出貨文件_PO.xlsx"): Set Sh = W.Sheets("箱號計算"): Sh.Activate

Dim a, Tr, V1%, V2%, S%
If InStr(ST, "(") = 0 Then ST = "(" & ST
ST = Split(Replace(ST, ")", ""), "(")(1)
For Each a In Split(ST, ",")
    Tr = Split(a & "-" & a, "-")
    V1 = Val(StrReverse(Mid(Val(StrReverse(Tr(0) & 1)), 2)))
    V2 = Val(StrReverse(Mid(Val(StrReverse(Tr(1) & 1)), 2)))
    If V1 + V2 <> 0 Then S = S + Abs(V2 - V1) + 1
Next a
If S > 0 Then GetSerial = S Else GetSerial = ""
End Function

TOP

回復 11# PJChen


自訂函數用法//三種
資料驗算-1.rar (14.22 KB)

TOP

C17 陣列公式(要使用三鍵輸入公式)
=SUM(IFERROR(TEXT(RIGHT(TEXT(RIGHT("X"&TRIM(RIGHT(LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A17,"(",","),")",","),",",REPT(" ",99)),ROW($1:$99)*99-98,99)),"-",REPT(" ",99)),{1,1,1,1,1,2,2,2,2,2}*99),99)),{2,3,4,5,6,2,3,4,5,6}),),{1,2,3,4,5,1,2,3,4,5}),"0;;;")*{-1,-1,-1,-1,-1,1,1,1,1,1}+{0,0,0,0,0,1,1,1,1,1},""))
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 11# PJChen


    謝謝前輩回復,謝謝論壇,謝謝各位前輩
前輩這帖範例欄位不一樣,剛好可以請前輩試改看看
後學在#4樓 跟 #8樓都有心得註解可以學習,後學說明不清楚或哪裡不懂得,請提出疑問

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

TOP

回復 10# Andy2483
您好,
我把程式放進檔案中了,准大的程式還是無法運算,
請幫我看下該怎麼讓它執行?
~~感謝~~
資料驗算.rar (17.02 KB)

TOP

回復 9# PJChen


    謝謝前輩回復
https://learn.microsoft.com/zh-t ... strreverse-function
這是後學查到網路關於strreverse() 知識放上來以便查詢用的連結,如果放到VBA裡會產生編譯錯誤的訊息,點掉他就可以了

錯誤訊息:


加個單引號在最前面讓他變註解:
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 8# Andy2483
請問自訂函數要怎麼在程式中使用?
執行一直出現 "編繹錯誤"
必須是End sub

TOP

本帖最後由 Andy2483 於 2023-4-24 09:46 編輯

回復 7# 准提部林


    謝謝論壇,謝謝前輩指導
後學學習心得如下,請前輩再指導

執行結果:



Option Explicit

'自訂函數//
Function GetSerial(ST$)
'↑自訂函數_GetSerial,ST變數是字串變數(儲存格裡的值是文字)
Dim a, Tr, V1%, V2%, S%
'↑宣告變數(a,Tr)是通用型變數,(V1,V2,S)是短整數
If InStr(ST, "(") = 0 Then ST = "(" & ST
'↑如果ST這字串變數裡不包含 "(" 符號!,
'就令其前方多一個 "("符號組成新字串

ST = Split(Replace(ST, ")", ""), "(")(1)
'↑令先將ST變數裡的 ")" 符號置換成空字元,
'之後再將ST變數用 "("分割成一維陣列取索引號1的字串

For Each a In Split(ST, ",")
'↑設逐項迴圈!令a這通用型變數是 ST變數被","分割成一維陣列的一陣列值
    Tr = Split(a & "-" & a, "-")
    '↑令Tr這通用型變數是 a變數連接"-",再連接a變數後,
    '以"-"分割成為一維陣列

    V1 = Val(StrReverse(Mid(Val(StrReverse(Tr(0) & 1)), 2)))
    '↑令V1變數是 先將Tr 0索引號陣列值裡的字元反轉,取前面數值後,
    '再將這數值字元反轉回來,這樣的方式就會只抓取到前方數字的字元

    https://learn.microsoft.com/zh-t ... strreverse-function
    V2 = Val(StrReverse(Mid(Val(StrReverse(Tr(1) & 1)), 2)))
    '↑令V2與類推與V1相同方式取得前方數字字元
    If V1 + V2 <> 0 Then S = S + Abs(V2 - V1) + 1
    '↑如果V1變數+V2變數 不等於0 ,就讓S這短整數變數是自身+絕對值(V1變數+V2變數)+1
Next a
If S > 0 Then GetSerial = S Else GetSerial = ""
'↑如果S變數>0 !就令GetSerial函數回傳 S變數值,否則就回傳空字元
End Function
=================
後學尚有一些細節不了解,繼續累積經驗,謝謝前輩
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

自訂函數//
Function GetSerial(ST$)
Dim a, Tr, V1%, V2%, S%
If InStr(ST, "(") = 0 Then ST = "(" & ST
ST = Split(Replace(ST, ")", ""), "(")(1)
For Each a In Split(ST, ",")
    Tr = Split(a & "-" & a, "-")
    V1 = Val(StrReverse(Mid(Val(StrReverse(Tr(0) & 1)), 2)))
    V2 = Val(StrReverse(Mid(Val(StrReverse(Tr(1) & 1)), 2)))
    If V1 + V2 <> 0 Then S = S + Abs(V2 - V1) + 1
Next a
If S > 0 Then GetSerial = S Else GetSerial = ""
End Function

c17//公式
=GetSerial(A17)

TOP

        靜思自在 : 手心向下是助人,手心向上是求人;助人快樂,求人痛苦。
返回列表 上一主題