返回列表 上一主題 發帖

[發問] 請問如何從一行文字長字串中截取需要的短字串

本帖最後由 luhpro 於 2011-6-25 23:27 編輯

依據你的需求抓取指定字串的癥結在於 :
1. 找到 "#" 與 "$" 的位置,
2. 確定職稱都是只有兩個字, 否則將很難確認到底名字是從哪裡開始抓的
要找到某個字串的位置 Excel VBA 有個指令 instr 可以達成此目的.

值得一題的是,
不論 instr 還是 mid(left、right、len 皆同) 對於中文字都是視為 1 個字的長度,
這在抓取報表形式的文字時是非常不適合用的指令.
例如 :

2011/06/25 張三       16:33:18
2011/06/25 李四娘     16:55:21

若用 mid(sstr,21,8) 抓第一行可以正常抓到時間 16:33:18,
但第二行卻會抓成 6:55:21 ,
所以比較好的區隔方式會是在要抓的字串右方放上用特定符號,
用 instr 抓取該符號再往前推一定長度.

然而在 c 語言中一個中文字則是視為 2 個字的長度,
在此類需求的使用上真的是比 Excel VBA 方便多了.

底下是我想到的程式 :
  1. Sub nn()
  2.   Dim sStr$, sColumn$
  3.   Dim iI%, iBegin%, iMark%, iEnd%, iRows%, iRow%
  4.   Dim iCol%, iCol1%, iNext%
  5.   
  6.   sColumn = "BJ"
  7.   iCol1 = 0
  8.   For iI = Len(sColumn) - 1 To 0 Step -1
  9.     iMark = Asc(Mid(sColumn, iI + 1, 1)) - 64
  10.     iCol1 = iCol1 + iMark * 26 ^ -(iI = 0)
  11.   Next iI
  12.   iRows = Cells(Rows.Count, "AO").End(xlUp).Row
  13.   For iRow = 2 To iRows
  14.     sStr = CStr(Cells(iRow, "AO").Value)
  15.     iBegin = InStr(1, sStr, "#") + 1
  16.     iNext = InStr(iBegin + 1, sStr, "#") + 1
  17.     If iNext < iBegin Then iNext = iBegin
  18.     iCol = iCol1
  19.     Do Until iBegin > iNext
  20.       iEnd = InStr(iBegin, sStr, "$") - 1
  21.       Do Until iBegin > iEnd
  22.         iMark = InStr(iBegin, sStr, "#") - 1
  23.         If iMark > iBegin + 6 Then iMark = iEnd
  24.         If iMark < iBegin Then iMark = iEnd
  25.         Cells(iRow, iCol).Value = Trim(Mid(sStr, iBegin + 2, iMark - iBegin - 1))
  26.         iBegin = iMark + 2
  27.         iCol = iCol + 1
  28.       Loop
  29.       iNext = InStr(iBegin + 1, sStr, "#") + 1
  30.       If iNext > iBegin Then iBegin = iNext
  31.     Loop
  32.   Next iRow
  33. End Sub
複製代碼

TOP

        靜思自在 : 吃苦了苦、苦盡廿來,享福了福、福盡悲來。
返回列表 上一主題