Board logo

標題: [發問] 提取編號中的數字&數字補零 [打印本頁]

作者: yc1031    時間: 2012-7-3 08:24     標題: 提取編號中的數字&數字補零

[attach]11560[/attach][attach]11560[/attach]

各位好!
提取數字部分, 我只會最基本的用FIND/LEN/MID/RIGHT 慢慢的, 將 "-" 前後的數字找出來,
最後一組 "-"後的數字再加0, 然後再用 " & " 將 11001 & 023 串起來。

但函數就變的好長, 想學習是否有更快更簡單的函數可以做到呢?  感謝各位!

訂單編號                                  提取數字和最後一組數字變3碼
VC-11001-23                           11001023
VC-11001-123                           11001123
       
只取出後面數字部分11001 23, 最後的23 要變成3碼, 23 -->023
作者: Hsieh    時間: 2012-7-3 08:51

本帖最後由 Hsieh 於 2012-7-3 10:38 編輯

回復 1# yc1031


  =SUBSTITUTE(MID(A1,FIND("-",A1)+1,255),"-",IF(LEN(A1)>11,"","0"))
作者: yc1031    時間: 2012-7-3 21:23

回復 2# Hsieh



謝謝您! 學習了~
原來不需要弄成那麼複雜...
作者: isqueen    時間: 2012-7-3 21:34

=IF(LEN(A2)=11,MID(A2,4,5)&"0"&MID(A2,10,2),MID(A2,4,5)&MID(A2,10,3))
作者: yc1031    時間: 2012-7-4 10:48

回復 4# isqueen


    感謝您!
您的方法我試了, 也可行, 且也簡潔,   學習了:)
作者: hugh0620    時間: 2012-7-4 12:30

=MID(A1,4,5)&IF(VALUE(RIGHT(A1,3))<0,"0"&RIGHT(A1,2))

資料若有其固定的編碼原則~ 基本上取右取左都可以處理~
作者: yc1031    時間: 2012-7-5 12:20

回復 6# hugh0620


編碼的最後有可能是2碼或3碼
您建議的函數, 我有學著修改一點點成 =MID(A2,4,5)&IF(VALUE(RIGHT(A2,3))<0,"0"&RIGHT(A2,2),RIGHT(A2,3))
也是可行的! 非常謝謝您!
作者: Qin    時間: 2016-11-26 21:38

本帖最後由 Qin 於 2016-11-26 21:41 編輯

如何將 "-" 符號改成"0",

每組編號共15個字元

如下:

1-1234
11-532
8-1
4-32167
M-1000

變成
100000000001234
110000000000532
800000000000001
400000000032167
M00000000001000
作者: ML089    時間: 2016-11-27 06:32

A1 =SUM(MID(A1,{4,10},{5,3})*{1000,1})
作者: ML089    時間: 2016-11-27 06:43

本帖最後由 ML089 於 2016-11-27 06:45 編輯

回復 8# Qin

回覆 8樓新題目
將 "-" 處插入0,長度改為15位

=REPLACE(A1,FIND("-",A1),1,REPT(0,16-LEN(A1)))
作者: 准提部林    時間: 2016-11-27 12:21

=SUBSTITUTE(A1,"-",REPT(0,16-LEN(A1)))
作者: Qin    時間: 2017-3-21 23:32

[attach]26837[/attach]回復 10# ML089
作者: Qin    時間: 2017-3-21 23:47

[attach]26839[/attach]回復 10# ML089
作者: ML089    時間: 2017-3-22 08:38

回復 12# Qin

=VLOOKUP(E2,A2:B6,2,0)
要改為
=VLOOKUP(E2,A$2:B$9,2,0)
範圍要用$鎖住,不然下拉時範圍回跑掉
範圍大小也要修改


E3是文字,A3是數字
E6是文字,A4是數字
所以用VLOOKUP查詢不到
作者: ML089    時間: 2017-3-22 08:45

回復 12# Qin

若編碼有文數字時(不建議),試試下式
f2 =INDEX(B:B,-LOOKUP(,-MATCH(IF({1,0},E2,--E2),A:A,)))
作者: Qin    時間: 2017-3-22 20:33

[attach]26846[/attach]回復 15# ML089


  謝謝, 答案顯示出來了

  但我又有了新的提問...
作者: ML089    時間: 2017-3-22 21:25

回復 16# Qin

