Xin giúp mình hàm đếm trong một chuỗi ký tự

Liên hệ QC

nguyendu277

Thành viên chính thức
Tham gia
7/1/11
Bài viết
51
Được thích
5
Ví dụ mình có một chuỗi số như sau:

1,5,7,9-20,22,25,27-35,37,38,40-50

Xin các bạn giúp mình viết hàm đếm để cho kết quả là: 39

Mỗi số cách nhau bằng dấu phẩy và dấu gạch ngang hiểu là nó liền từ số đến số. và trong chuỗi này có thể phát sinh ký tự trống và hàm bỏ qua không đếm ký tự trống đó.

Mình xin cảm ơn các bạn.
 

File đính kèm

  • Book1.xls
    15.5 KB · Đọc: 9
Ví dụ mình có một chuỗi số như sau:

1,5,7,9-20,22,25,27-35,37,38,40-50

Xin các bạn giúp mình viết hàm đếm để cho kết quả là: 39

Mỗi số cách nhau bằng dấu phẩy và dấu gạch ngang hiểu là nó liền từ số đến số. và trong chuỗi này có thể phát sinh ký tự trống và hàm bỏ qua không đếm ký tự trống đó.

Mình xin cảm ơn các bạn.
Tôi viết hàm nay cho dữ liệu bạn đã đưa lên nên chưa tổng quát. Thôi thì đưa sao làm vậy bạn Test thử.
--------------------------------
Cú Pháp: =Dem(ô cần đếm)
------------------------------------------------------
Mã:
Public Function Dem(cell As Range) As Long
Dim arr, d As Long, kq(), i As Long, tmp
arr = Split(cell, ",")
For i = 0 To UBound(arr)
    If Len(Trim(arr(i))) < 3 Then
        d = d + 1
    Else
        tmp = Split(arr(i), "-")
        d = d + tmp(1) - tmp(0) + 1
    End If
Next i
        Dem = d
End Function
 

File đính kèm

  • Dem_chuot0106.xls
    68.5 KB · Đọc: 23
Lần chỉnh sửa cuối:
Mời các bạn tổng quát hàm thêm chút nữa cho chủ topic.
----------------------------------------------------------------------
Đã hòm hòm hơn!
Mã:
Public Function Dem(cell As Range) As Long
Dim arr, d As Long, kq(), i As Long, tmp
arr = Split(cell, ",")
For i = 0 To UBound(arr)
    If InStr(1, arr(i), "-") = 0 Then
        d = d + 1
    Else
        tmp = Split(arr(i), "-")
        d = d + tmp(1) - tmp(0) + 1
    End If
Next i
        Dem = d
End Function
 

File đính kèm

  • Dem_chuot0106_New.xls
    72.5 KB · Đọc: 8
Lần chỉnh sửa cuối:
Cám ơn bạn #chuot0106 nhiều nhé, mình test thấy đáp ứng tốt ạ, mình hỏi thêm là với bài toán này chỉ cần dùng hàm của Excel mà không cần dùng tới VBA liệu có thể giải quyết được không, kể cả phải mở thêm cột phụ ạ.
 
Cám ơn bạn #chuot0106 nhiều nhé, mình test thấy đáp ứng tốt ạ, mình hỏi thêm là với bài toán này chỉ cần dùng hàm của Excel mà không cần dùng tới VBA liệu có thể giải quyết được không, kể cả phải mở thêm cột phụ ạ.
Được nhưng số cột phụ rất lớn (tùy thuộc số biểu thức trong ô của bạn).
 
Mời các bạn tổng quát hàm thêm chút nữa cho chủ topic.
----------------------------------------------------------------------
Đã hòm hòm hơn!
Mã:
Public Function Dem(cell As Range) As Long
Dim arr, d As Long, kq(), i As Long, tmp
arr = Split(cell, ",")
For i = 0 To UBound(arr)
    If InStr(1, arr(i), "-") = 0 Then
        d = d + 1
    Else
        tmp = Split(arr(i), "-")
        d = d + tmp(1) - tmp(0) + 1
    End If
Next i
        Dem = d
