- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
6#
發表於 2014-9-27 12:45
| 只看該作者
本帖最後由 luhpro 於 2014-9-27 12:49 編輯
回復 Hsieh
Dear 大大
附件是我修改好的,不知道有沒有更簡便的撰寫方式。
...
hugh0620 發表於 2014-9-26 13:42 
eeee-a.zip (20.08 KB)
22行以上的部分你可以考慮用你原來的方式,
看起來會比較簡單.
底下我只是嘗試著把它們都放入同一個迴圈內.- Private Sub CommandButton1_Click()
- Application.ScreenUpdating = False
-
- [B3].Resize(Rows.Count - 2, Columns.Count - 1).Clear
- lRow = 3
- bChk = False
- Do While Cells(lRow, 1) <> ""
- With Cells(lRow, 1)
- sStr = Trim(.Value)
- sChk = Left(sStr, 3)
- If sChk = "P/O" Then
- sPo = Mid(sStr, 9)
- .Offset(, 1) = sPo
- .Offset(, 2) = sPo
- ElseIf sChk = "COL" Then
- sCo = Mid(sStr, 6)
- .Offset(, 1) = sCo
- .Offset(, 2) = sPo
- .Offset(, 3) = sCo
- .Offset(-1, 3) = sCo
- Else
- .Offset(, 2) = sPo
- .Offset(, 3) = sCo
- iCnt = 0
- iPos = 1
- Do While iPos <= Len(sStr)
- If InStr(iPos, sStr, "(") <> 0 Then
- iPos = InStr(iPos, sStr, "(") + 1
- iCnt = iCnt + 1
- Else
- Exit Do
- End If
- Loop
- With .Offset(, 4)
- .Value = sStr
- .TextToColumns Space:=True
- End With
- .Offset(, 5 + iCnt).Resize(, 3).Cut .Offset(, 20)
- For iPos = 20 To 22
- .Offset(, iPos) = Val(.Offset(, iPos)) ' 後面計算會用到,所以先轉換成數值
- Next
- vNw1 = 0
- vNw2 = 0
- For iPos = iCnt - 1 To 0 Step -1
- With .Offset(, 5 + iPos)
- .Cut .Offset(, iPos * 2)
- With .Offset(0)
- .TextToColumns Other:=True, OtherChar:="("
- sStr = .Offset(, 1)
- With .Offset(, 1)
- .NumberFormat = "@"
- .Value = Left(sStr, Len(sStr) - 1)
- End With
- End With
- End With
- If iPos <> iCnt - 1 Then
- vNw1 = Round((.Offset(, 5 + iPos * 3) / .Offset(, 20)) * .Offset(, 21), 2)
- .Offset(, 7 + iPos * 3) = vNw1
- vNw2 = vNw2 + vNw1
- End If
- Next
- .Offset(, 4 + iCnt * 3) = .Offset(, 21) - vNw2
- End If
- End With
- lRow = lRow + 1
- Loop
- Application.ScreenUpdating = True
- End Sub
複製代碼 |
|