沒有匹配如下,長度不樣

10000000000001a
100000000000001a

150000000002160
15002160

15gb00000000435
15GB0435


20000000000336a
200000000000336a
作者: Qin    時間: 2017-3-22 22:00

回復 17# ML089

想問的是A欄的編碼文數字長短不一
E欄是要如何在D欄輸入後,如何將符號"-"自動補零?
作者: ML089    時間: 2017-3-22 22:38

本帖最後由 ML089 於 2017-3-22 23:09 編輯

回復 18# Qin

F2 =VLOOKUP(SUBSTITUTE(D2,"-","*"),IF({1,0},A$2:A$99&"",B$2:B$99),2,)
陣列公式,需用CTRL+SHIFT+ENTER三鍵輸入公式


[attach]26852[/attach]
作者: Qin    時間: 2017-3-22 23:21

本帖最後由 Qin 於 2017-3-22 23:24 編輯

回復 19# ML089

謝謝, 可以了

再提問

如果D欄尚未輸入任何文數字

F2的陣列已下拉公式不是"0", 而是空白的.

這又要如何下公式?
作者: Hsieh    時間: 2017-3-22 23:22

回復 8# Qin

=SUBSTITUTE(A1,"-",REPT(0,15-LEN(A1)+1))
作者: ML089    時間: 2017-3-23 09:07

本帖最後由 ML089 於 2017-3-23 09:21 編輯

回復 20# Qin

加上IF判斷 D欄是否有值,無值時為空白

{ =IF(D2="","",VLOOKUP(SUBSTITUTE(D2,"-","*"),IF({1,0},A$2:A$99&"",B$2:B$99),2,)) }

A欄資料為 Table_Array 的 Index-key 最好能是固定長度,統一為文字,對查詢比較容易。
目前 A欄 有文字、數字型態,Index-key長短不一致,
雖然 可以用  前字串 + "*" + 後字串 來查詢,但也有可能會有誤判情況

例如
A1*123查詢

下列都可以符合,會優先選取第一個
A10000123
A12000123
A1A123123
作者: Qin    時間: 2017-3-23 20:50

回復 22# ML089

.謝謝!

受教了.
作者: Andy2483    時間: 2023-3-10 15:40

本帖最後由 Andy2483 於 2023-3-10 15:57 編輯

回復 19# ML089
回復 1# cdkee


    論壇到處都有寶藏,謝謝論壇,謝謝前輩
後學練習字典與陣列的方法,請前輩再指導

執行前:
[attach]35915[/attach]

執行結果:
[attach]35916[/attach]

Option Explicit
Sub TEST_1()
Dim Brr, Crr, i&, T$, V%, Y, Z$, j%
Set Y = CreateObject("Scripting.Dictionary")
Brr = Range([B2], Cells(Rows.Count, "A").End(3))
Crr = Range([E2], Cells(Rows.Count, "E").End(3))
For i = 1 To UBound(Brr)
   T = Trim(Brr(i, 1)): If T = "" Then GoTo i01
   V = Len(T)
   For j = V To 1 Step -1
      If Mid(T, j, 1) <> "0" Then
         Z = Mid(T, j + 1): T = Mid(T, 1, j)
         Exit For
      End If
   Next
   T = Replace(UCase(Trim(Brr(i, 1))), "0", "") & Z
   If Y.Exists(T) = Empty Then
      Y(T) = Brr(i, 2)
      ElseIf Y(T) <> Brr(i, 2) Then
         MsgBox Brr(i, 1) & " 去0簡化後的資料欄有同編號不同商品疑慮"
         Exit Sub
   End If
i01:
Next
For i = 1 To UBound(Crr)
   T = Trim(Crr(i, 1)): If T = "" Then GoTo i02
   V = Len(T)
   For j = V To 1 Step -1
      If Mid(T, j, 1) <> "0" Then
         Z = Mid(T, j + 1): T = Mid(T, 1, j)
         Exit For
      End If
   Next
   T = Replace(UCase(Trim(Crr(i, 1))), "0", "") & Z
   Crr(i, 1) = Y(T)
i02:
Next
[I2].Resize(UBound(Crr), 1) = Crr
Erase Brr, Brr: Set Y = Nothing
End Sub
作者: Andy2483    時間: 2023-3-13 10:36

本帖最後由 Andy2483 於 2023-3-13 10:42 編輯

