返回列表 上一主題 發帖

[發問] EXCEL VBA 由計算說明計算金額(二)

[發問] EXCEL VBA 由計算說明計算金額(二)

原發問如下,是利用刪除字串來刪除部必要的字元
http://forum.twbts.com/thread-7705-1-1.html

因為前方式還不是很方便使用,希望設定簡單規則來刪除不必要的字元或是保留必要的字元
C欄計算說明中,只要保留 數字 0-9,運算符號 + - * / ^ % ,括號 ( ), 英文 a-z A-Z 其他刪除,
刪除後會變成標準計算式,再計算式放入D欄金額欄,為了方便檢查正確性,可否以公式方式放入。




檔案 EXCEL VBA 計算說明轉金額(二).rar (5.99 KB)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

回復 1# ML089
  1. Function MyCal(Mystr$) As Double
  2. Application.Volatile
  3. Set d = CreateObject("Scripting.Dictionary")
  4. ar = Array(40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 91, 92, 93, 94, 95)
  5. For i = 0 To UBound(ar)
  6. d(Chr(ar(i))) = Chr(ar(i))
  7. Next
  8. For i = Len(Mystr) To 1 Step -1
  9. Mystr = Replace(Mystr, Mid(Mystr, i, 1), d(Mid(Mystr, i, 1)))
  10. Next
  11. MyCal = Evaluate(Mystr)
  12. End Function
複製代碼
學海無涯_不恥下問

TOP

回復 2# Hsieh
感謝回覆,
這次有 CreateObject("Scripting.Dictionary") 讓我一直看不懂,上網研究後大致已經懂了你的程式,
因為要修改去除的碼,重新依照你的公式構架編寫如下:

另外再補充請教一問題, Mid(字串, i, 1) 取出一字如何判定是中文字?

Function MyCal(MyStr$) As Double
    Application.Volatile
    Set d = CreateObject("Scripting.Dictionary")
    Dic = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789%+-*/^()"
    For i = 1 To Len(Dic)
        d(Mid(Dic, i, 1)) = Mid(Dic, i, 1)
    Next
    For i = Len(MyStr) To 1 Step -1
        MyStr = Replace(MyStr, Mid(MyStr, i, 1), d(Mid(MyStr, i, 1)))
    Next
    MyCal = Evaluate(MyStr)
End Function
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 3# ML089
判斷是否為漢字,可利用ASC函數取得字元碼,小於0則為漢字
學海無涯_不恥下問

TOP

回復 4# Hsieh

感謝回覆

在EXCEL是用CODE,爾且碼是正數5位
在VBA是用ASC,爾且碼是負數5位
VBA的ASC與EXCEL的ASC是不同意義,
EXCEL的函數與VBA的函數不同名用法也不同,學習起來真是痛苦。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

EXCEL VBA 計算說明轉金額(二).rar (7.58 KB)
1

評分人數

    • Hsieh: 給你一個讚!金錢 + 2

TOP

回復 6# chin15
哇! 使用 CreateObject("VBSCRIPT.REGEXP") 讓程式碼更短,真厲害
雖然看不懂,還是先給一個讚
EXCEL裡找不到說明,網路都是例子找不到完整說明,不知哪裡有說明可以看,可否告知 一下。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

http://www.dotblogs.com.tw/yc421206/archive/2008/12/14/6386.aspx

TOP

回復 1# ML089
提供你參考。
  1. Function decodeFMT(decode As String) As String
  2.     Dim tLen%, txt$, num$
  3.    
  4.     If Len(decode) = 0 Then decodeFMT = "": Exit Function
  5.     num = "=Sum("
  6.     For tLen = 1 To Len(decode)
  7.            txt = Mid(decode, tLen, 1)
  8.            If txt = "(" Or txt = ")" Or txt = "+" Or txt = "+" Or txt = "+" Or txt = "-" Or txt = "*" Or txt = "/" Or (txt >= "0" And txt <= "9") Then
  9.                 num = num + txt
  10.            End If
  11.     Next tLen
  12.     decodeFMT = num + ")"
  13. End Function
複製代碼
EXCEL VBA 計算說明轉金額.rar (9.07 KB)

TOP

回復 8# chin15

說明清楚,感謝你,又讓我多學了好幾招,再給你一個 讚
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

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