返回列表 上一主題 發帖

[發問] 數字與數字中如果有空格 要如何取代或刪除呢?

[發問] 數字與數字中如果有空格 要如何取代或刪除呢?

想請問各位大大
EXCEL中 數字與數字中如果有空格 要如何取代或刪除呢?

1.無法直接使用空格( )取代 因為會有一些出現空格是為分段出數字的數值

2.無法使用(? ?)取代成(??) 因為?是兩個位數的取代方法 影響
  同上?的取代情況 (? )或( ?)也不可以使用

3.也有想過用九十九次的取代方法 (1 1) 取代成(11) 也是後段數值無法使用


發生這樣的情況
空格只會出現在數字的倒數第二個位置 例如 1,00 0(正確為1,000)
但"數值"之間也是會有空格的存在 例如 1,000 5 1,000,000(數值區段可能有很多)
(每段數值可能有個位數1 百位數100  千位數1,000  萬位數10,000 更多都會出現)

如有VBA的方式可以處理 是最好  

如有表達不清楚 深感抱歉
歡迎大大的指教   先感謝  再感謝

全部範本檔案 20160828數字中間空格問題.rar (503.93 KB)

20160828數字中間空格問題.rar (503.93 KB)

lo

回復 11# 小俠客
這個要解釋真的不好解釋...
我是會這樣抓啦,你參考看看:
  1. Sub Test()
  2.     Dim oReg: Set oReg = CreateObject("vbscript.regexp")
  3.     Dim x, oMatch
  4.     Const EX1 = "1111 22222 3333年 44444年 abc5555 abc6666年 abc77777 abc88888年"
  5.     With oReg
  6.         .Pattern = "(?:\b|\D)(\d{4})(?=年|\b)"
  7.         .Global = True
  8.         Set oMatch = .Execute(EX1)
  9.         For Each x In oMatch
  10.             Debug.Print "x=" & x, "x.submatches(0)=" & x.submatches(0)
  11.         Next
  12.     End With
  13. End Sub
複製代碼
輸出會是這樣,你好好體會一下
  1. x=1111     x.submatches(0)=1111
  2. x= 3333     x.submatches(0)=3333
  3. x=c5555    x.submatches(0)=5555
  4. x=c6666    x.submatches(0)=6666
複製代碼
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

回復 11# 小俠客
不知道您的原始資料是什麼樣子,如果這些字串不會出現在句首跟句尾,.test那邊就不用改
  1. Function IsYear (ByRef Target As String) As Boolean
  2.     Dim x, oRegexp As Object: Set oRegexp = CreateObject("vbscript.regexp")
  3.     With oRegexp
  4.         .Pattern = "\D(\d{4}年?)\D"
  5.         IsYear = .test("-" & Target & "-")
  6.     End With
  7. End Function
複製代碼

TOP

本帖最後由 准提部林 於 2016-9-13 15:01 編輯

正則真的不容易!!!

試試公式如何:
=SUM(--TEXT(1&RIGHT(LEFT(A1,FIND("年",A1&"年")-1),{4,5}),"[<11901]-9;[>12099]-9;1;!0"))>0

限定 1901~2099 年之間為有效年,
02015年 雖為2015年,但因含5個數字,判為無效,
不過,abcd2015ppuy 這個不含"年"字,2015就無法用這公式判斷,
abcd2015年ppuy 就OK!

TOP

回復  小俠客
^ = 匹配字串開頭
\d{1,2} = 是指前面的 \d出現一次到兩次
        另外常用簡化寫法
        \d? = \d ...
stillfish00 發表於 2016-9-2 11:17



    謝謝你,我已做過測試,好像成功了。
我也依樣試寫了一個檢查字串中有沒有年份的function
True :
1) 如有「年」字時,前面有4個數字
2) 如沒有「年」字,前面有4個數字
  1. Function IsYear (ByRef Target As String) As Boolean
  2.     Dim x, oRegexp As Object: Set oRegexp = CreateObject("vbscript.regexp")
  3.     With oRegexp
  4.         .Pattern ="[0-9]{4}[年]?(?![0-9])"
  5.         IsYear = .test(Target)
  6.     End With
  7. End Function
