精華區beta Visual_Basic 關於我們 聯絡資訊
以下這一大段是公司統一編號的檢查程式... 一般統編有八碼... 像09477650 像97462301 像97179430 都是合格的統編... 今天因為要在excel內設計一個表單... 來輸入營業稅資料... 萬事皆備..只差統編無法自己勾核... 好不容易抓到別人的碼... 卻~~~又~~~看~~~不~~~懂~~~!!! 煩請高手們略看一下... 給個方向即可~~~ 到底統編那八碼... 是怎麼去檢查的啊??? 半懂的也請猜一下... 或許可用試誤法推出來.~~` 感恩不盡~~~ Public Function SysUniNoChk(ByVal UniNo) As Boolean '帶入八位字串or 數字.正確傳傳回true Dim s As String Dim i As Integer Dim d(9) As Integer Dim a(5) As Integer Dim b(5) As Integer Dim c(5) As Integer Dim y As Long s = Trim(UniNo & "") If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then SysUniNoChk = False Exit Function End If For i = 1 To 8 d(i) = Val(0 & Mid(s, i, 1)) Next i For i = 1 To 3 a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1)) b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1)) Next i a(4) = Val(0 & Mid(d(7) * 4, 1, 1)): b(4) = Val(0 & Mid(d(7) * 4, 2, 1)) c(1) = d(1): c(2) = d(3): c(3) = d(5): c(4) = d(8) y = 0 For i = 1 To 4 y = y + a(i) + b(i) + c(i) Next i If y Mod 10 = 0 Then SysUniNoChk = True y = 0 Else If d(7) = 7 Then a(5) = Val(0 & Mid(a(4) + b(4), 1, 1)) For i = 1 To 3 y = a(i) + b(i) + c(i) Next i y = y + a(5) + c(4) If y Mod 10 = 0 Then SysUniNoChk = True Else SysUniNoChk = False End If Else SysUniNoChk = False End If End If End Function -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.86.57 > -------------------------------------------------------------------------- < 作者: neplayer (neplayer) 看板: Visual_Basic 標題: Re: [請益] 請教這段程式碼~~~ 時間: Mon Apr 25 21:29:51 2005 ※ 引述《higger (朝鄉而行)》之銘言: 替你看了一下 有個地方怪怪的 : s = Trim(UniNo & "") : If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then : SysUniNoChk = False : Exit Function : End If : For i = 1 To 8 : d(i) = Val(0 & Mid(s, i, 1)) : Next i : For i = 1 To 3 : a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1)) : b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1)) : Next i : a(4) = Val(0 & Mid(d(7) * 4, 1, 1)): b(4) = Val(0 & Mid(d(7) * 4, 2, 1)) : c(1) = d(1): c(2) = d(3): c(3) = d(5): c(4) = d(8) : y = 0 : For i = 1 To 4 : y = y + a(i) + b(i) + c(i) : Next i : If y Mod 10 = 0 Then : SysUniNoChk = True : y = 0 : Else : If d(7) = 7 Then : a(5) = Val(0 & Mid(a(4) + b(4), 1, 1)) : For i = 1 To 3 : y = a(i) + b(i) + c(i) : Next i 這個for怪怪的, 這樣子y就只等於a(3)+b(3)+c(3)吧 : y = y + a(5) + c(4) : If y Mod 10 = 0 Then : SysUniNoChk = True : Else : SysUniNoChk = False : End If : Else : SysUniNoChk = False : End If : End If : End Function -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.58.145.57 > -------------------------------------------------------------------------- < 作者: linmic (sOMeThiNGwRoNg) 看板: Visual_Basic 標題: Re: [請益] 請教這段程式碼~~~ 時間: Tue Apr 26 03:56:43 2005 用你給的Code來檢驗 以97179430--這個合格(傳回True)的統編來看: Public Function SysUniNoChk(ByVal UniNo) As Boolean '帶入八位字串or 數字.正確傳傳回true Dim s As String Dim i As Integer Dim d(9) As Integer Dim a(5) As Integer Dim b(5) As Integer Dim c(5) As Integer Dim y As Long s = Trim(UniNo & "") '現在s = 97179430 '若輸入的非數字,或字串長不等於8,則離開此Function If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then SysUniNoChk = False Exit Function End If '以下的程式碼皆為合法的輸入所使用以驗證 '現在先算d(1), d(2), d(3), ..... ,d(8)的值 '以97179430來算: d(1) = 9, d(2) = 7, d(3) = 1, d(4) = 7, .... , d(8) = 0 For i = 1 To 8 d(i) = Val(0 & Mid(s, i, 1)) '此行為取出字串(s)之第一個字元並轉值 Next i '現在算a(1), a(2), a(3) 'a(1) = Mid(d(2 * 1) * 2, 1, 1) = 1 (Mid(d(2 * 1) * 2, 1, 1) = 14,所以取1) 'a(2), a(3)同理 : a(2) = 1, a(3) = 8 'b(1) = Mid(d(2 * 1) * 2, 2, 1) = 4 (算出是14,取第二位所以是4) 'b(2), b(3)同理 : b(2) = 4, b(3) = Null(沒東西) For i = 1 To 3 a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1)) b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1)) Next i '根據上面的解釋自己推 : a(4) = 1, b(4) = 2 'c(1) = d(1) = 9, c(2) = d(3) = 1, c(3) = d(5) = 9, c(4) = d(8) = 0 a(4) = Val(Mid(d(7) * 4, 1, 1)) : b(4) = Val(Mid(d(7) * 4, 2, 1)) c(1) = d(1) : c(2) = d(3) : c(3) = d(5) : c(4) = d(8) '此回圈y的變化為: 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14 '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20 '以下類推->20 + 17 + 3 = 40 y = 0 For i = 1 To 4 y = y + a(i) + b(i) + c(i) Next i '以下為總判斷式 '若y除以10的餘數為0(整除),那麼就判斷他為合法的統編 '因為97179430在這裡就被認定合格了,故回傳True If y Mod 10 = 0 Then SysUniNoChk = True y = 0 '初始化 '若不是整除的情況,則 Else '情況一: (參照上面的說明) If d(7) = 7 Then '若d(7) = 7 則 a(5) = Val(Mid(a(4) + b(4), 1, 1)) For i = 1 To 3 y = a(i) + b(i) + c(i) Next i y = y + a(5) + c(4) If y Mod 10 = 0 Then SysUniNoChk = True '此統編合法 Else SysUniNoChk = False '此統編不合法 End If '剩下的情況: Else SysUniNoChk = False '此統編不合法 End If End If End Function -- 如果某一個人無聲的在妳心裡留下印子,妳會時時想起他,時時說到他ꄊ那是愛情的第一步,酸酸的,酸到有點苦,但妳會努力的找出那甜蜜的部份 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.135.40 ※ 編輯: linmic 來自: 220.139.130.149 (04/26 08:49)
higger:大大...謝謝你~~我先研究個二個小時!!! 59.105.108.50 04/26
> -------------------------------------------------------------------------- < 作者: higger (朝鄉而行) 看板: Visual_Basic 標題: Re: [請益] 請教這段程式碼~~~ 時間: Tue Apr 26 22:43:41 2005 '此回圈y的變化為: 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14 '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20 '以下類推->20 + 17 + 3 = 40 y = 0 For i = 1 To 4 y = y + a(i) + b(i) + c(i) Next i 關於這段...我想再請教一下~ i = 1 to 4 i=1 y=a(1) + b(1) + c(1)=1+4+9=14 i=2 y=14+a(2) + b(2) + c(2)=14+1+4+1=20 i=3 y=20+a(3) + b(3) + c(3)=20+8+NULL+9=37 i=4 y=37+a(4) + b(4) + c(4)=37+1+2+0=40 故四個總和是 14+20+37+40=111 (!?) 所以用mod後...餘數不為零呀?? 大大...我到底是錯在那?是i=3那...null不可視為零嗎? 另外... 在i=1時 等號右方那個y...為啥會是零? (依你的算法判斷...你把它當零~) 謝謝~ ※ 引述《linmic (sOMeThiNGwRoNg)》之銘言: : 用你給的Code來檢驗 : 以97179430--這個合格(傳回True)的統編來看: : Public Function SysUniNoChk(ByVal UniNo) As Boolean : '帶入八位字串or 數字.正確傳傳回true : Dim s As String : Dim i As Integer : Dim d(9) As Integer : Dim a(5) As Integer : Dim b(5) As Integer : Dim c(5) As Integer : Dim y As Long : s = Trim(UniNo & "") '現在s = 97179430 : '若輸入的非數字,或字串長不等於8,則離開此Function : If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then : SysUniNoChk = False : Exit Function : End If : '以下的程式碼皆為合法的輸入所使用以驗證 : '現在先算d(1), d(2), d(3), ..... ,d(8)的值 : '以97179430來算: d(1) = 9, d(2) = 7, d(3) = 1, d(4) = 7, .... , d(8) = 0 : For i = 1 To 8 : d(i) = Val(0 & Mid(s, i, 1)) '此行為取出字串(s)之第一個字元並轉值 : Next i : '現在算a(1), a(2), a(3) : 'a(1) = Mid(d(2 * 1) * 2, 1, 1) = 1 (Mid(d(2 * 1) * 2, 1, 1) = 14,所以取1) : 'a(2), a(3)同理 : a(2) = 1, a(3) = 8 : 'b(1) = Mid(d(2 * 1) * 2, 2, 1) = 4 (算出是14,取第二位所以是4) : 'b(2), b(3)同理 : b(2) = 4, b(3) = Null(沒東西) : For i = 1 To 3 : a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1)) : b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1)) : Next i : '根據上面的解釋自己推 : a(4) = 1, b(4) = 2 : 'c(1) = d(1) = 9, c(2) = d(3) = 1, c(3) = d(5) = 9, c(4) = d(8) = 0 : a(4) = Val(Mid(d(7) * 4, 1, 1)) : b(4) = Val(Mid(d(7) * 4, 2, 1)) : c(1) = d(1) : c(2) = d(3) : c(3) = d(5) : c(4) = d(8) : '此回圈y的變化為: : 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14 : '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20 : '以下類推->20 + 17 + 3 = 40 : y = 0 : For i = 1 To 4 : y = y + a(i) + b(i) + c(i) : Next i : '以下為總判斷式 : '若y除以10的餘數為0(整除),那麼就判斷他為合法的統編 : '因為97179430在這裡就被認定合格了,故回傳True : If y Mod 10 = 0 Then : SysUniNoChk = True : y = 0 '初始化 : '若不是整除的情況,則 : Else : '情況一: (參照上面的說明) : If d(7) = 7 Then '若d(7) = 7 則 : a(5) = Val(Mid(a(4) + b(4), 1, 1)) : For i = 1 To 3 : y = a(i) + b(i) + c(i) : Next i : y = y + a(5) + c(4) : If y Mod 10 = 0 Then : SysUniNoChk = True '此統編合法 : Else : SysUniNoChk = False '此統編不合法 : End If : '剩下的情況: : Else : SysUniNoChk = False '此統編不合法 : End If : End If : End Function -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.105.108.50 > -------------------------------------------------------------------------- < 作者: higger (朝鄉而行) 看板: Visual_Basic 標題: Re: [請益] 請教這段程式碼~~~ 時間: Tue Apr 26 22:49:55 2005 sorry...程式好像沒要加總再mod... 而是推到i=4時... 來mod to y... 那y=40...是合乎條件了... 還有那個i=1時的y... 好像依稀記得n年前的計概老師說過... 寫程式...等號是倒過來看的.. 左邊是右邊的結果... 謝謝大大... 我想個簡捷有力地... 再來描述檢查統編方法的白話文版 ※ 引述《higger (朝鄉而行)》之銘言: : '此回圈y的變化為: : 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14 : '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20 : '以下類推->20 + 17 + 3 = 40 : y = 0 : For i = 1 To 4 : y = y + a(i) + b(i) + c(i) : Next i : 關於這段...我想再請教一下~ : i = 1 to 4 : i=1 : y=a(1) + b(1) + c(1)=1+4+9=14 : i=2 : y=14+a(2) + b(2) + c(2)=14+1+4+1=20 : i=3 : y=20+a(3) + b(3) + c(3)=20+8+NULL+9=37 : i=4 : y=37+a(4) + b(4) + c(4)=37+1+2+0=40 : 故四個總和是 : 14+20+37+40=111 (!?) : 所以用mod後...餘數不為零呀?? : 大大...我到底是錯在那?是i=3那...null不可視為零嗎? : 另外... : 在i=1時 : 等號右方那個y...為啥會是零? : (依你的算法判斷...你把它當零~) : 謝謝~ : ※ 引述《linmic (sOMeThiNGwRoNg)》之銘言: : : 用你給的Code來檢驗 : : 以97179430--這個合格(傳回True)的統編來看: : : Public Function SysUniNoChk(ByVal UniNo) As Boolean : : '帶入八位字串or 數字.正確傳傳回true : : Dim s As String : : Dim i As Integer : : Dim d(9) As Integer : : Dim a(5) As Integer : : Dim b(5) As Integer : : Dim c(5) As Integer : : Dim y As Long : : s = Trim(UniNo & "") '現在s = 97179430 : : '若輸入的非數字,或字串長不等於8,則離開此Function : : If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then : : SysUniNoChk = False : : Exit Function : : End If : : '以下的程式碼皆為合法的輸入所使用以驗證 : : '現在先算d(1), d(2), d(3), ..... ,d(8)的值 : : '以97179430來算: d(1) = 9, d(2) = 7, d(3) = 1, d(4) = 7, .... , d(8) = 0 : : For i = 1 To 8 : : d(i) = Val(0 & Mid(s, i, 1)) '此行為取出字串(s)之第一個字元並轉值 : : Next i : : '現在算a(1), a(2), a(3) : : 'a(1) = Mid(d(2 * 1) * 2, 1, 1) = 1 (Mid(d(2 * 1) * 2, 1, 1) = 14,所以取1) : : 'a(2), a(3)同理 : a(2) = 1, a(3) = 8 : : 'b(1) = Mid(d(2 * 1) * 2, 2, 1) = 4 (算出是14,取第二位所以是4) : : 'b(2), b(3)同理 : b(2) = 4, b(3) = Null(沒東西) : : For i = 1 To 3 : : a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1)) : : b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1)) : : Next i : : '根據上面的解釋自己推 : a(4) = 1, b(4) = 2 : : 'c(1) = d(1) = 9, c(2) = d(3) = 1, c(3) = d(5) = 9, c(4) = d(8) = 0 : : a(4) = Val(Mid(d(7) * 4, 1, 1)) : b(4) = Val(Mid(d(7) * 4, 2, 1)) : : c(1) = d(1) : c(2) = d(3) : c(3) = d(5) : c(4) = d(8) : : '此回圈y的變化為: : : 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14 : : '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20 : : '以下類推->20 + 17 + 3 = 40 : : y = 0 : : For i = 1 To 4 : : y = y + a(i) + b(i) + c(i) : : Next i : : '以下為總判斷式 : : '若y除以10的餘數為0(整除),那麼就判斷他為合法的統編 : : '因為97179430在這裡就被認定合格了,故回傳True : : If y Mod 10 = 0 Then : : SysUniNoChk = True : : y = 0 '初始化 : : '若不是整除的情況,則 : : Else : : '情況一: (參照上面的說明) : : If d(7) = 7 Then '若d(7) = 7 則 : : a(5) = Val(Mid(a(4) + b(4), 1, 1)) : : For i = 1 To 3 : : y = a(i) + b(i) + c(i) : : Next i : : y = y + a(5) + c(4) : : If y Mod 10 = 0 Then : : SysUniNoChk = True '此統編合法 : : Else : : SysUniNoChk = False '此統編不合法 : : End If : : '剩下的情況: : : Else : : SysUniNoChk = False '此統編不合法 : : End If : : End If : : End Function -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.105.108.50 > -------------------------------------------------------------------------- < 作者: higger (朝鄉而行) 看板: Visual_Basic 標題: Re: [請益] 請教這段程式碼~~~ 時間: Tue Apr 26 23:44:18 2005 謝謝...我實驗成功了~ 雖然我看不懂vb... 但我想我能努力把它寫成vba... 用在excel上~~~ 另外..原程式中後面有個但書... 若第一階段用10除餘數不為0...還有可能成立... 即這段 If d(7) = 7 Then '若d(7) = 7 則 a(5) = Val(Mid(a(4) + b(4), 1, 1)) For i = 1 To 3 y = a(i) + b(i) + c(i) Next i y = y + a(5) + c(4) If y Mod 10 = 0 Then SysUniNoChk = True 先決條件...第7位數為7 然後算a5 再算這段 For i = 1 To 3 y = a(i) + b(i) + c(i) Next i 即a1+b1+...+c3為止 再把這個值+a5+c4...看這數被10除會不會餘數又是0 若0則成立 這或許是怕原設計碼數會不夠用...故增加這個條件~~~ 呼~~~ 研究出來是一種程度...直接看懂又是一個層次...寫的出來又是一種境界... 世界真是無盡呀~~~ -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.105.108.50
higger:像84915871就是走第二個條件~~` 59.105.108.50 04/26