End Function

Cách đếm từ a đến b (a-b) hơi rườm rà. Làm gọn thì chỉ cần evaluate.
các số từ a đến b = -evaluate("a-b")+1

Mã:
[COLOR=#008000]' hàm đếm các số và dãy số trong một chuỗi
[/COLOR]Function dem(ByVal s As String) As Long
Dim e As Variant
For Each e In Split(Replace(s, " ", ""), ",")
dem = dem + 1
If InStr(e, "-") Then dem = dem - Application.Evaluate(CStr(e))
Next e
End Function
 
Cách đếm từ a đến b (a-b) hơi rườm rà. Làm gọn thì chỉ cần evaluate.
các số từ a đến b = -evaluate("a-b")+1

Mã:
[COLOR=#008000]' hàm đếm các số và dãy số trong một chuỗi
[/COLOR]Function dem(ByVal s As String) As Long
Dim e As Variant
For Each e In Split(Replace(s, " ", ""), ",")
dem = dem + 1
If InStr(e, "-") Then dem = dem - Application.Evaluate(CStr(e))
Next e
End Function
Quả thật các thuật toán của Bác VetMini bao giờ cũng tối ưu.
 
Cột phụ lớn cũng được anh ạ! Mong anh giúp đỡ!
Mình hướng dẫn bạn tự làm chứ cột phụ nhiều quá mình không làm nổi? Với ví dụ của bạn (1,5,7,9-20,22,25,27-35,37,38,40-50)mình thực hiện khoảng 22 cột phụ. Cột 1 tách số 1 ra dùng làm Left cắt từ ký tự đầu đến dấu "," (dùng hàm Find để tìm dấu phẩy), cột 2 tách số 5 ra dùng màm Mid cắt từ vị trí dấu phẩy thứ nhất đến dấu phẩy thứ 2 (cũng dùng hàm Find để tìm dấu phẩy) ... đến cột phụ thứ 12 thì tính tổng cột 1, ... cột phụ 15 thì tách số 20 ra và trừ đi số 9 (dùng làm Left và hàm Right để tách, căn cứ vào dấu "-")... Nghe nói thôi đã ớn rồi nói gì đến việc làm, vẫn thực hiện được nếu bạn kiên nhẫn.
 
Mình hướng dẫn bạn tự làm chứ cột phụ nhiều quá mình không làm nổi? Với ví dụ của bạn (1,5,7,9-20,22,25,27-35,37,38,40-50)mình thực hiện khoảng 22 cột phụ. Cột 1 tách số 1 ra dùng làm Left cắt từ ký tự đầu đến dấu "," (dùng hàm Find để tìm dấu phẩy), cột 2 tách số 5 ra dùng màm Mid cắt từ vị trí dấu phẩy thứ nhất đến dấu phẩy thứ 2 (cũng dùng hàm Find để tìm dấu phẩy) ... đến cột phụ thứ 12 thì tính tổng cột 1, ... cột phụ 15 thì tách số 20 ra và trừ đi số 9 (dùng làm Left và hàm Right để tách, căn cứ vào dấu "-")... Nghe nói thôi đã ớn rồi nói gì đến việc làm, vẫn thực hiện được nếu bạn kiên nhẫn.
Nghe bạn nói đúng là thấy oải luôn rồi! Sao phức tạp vậy. Muốn tách thì dùng Text to Columns vài lần có nhanh hơn không?
 
Mình hướng dẫn bạn tự làm chứ cột phụ nhiều quá mình không làm nổi? Với ví dụ của bạn (1,5,7,9-20,22,25,27-35,37,38,40-50)mình thực hiện khoảng 22 cột phụ. Cột 1 tách số 1 ra dùng làm Left cắt từ ký tự đầu đến dấu "," (dùng hàm Find để tìm dấu phẩy), cột 2 tách số 5 ra dùng màm Mid cắt từ vị trí dấu phẩy thứ nhất đến dấu phẩy thứ 2 (cũng dùng hàm Find để tìm dấu phẩy) ... đến cột phụ thứ 12 thì tính tổng cột 1, ... cột phụ 15 thì tách số 20 ra và trừ đi số 9 (dùng làm Left và hàm Right để tách, căn cứ vào dấu "-")... Nghe nói thôi đã ớn rồi nói gì đến việc làm, vẫn thực hiện được nếu bạn kiên nhẫn.

Mình đã dùng hàm
=IF(A1="";0;LEN(A1)-LEN(SUBSTITUTE(A1;",";""))+1)
Để đếm dấu phẩy trong 1 chuỗi ở ô ví dụ là A1.

Nhưng lại không nghĩ ra giải pháp nào cho việc cộng thêm |số cuối trừ số đầu cộng thêm 1| khi giữa chúng là ký tự "-" @#!^%
Có lẽ dùng VBA như các bạn hướng dẫn là gọn nhẹ nhất nhưng quả thật là mình không biết nhiều về VBA lắm nên vẫn muốn dùng hàm excel thông thường hơn nếu không phải tạo quá nhiều cột phụ -\\/.
 
Mình đã dùng hàm
=IF(A1="";0;LEN(A1)-LEN(SUBSTITUTE(A1;",";""))+1)
Để đếm dấu phẩy trong 1 chuỗi ở ô ví dụ là A1.

Nhưng lại không nghĩ ra giải pháp nào cho việc cộng thêm |số đầu trừ số cuối cộng thêm 1| khi giữa chúng là ký tự "-" @#!^%
Có lẽ dùng VBA như các bạn hướng dẫn là gọn nhẹ nhất nhưng quả thật là mình không biết nhiều về VBA lắm -\\/.
Biết thì tốt nhưng không biết cũng không ảnh hưởng lắm! Bị sao lại lên đây "La Làng"--=0--=0--=0--=0
 
Nghe bạn nói đúng là thấy oải luôn rồi! Sao phức tạp vậy. Muốn tách thì dùng Text to Columns vài lần có nhanh hơn không?
Đúng, nhưng làm sao biết trong ô bạn ấy có dữ liệu bao nhiêu mà Text to Columns chứ, mình phân tích cho bạn ấy thấy là cách dùng công thức là không ổn, chứ theo mình thì dạy gì dùng công thức...--=0 --=0 --=0
 
Ví dụ mình có một chuỗi số như sau:

1,5,7,9-20,22,25,27-35,37,38,40-50

Xin các bạn giúp mình viết hàm đếm để cho kết quả là: 39

Mỗi số cách nhau bằng dấu phẩy và dấu gạch ngang hiểu là nó liền từ số đến số. và trong chuỗi này có thể phát sinh ký tự trống và hàm bỏ qua không đếm ký tự trống đó.

Mình xin cảm ơn các bạn.

Nếu đúng viết theo mẫu này thì công thức cũng được, nhưng phải kết hợp với Name. Không cần VBA đâu. Nếu bạn còn cần giải pháp thì tôi sẽ gửi lên cho.
 
Nếu đúng viết theo mẫu này thì công thức cũng được, nhưng phải kết hợp với Name. Không cần VBA đâu. Nếu bạn còn cần giải pháp thì tôi sẽ gửi lên cho.
ở đây có nêu rõ

Mình đã dùng hàm
=IF(A1="";0;LEN(A1)-LEN(SUBSTITUTE(A1;",";""))+1)
Để đếm dấu phẩy trong 1 chuỗi ở ô ví dụ là A1.

Nhưng lại không nghĩ ra giải pháp nào cho việc cộng thêm |số cuối trừ số đầu cộng thêm 1| khi giữa chúng là ký tự "-" @#!^%
Có lẽ dùng VBA như các bạn hướng dẫn là gọn nhẹ nhất nhưng quả thật là mình không biết nhiều về VBA lắm nên vẫn muốn dùng hàm excel thông thường hơn nếu không phải tạo quá nhiều cột phụ -\\/.

nên bạn cứ gửi công thức lên là đúng với mong muốn của người hỏi . Bản thân tôi cũng muốn xem cách dùng công thức cho bài này để xem có giống cách của tôi làm không .
 
ở đây có nêu rõ

nên bạn cứ gửi công thức lên là đúng với mong muốn của người hỏi . Bản thân tôi cũng muốn xem cách dùng công thức cho bài này để xem có giống cách của tôi làm không .

Cứ đưa giải pháp của bạn lên đi, tôi đang mắc chỗ dấu trừ, chưa xử lý được. Vì đầu tiên tôi nghĩ là dấu trừ bình thường, về sau thì hóa ra nó là dấu gạch nối (nối tiếp các giá trị), khi đó bài toán phức tạp thêm, đang nghĩ xem có giải pháp ngắn gọn hơn không cột phụ.
 
Cứ đưa giải pháp của bạn lên đi, tôi đang mắc chỗ dấu trừ, chưa xử lý được. Vì đầu tiên tôi nghĩ là dấu trừ bình thường, về sau thì hóa ra nó là dấu gạch nối (nối tiếp các giá trị), khi đó bài toán phức tạp thêm, đang nghĩ xem có giải pháp ngắn gọn hơn không cột phụ.

chưa làm xong mà nói như đúng rồi

Nếu đúng viết theo mẫu này thì công thức cũng được, nhưng phải kết hợp với Name. Không cần VBA đâu. Nếu bạn còn cần giải pháp thì tôi sẽ gửi lên cho.

vậy tôi nể bạn rồi .
 
chưa làm xong mà nói như đúng rồi

vậy tôi nể bạn rồi .

Cám ơn bạn, tôi hỏi người chủ topic không hỏi bạn nhé. Bạn xen chuyện vào làm chi rui để tự thắc mắc. Còn bài dạng này không dùng VBA thì cũng phải dùng Name thì mới gọn. Gợi ý cho người hỏi cũng là cách để họ tìm giải pháp.
Tôi không thích kiểu nói chuyện xen ngang.
 
Cám ơn bạn, tôi hỏi người chủ topic không hỏi bạn nhé. Bạn xen chuyện vào làm chi rui để tự thắc mắc. Còn bài dạng này không dùng VBA thì cũng phải dùng Name thì mới gọn. Gợi ý cho người hỏi cũng là cách để họ tìm giải pháp.
Tôi không thích kiểu nói chuyện xen ngang.

Bài này nếu chỉ cần gợi ý mà chủ topic này làm được thì chắc mấy người ở trên kia không cần xài tới VBA nhỉ ?
mà ngoài VBA thì bạn có cái gì để gợi ý cho người ta nhỉ ? bạn đang mải ba hoa khoác lác về những điều mình chưa làm được cơ mà ?

Cứ đưa giải pháp của bạn lên đi, tôi đang mắc chỗ dấu trừ, chưa xử lý được. Vì đầu tiên tôi nghĩ là dấu trừ bình thường, về sau thì hóa ra nó là dấu gạch nối (nối tiếp các giá trị), khi đó bài toán phức tạp thêm, đang nghĩ xem có giải pháp ngắn gọn hơn không cột phụ.
 
Bài này nếu chỉ cần gợi ý mà chủ topic này làm được thì chắc mấy người ở trên kia không cần xài tới VBA nhỉ ?
mà ngoài VBA thì bạn có cái gì để gợi ý cho người ta nhỉ ? bạn đang mải ba hoa khoác lác về những điều mình chưa làm được cơ mà ?

Tôi không bahoa, nếu bahoa thì phải như người nói làm được mà không đưa lên (sợ giống với không giống người khác).

Tôi đã làm được, nhưng khi nhìn lại kiểm tra lại lần nữa, thì phát hiện dấu "-" là gạch nối nên đổi lại phương án. Có vậy thui.

Ngoài VBA có cái gì thì đó là việc của tôi, chẳng liên quan đến những người tọc mạch.

Tôi không thích người khác xen ngang, nói vô chứng cớ, suy bụng ta ra bụng người. Nếu chủ topic cần sẽ quay lại, và tôi cần hỏi rõ thêm về vấn đề của bài toán. Chúng ta nên tập trung vấn đề giải quyết , không phải ngồi đó mà suy luận.
 
Web KT
Back
Top Bottom