複製代碼
做了測試,好像效果不太好。
1234
12345
1234年
12345年
abc1234
abc1234年
abc12345
abc12345年

這8組也是TRUE,但我只希望第1、3、5、6組是TRUE。用了{4}也無法限制數字字串只能是4個。
我已經加了negative lookahead (?![0-9]) ,限制數字字串後不可再跟數字,但VBA好像不支援negative lookbehind,無法限制數字字串的開始不是數字.....

TOP

回復 9# 小俠客
^ = 匹配字串開頭
\d{1,2} = 是指前面的 \d出現一次到兩次
        另外常用簡化寫法
        \d? = \d{0,1}
        \d+ = \d{1,}
        \d* = \d{0,}

[)\.] = 是「)」或是「.」單一字元
        如果這個字元的匹配可有可無(出現0次到1次),
        可以在後面加問號
        [)\.]? = [)\.]{0,1}

最後的 .*
    .才是表示任意字元  *表示出現0次到任意多次
    我沒有特別去匹配中文字,要匹配正體中文應該是[\u4e00-\u90a5]

若依你的條件:
1) 以一個或兩個數字作開始,包含中國數字一二三四五六七八九十
2) 數字後會以「)」、「.」作分隔(有時候是沒有)
3) 之後包含了一空格 (必定一空格)
4) 之後接正體中文 (假設至少一中文字)

可寫成
^[0-9一二三四五六七八九十]{1,2}[)\.]?\s[\u4e00-\u90a5]+"
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

本帖最後由 小俠客 於 2016-9-2 10:37 編輯
回復  小俠客
參考吧1) 陳大文   True
32. 注意事項 True
123) 其他   False
stillfish00 發表於 2016-9-1 16:13


我發現到的文字模式是:
1) 以一個或兩個數字作開始
2) 數字後會以「)」、「.」作分隔(有時候是沒有)
3) 之後包含了一空格
4) 小段落的標題(正體中文)
  1.     "^\d{1,2}[)\.]\s.*"
複製代碼
\d =數字,如果要包含中國數字,是不是[0-9一二三四五六七八九十]
{1,2} = 首一至二字
[)\.] = 數字後是「)」、「.」,少數情況是:「12 天氣情況」,數字後只有一空格然後是標題,是不是改成
  1. [)\.\s]
複製代碼
,但這樣會和後面的\s相沖,而令程式以為要有兩空格
* = 萬用碼

如果要符合我的要求,是不是改成
  1. ^[0-9一二三四五六七八九十]{1,2}[)\.\s]\s.*"
複製代碼

TOP

回復 6# 准提部林


    對不起,我理解錯了,我還以為是regular expression。
因為我需要在數萬篇文章中找出小段落的開端,而文章的格式並不相同,所以我需要以較有效的方法找出小標題,然後加上數項驗證以確認這是我需要的段茖。
暫時我觀察了數百篇文章後,暫時我發現到的模式是:
1) 以一個或兩個數字作開始
2) 數字後會以「)」、「.」作分隔(有時候是沒有)
3) 之後包含了一空格
4) 小段落的標題(正體中文)

其實上面的已經是例子,不過可能太少,我要點時間再整理吧。

TOP

回復 5# 小俠客
參考吧
  1. Sub Test()
  2.     Dim x, oRegexp As Object: Set oRegexp = CreateObject("vbscript.regexp")
  3.     With oRegexp
  4.         .Pattern = "^\d{1,2}[)\.]\s.*"
  5.         
  6.         For Each x In Array("1) 陳大文", "32. 注意事項", "123) 其他")
  7.             Debug.Print x, .Test(x)
  8.         Next
  9.     End With
  10. End Sub
複製代碼
1) 陳大文   True
32. 注意事項 True
123) 其他   False
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

回復 5# 小俠客

4樓用的只是很普通的判斷式, 與正則無關, 尚且我對正則並無研究!!!

取文字的問題, 須先看完整的文字, 而非片段, 否則不管用正則或其它方法, 都可能出錯!

最好附上最完整的內容及需求, 能模擬結果更好!

TOP

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