Board logo

標題: [發問] 數字與數字中如果有空格 要如何取代或刪除呢? [打印本頁]

作者: tr24572411    時間: 2016-8-28 23:49     標題: 數字與數字中如果有空格 要如何取代或刪除呢?

想請問各位大大
EXCEL中 數字與數字中如果有空格 要如何取代或刪除呢?
[attach]25075[/attach]
1.無法直接使用空格( )取代 因為會有一些出現空格是為分段出數字的數值
[attach]25077[/attach]
2.無法使用(? ?)取代成(??) 因為?是兩個位數的取代方法 影響
  同上?的取代情況 (? )或( ?)也不可以使用
[attach]25078[/attach]
3.也有想過用九十九次的取代方法 (1 1) 取代成(11) 也是後段數值無法使用
[attach]25079[/attach]

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

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

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

全部範本檔案[attach]25076[/attach]
作者: c_c_lai    時間: 2016-8-29 11:17

回復 1# tr24572411
[attach]25080[/attach]
作者: c_c_lai    時間: 2016-8-29 11:36

回復 1# tr24572411
Sub Ex()
    With Sheets("Sheet2")
        For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
            '  .Cells(i, 6) = Trim(.Cells(i, 1)) = Trim(.Cells(i, 2))   '  字串中之 Space 無法移除
            .Cells(i, 7) = Replace(.Cells(i, 1), " ", "") = Replace(.Cells(i, 2), " ", "")
        Next
    End With
End Sub
作者: 准提部林    時間: 2016-8-29 11:43

看起來都是千分位後面的三位數字多一個空白字元,
自訂函數:
  1. Function ClearSpace(xStr$) As String
  2. Dim TT, i%
  3. TT = Split(Replace(xStr, ",", "_,"), "_")
  4. For i = 0 To UBound(TT)
  5.     If TT(i) Like ",[0-9][0-9] [0-9]*" Then
  6.        TT(i) = Replace(TT(i), " ", "", 1, 1)
  7.     End If
  8. Next
  9. ClearSpace = Join(TT, "")
  10. End Function
複製代碼
[attach]25081[/attach]

公式:=ClearSpace(A2)
 
 
作者: 小俠客    時間: 2016-9-1 13:05

看起來都是千分位後面的三位數字多一個空白字元,
自訂函數:

公式:=ClearSpace(A2)
 
 
准提部林 發表於 2016-8-29 11:43



    看來版大好像是使用正則表達式來解決這個問題,很利害!而且不需要使用CreateObject("VBScript.RegExp")感覺更方便。
正則表達式(http://regexr.com/)好像很困難,我看了很多東西也不了解,下面有一題目,可以請版大幫助指教嗎?

我想找出這種句型的字串,首1/2個字為數字,之後可能是「) 」、「. 」的分格符號和一空白字元,之後是中文字。例如:
-----------------------
符合
1) 陳大文
32. 注意事項

不符合
123) 其他
雜項
----------------
能夠用正則表達式處理嗎?現在我只能用for loop ,再用asc,很慢......
作者: 准提部林    時間: 2016-9-1 14:38

回復 5# 小俠客

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

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

最好附上最完整的內容及需求, 能模擬結果更好!
作者: stillfish00    時間: 2016-9-1 16:13

回復 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
作者: 小俠客    時間: 2016-9-2 10:12

回復 6# 准提部林


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

其實上面的已經是例子,不過可能太少,我要點時間再整理吧。
作者: 小俠客    時間: 2016-9-2 10:23

本帖最後由 小俠客 於 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.*"
複製代碼

作者: stillfish00    時間: 2016-9-2 11:17

回復 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]+"
作者: 小俠客    時間: 2016-9-13 13:33

回復  小俠客
^ = 匹配字串開頭
\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,無法限制數字字串的開始不是數字.....
作者: 准提部林    時間: 2016-9-13 15:00

本帖最後由 准提部林 於 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!
作者: zyzzyva    時間: 2016-9-13 15:53

回復 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
複製代碼

作者: stillfish00    時間: 2016-9-14 15:58

回復 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
複製代碼





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