回復 24# Andy2483


    謝謝論壇,謝謝各位前輩
今天複習此題,發現闕漏與贅述,心得註解如下

Option Explicit
Sub TEST_1()
Dim Brr, Crr, Y, T$, Z$, j%, V%, i&
'↑宣告變數:(Brr,Crr,Y)是通用型變數,(T,Z)是字串變數,
'(j,V)是短整數變數,i是長整數變數

Set Y = CreateObject("Scripting.Dictionary")
'↑令Y這通用型變數是 字典
Brr = Range([B2], Cells(Rows.Count, "A").End(3))
'↑令Brr是二維陣列,以[B2]到 A欄最後有內容儲存格,這兩格之間所有儲存格值帶入
Crr = Range([E2], Cells(Rows.Count, "E").End(3))
'↑令Brr是二維陣列,以[E2]到 E欄最後有內容儲存格,這兩格之間所有儲存格值帶入
For i = 1 To UBound(Brr)
'↑設順迴圈!i從1 到Brr陣列縱向最大索引列號
   T = Trim(Brr(i, 1)): If T = "" Then GoTo i01
   '↑令T這字串變數是i迴圈列第1欄Brr陣列值去除前後空白字元露的新字:
   '如果T變數是空字元!就跳到 i01位置繼續執行

   V = Len(T)
   '↑令V這短整數變數是 T變數的字元數
   For j = V To 1 Step -1
   '↑設順迴圈!j從V變數到 1,令每個迴圈j都要-1
      If Mid(T, j, 1) <> "0" Then
      '↑如果T變數從j變數開始取1個字的字元不是"0"
         Z = Mid(T, j + 1)
         '↑令Z這字串變數是 T變數從j+1個字開始到 最後字之間的字串
         Exit For
         '↑跳出j迴圈
      End If
   Next
   T = Replace(UCase(Trim(Brr(i, 1))), "0", "") & Z
   '↑令T變數是 i迴圈列第1欄Brr陣列值 去除前後空白字元,經轉化英文字母為大寫,
   '再將0置換為空字元,最後連接Z變數 組成新的字串變數

   If Y.Exists(T) = Empty Then
   '↑如果以T變數查Y字典裡沒有這key?
      Y(T) = Brr(i, 2)
      '↑令以T變數當key,Item是i迴圈列第2欄Brr陣列值
      ElseIf Y(T) <> Brr(i, 2) Then
      '↑否則如果以T變數查Y字典所回傳值不同於 i迴圈列第2欄Brr陣列值??
         MsgBox Brr(i, 1) & " 去0簡化後的資料欄有同編號不同商品疑慮"
         '↑跳出提示窗~~
         Exit Sub
         '↑結束程式執行
   End If
i01:
Next
For i = 1 To UBound(Crr)
'↑設順迴圈!i從1到 Crr陣列縱向最大索引列號
   T = Trim(Crr(i, 1)): If T = "" Then GoTo i02
   '↑令T變數是 i迴圈列第1欄陣列值去除前後空白字元後的新字串,
   '如果T變數是空字元!就跳到 i02位置繼續執行

   V = Len(T)
   '↑令V這短整數變數是 T變數的字元數
   For j = V To 1 Step -1
   '↑設順迴圈!j從V變數到 1,令每個迴圈j都要-1
      If Mid(T, j, 1) <> "0" Then
      '↑如果T變數從j變數開始取1個字的字元不是"0"
         Z = Mid(T, j + 1)
         '↑令Z這字串變數是 T變數從j+1個字開始到 最後字之間的字串
         Exit For
         '↑跳出j迴圈
      End If
   Next
   T = Replace(UCase(Trim(Crr(i, 1))), "0", "") & Z
   '↑令T變數是 i迴圈列第1欄Brr陣列值 去除前後空白字元,經轉化英文字母為大寫,
   '再將0置換為空字元,最後連接Z變數 組成新的字串變數

   Crr(i, 1) = Y(T)
   '↑令i迴圈列第1欄Crr陣列值是 以T變數查Y字典所回傳的Item值
i02:
Next
[I2].Resize(UBound(Crr), 1) = Crr
'↑令[I2]擴展向下Crr陣列縱向最大索引列號數 的儲存格範圍,以Crr陣列值帶入
Erase Brr, Brr: Set Y = Nothing
'↑釋放變數
End Sub




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