Cách tính số trong chuỗi này

Liên hệ QC

mondays

Thành viên mới
Tham gia
26/10/12
Bài viết
28
Được thích
3
Do yêu cầu công việc nên mỗi một tiêu mục trong file excel của em phải được nằm trong cùng một cột: đơn giá, số lượng, số ngày,......Và cột kết quả em cần tính là tích số của các đơn vị trên (như trong file tính). Các anh chị nào chỉ cho em hàm hoặc code sao cho tính nhanh mà công thức đơn giản không ạ. Em xin cảm ơn nhiều!!
 

File đính kèm

  • Ham hoac code.xls
    14 KB · Đọc: 25
Lần chỉnh sửa cuối:
Do yêu cầu công việc nên mỗi một tiêu mục trong file excel của em phải được nằm trong cùng một cột: đơn giá, số lượng, số ngày,......Và cột kết quả em cần tính là tích số của các đơn vị trên (như trong file tính). Các anh chị nào chỉ cho em hàm hoặc code sao cho tính nhanh mà công thức đơn giản không ạ. Em xin cảm ơn nhiều!!

Thử thế này coi sao
Lưu ý nếu dòng nào có ký tự x không phải dấu nhân thì sẽ bị lỗi.
PHP:
Function tinh(cell As Range)
Dim tam
With CreateObject("vbscript.regexp")
   .Global = True
   .Pattern = "[^0-9|x ]"
   tam = Trim(.Replace(cell, ""))
   .Pattern = "x"
   tam = .Replace(tam, "*")
End With
tinh = Evaluate(tam)
End Function
 

File đính kèm

  • Copy of Ham hoac code.rar
    10.9 KB · Đọc: 9
Do yêu cầu công việc nên mỗi một tiêu mục trong file excel của em phải được nằm trong cùng một cột: đơn giá, số lượng, số ngày,......Và cột kết quả em cần tính là tích số của các đơn vị trên (như trong file tính). Các anh chị nào chỉ cho em hàm hoặc code sao cho tính nhanh mà công thức đơn giản không ạ. Em xin cảm ơn nhiều!!
Bài toán này tính tích, làm thế này có thể bớt rủi ro
Mã:
Public Function Tich(Cll) As Long
    Dim Re, ReTim, Cl, Kq
    Set Re = CreateObject("vbscript.regexp")
    Cll = Replace(Replace(Cll, ".", ""), ",", ""): Kq = 1
        With Re
            .Global = True
            .Pattern = "[\d]+"
            Set ReTim = .Execute(Cll)
        End With
            For Each Cl In ReTim
                Kq = Kq * Cl
            Next Cl
    Tich = Kq
End Function
Thân
 

File đính kèm

  • Ham hoac code.xls
    25.5 KB · Đọc: 8
Bài toán này tính tích, làm thế này có thể bớt rủi ro
Mã:
Public Function Tich(Cll) As Long
    Dim Re, ReTim, Cl, Kq
    Set Re = CreateObject("vbscript.regexp")
    Cll = Replace(Replace(Cll, ".", ""), ",", ""): Kq = 1
        With Re
            .Global = True
            .Pattern = "[\d]+"
            Set ReTim = .Execute(Cll)
        End With
            For Each Cl In ReTim
                Kq = Kq * Cl
            Next Cl
    Tich = Kq
End Function
Thân

Em rình cách anh xài phương thức Execute hoài mà chưa ứng dụng được. Sau bài này nhất định sẽ ráng học phương thức này.
 
Cách giảm thiểu khả năng sai:

Nhận xét rằng tất cả các chuỗi đều có dạng các dữ liệu nhân nhau, như vậy mỗi số bắt buộc phải cách nhau bằng một ký tự x (cộng thêm ký tự gì đó)

1. Loại bỏ các ký tự trống " ", dấu chấm "." và dấu phẩy "," (làm chuẩn các con số, như đã dẫn)
2. Cộng thêm một ký tự "x" vào đầu chuỗi
3. Dùng Regex (như đã dẫn) để lọc ra từng số, theo mẫu "x[\d]+"
4. Bắt đầu bẳng "1", gộp mảng kết quả lại bằng cách nối tiếp từng phần tử vào
5. Đổi các "x" thành "*"
6. Gọi hàm Evaluate
 
Bài toán này tính tích, làm thế này có thể bớt rủi ro
Mã:
Public Function Tich(Cll) As Long
    Dim Re, ReTim, Cl, Kq
    Set Re = CreateObject("vbscript.regexp")
    Cll = Replace(Replace(Cll, ".", ""), ",", ""): Kq = 1
        With Re
            .Global = True
            .Pattern = "[\d]+"
            Set ReTim = .Execute(Cll)
        End With
            For Each Cl In ReTim
                Kq = Kq * Cl
            Next Cl
    Tich = Kq
End Function
Thân
Sau khi miệt mài ngâm cứu bài thuốc của anh, em đã hiểu cách hoạt động của cái dấu + rồi
Để đề phòng 2 số bị cách nhau bởi khoảng trắng em thêm tí gia vị vào code của anh

Coi như đây là sự kiện của ngày tận thế.

PHP:
Public Function Tich(Cll) As Long
Dim ReTim, Cl, Kq
With CreateObject("vbscript.regexp")
   Cll = Replace(Replace(Cll, ".", ""), ",", "")
   Cll = Replace(Cll, " ", "")
   Kq = 1
   .Global = True
   .Pattern = "[\d]+"
   Set ReTim = .Execute(Cll)
   For Each Cl In ReTim
     Kq = Kq * Cl
   Next Cl
   Tich = Kq
End With
End Function
 
Web KT
Back
Top Bottom