Giúp tạo hàm tự tạo demso() đa dạng! (1 người xem)

Người dùng đang xem chủ đề này

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,328
Được thích
1,765
Em chào Thầy cô & Anh chị!
Công việc của em nhiều lúc phải đếm số lượng phiếu đã sử dụng, nên em nhờ giúp em tạo hàm tự tạo demso() đa dạng! như đã mô tả trong File
Em cảm ơn!
 

File đính kèm

Em chào Thầy cô & Anh chị!
Công việc của em nhiều lúc phải đếm số lượng phiếu đã sử dụng, nên em nhờ giúp em tạo hàm tự tạo demso() đa dạng! như đã mô tả trong File
Em cảm ơn!
Bản thảo sơ qua:
PHP:
Function vCount(ByVal sNumber As String) As Long
  Dim tmp, Arr, tmpArr, lCount As Long, Item
  On Error Resume Next
  tmp = Replace(sNumber, ";", ",")
  If InStr(1, tmp, ",") Then
    Arr = Split(tmp, ",")
    lCount = UBound(Arr) + 1
    For Each Item In Arr
      If InStr(1, Item, "-") Then
        tmpArr = Split(Item, "-")
        lCount = lCount + tmpArr(1) - tmpArr(0)
      End If
    Next
  Else
    If InStr(1, tmp, "-") Then
      tmpArr = Split(tmp, "-")
      lCount = lCount + tmpArr(1) - tmpArr(0) + 1
    End If
  End If
  vCount = lCount
End Function
Test lại, trúng trật gì tính tiếp
 
Upvote 0
Em chào Thầy cô & Anh chị!
Công việc của em nhiều lúc phải đếm số lượng phiếu đã sử dụng, nên em nhờ giúp em tạo hàm tự tạo demso() đa dạng! như đã mô tả trong File
Em cảm ơn!
Tham gia một phát
Mã:
Public Function DemSo(Cll As String) As Variant
    Dim I As Long, Tong As Long, Tach, TachTiep
    If Cll = "" Then DemSo = "": Exit Function
    Cll = Replace(Cll, ".", ",")
    Tach = Split(Cll, ";")
        For I = LBound(Tach) To UBound(Tach)
            If InStr(Tach(I), "-") Then
                TachTiep = Split(Tach(I), "-")
                Tong = 1 + Tong + (Val(TachTiep(1)) - Val(TachTiep(0)))
            Else
                Tong = 1 + Tong + (Len(Tach(I)) - Len(Replace(Tach(I), ",", "")))
            End If
        Next I   
    DemSo = Tong
End Function
Cái này đếm cũng là ....đếm thôi, có gì đâu mà đa dạng
Híc
 
Upvote 0
Em cảm ơn các thầy.
Các thầy giúp em thêm 1 tý nữa, số là vầy, do các anh chị & đồng nghiệp chuyển File cho em, nên có thể họ nhập như thế này, VD: 1-9; sẽ cho KQ là 10 (KQ đúng là 9) hoặc 1,2; sẽ cho KQ là 3 (KQ đúng là 2) ... Mà kg fải lúc nào em chú ý hết tất cả được
Vì thế các thầy loại bỏ dấu phẩy hoặc chấm phẩm hoặc gạch ngang trước khi tính cho KQ

Em xin cảm ơn
 
Upvote 0
Em cảm ơn các thầy.
Các thầy giúp em thêm 1 tý nữa, số là vầy, do các anh chị & đồng nghiệp chuyển File cho em, nên có thể họ nhập như thế này, VD: 1-9; sẽ cho KQ là 10 (KQ đúng là 9) hoặc 1,2; sẽ cho KQ là 3 (KQ đúng là 2) ... Mà kg fải lúc nào em chú ý hết tất cả được
Vì thế các thầy loại bỏ dấu phẩy hoặc chấm phẩm hoặc gạch ngang trước khi tính cho KQ

Em xin cảm ơn
Sửa code thành vầy xem:
PHP:
Function vCount(ByVal sNumber As String) As Long
  Dim tmp, Arr, tmpArr, lCount As Long, Item
  On Error Resume Next
  tmp = Replace(sNumber, ";", ",")
  tmp = Trim(Replace(tmp, ",", " "))
  If InStr(1, tmp, " ") Then
    Arr = Split(tmp, " ")
    lCount = UBound(Arr) + 1
    For Each Item In Arr
      If InStr(1, Item, "-") Then
        tmpArr = Split(Item, "-")
        lCount = lCount + tmpArr(1) - tmpArr(0)
      End If
    Next
  Else
    If InStr(1, tmp, "-") Then
      tmpArr = Split(tmp, "-")
      lCount = lCount + tmpArr(1) - tmpArr(0) + 1
    End If
  End If
  vCount = lCount
