- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
2#
發表於 2011-6-25 23:21
| 只看該作者
本帖最後由 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 方便多了.
底下是我想到的程式 :- Sub nn()
- Dim sStr$, sColumn$
- Dim iI%, iBegin%, iMark%, iEnd%, iRows%, iRow%
- Dim iCol%, iCol1%, iNext%
-
- sColumn = "BJ"
- iCol1 = 0
- For iI = Len(sColumn) - 1 To 0 Step -1
- iMark = Asc(Mid(sColumn, iI + 1, 1)) - 64
- iCol1 = iCol1 + iMark * 26 ^ -(iI = 0)
- Next iI
- iRows = Cells(Rows.Count, "AO").End(xlUp).Row
- For iRow = 2 To iRows
- sStr = CStr(Cells(iRow, "AO").Value)
- iBegin = InStr(1, sStr, "#") + 1
- iNext = InStr(iBegin + 1, sStr, "#") + 1
- If iNext < iBegin Then iNext = iBegin
- iCol = iCol1
- Do Until iBegin > iNext
- iEnd = InStr(iBegin, sStr, "$") - 1
- Do Until iBegin > iEnd
- iMark = InStr(iBegin, sStr, "#") - 1
- If iMark > iBegin + 6 Then iMark = iEnd
- If iMark < iBegin Then iMark = iEnd
- Cells(iRow, iCol).Value = Trim(Mid(sStr, iBegin + 2, iMark - iBegin - 1))
- iBegin = iMark + 2
- iCol = iCol + 1
- Loop
- iNext = InStr(iBegin + 1, sStr, "#") + 1
- If iNext > iBegin Then iBegin = iNext
- Loop
- Next iRow
- End Sub
複製代碼 |
|