End Function
Thay mọi thứ thành khoảng trắng, xong ta TRIM 1 phát là nó "bay" mất mấy khoảng trắng thừa cuối chuổi (nếu có)
 
Upvote 0
Sửa code thành vầy xem:
PHP:
Function vCount(ByVal sNumber As String) As Long
  Dim tmp, Arr, tmpArr, lCount As Long, Item
  On Error Resume Next
  tmp = Replace(sNumber, ";", ",")
  tmp = Trim(Replace(tmp, ",", " "))
  If InStr(1, tmp, " ") Then
    Arr = Split(tmp, " ")
    lCount = UBound(Arr) + 1
    For Each Item In Arr
      If InStr(1, Item, "-") Then
        tmpArr = Split(Item, "-")
        lCount = lCount + tmpArr(1) - tmpArr(0)
      End If
    Next
  Else
    If InStr(1, tmp, "-") Then
      tmpArr = Split(tmp, "-")
      lCount = lCount + tmpArr(1) - tmpArr(0) + 1
    End If
  End If
  vCount = lCount
End Function
Thay mọi thứ thành khoảng trắng, xong ta TRIM 1 phát là nó "bay" mất mấy khoảng trắng thừa cuối chuổi (nếu có)
Hi nếu chuỗi là 123, hoặc 358 .... thì nó "biến" thành 0!!!
Em cảm ơn!
 
Upvote 0
Hi nếu chuỗi là 123, hoặc 358 .... thì nó "biến" thành 0!!!
Em cảm ơn!

Đúng ra bạn nên đưa lên 1 file có tất cả các trường hợp xảy ra cho dễ! Chứ viết xong lại xuất hiện yêu cầu mới vậy.. mệt lắm
PHP:
Function vCount(ByVal sNumber As String) As Long
  Dim tmp, Arr, tmpArr, lCount As Long, Item
  On Error Resume Next
  tmp = Replace(sNumber, ";", ",")
  tmp = WorksheetFunction.Trim(Replace(tmp, ",", " "))
  If InStr(1, tmp, " ") Then
    Arr = Split(tmp, " ")
    lCount = UBound(Arr) + 1
    For Each Item In Arr
      If InStr(1, Item, "-") Then
        tmpArr = Split(Item, "-")
        lCount = lCount + tmpArr(1) - tmpArr(0)
      End If
    Next
  ElseIf InStr(1, tmp, "-") Then
    tmpArr = Split(tmp, "-")
    lCount = lCount + tmpArr(1) - tmpArr(0) + 1
  ElseIf IsNumeric(tmp) Then
    lCount = 1
  End If
  vCount = lCount
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Chào thầy NDU,
Em mày mò mãi tìm ra được bài em cầm tìm
Sau khi thử code trên của Thầy thì thấy đúng ý em
Tuy nhiên code trên chỉ đếm được những số tự nhiên còn các ký tự chữ thì chưa đếm đúng, thầy giúp em để nó đếm như yêu cầu của bạn Hong.Van và em muốn thêm cách đếm các cụm ký tự như sau

GNT -------> code trên cho kết quả là 0 ----------> em muốn kết quả là 1
bảng lương --------------------------> 2 -------- ---------------------> 1
bảng lương; PT ----------------------> 3 -------- ---------------------> 2
PT;GNT ------------------------------> 2 (kết quả này đúng)
PT;5892 ------------------------------> 2 (kết quả này đúng)

Như vậy chỉ có 3 trường hợp trên thì đếm chưa đúng
Thầy giúp em , em cảm nhiều.
 
Upvote 0
Bạn nên đưa file lên & iêu cầu như từ đầu í;

Làm mới dễ hơn sửa file cũ. . . . .
 
Upvote 0
Em gởi file lên, trong file em có thuyết minh
Em cảm ơn

Thử sửa code thành vầy xem:
Mã:
Function vCount(ByVal sNumber As String) As Long
  Dim tmp, arr, tmpArr, lCount As Long, item
  On Error Resume Next
  tmp = Replace(sNumber, ",", ";")
  tmp = Replace(tmp, ".", ";")
  If InStr(1, tmp, ";") Then
    arr = Split(tmp, ";")
    lCount = UBound(arr) + 1
    For Each item In arr
      If InStr(1, item, "-") Then
        tmpArr = Split(item, "-")
        lCount = lCount + tmpArr(1) - tmpArr(0)
      End If
    Next
  ElseIf InStr(1, tmp, "-") Then
    tmpArr = Split(tmp, "-")
    lCount = lCount + tmpArr(1) - tmpArr(0) + 1
  ElseIf Len(tmp) Then
    lCount = 1
  End If
  vCount = lCount
End Function
Bài này làm từ đời nào rồi, giờ cũng quên tuốt
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom