Trích xuất dữ liệu số trong chuỗi kí tự

Liên hệ QC
Bác ơi, nếu mình chỉ muốn tìm bằng cách nhập vào tên loại cần tìm (giả sử là "M", hoặc "M,") ở ô R10 thôi, các ô còn lại mình sẽ không nhập
Vậy làm sao phân biệt giữa M và M, khi bạn nhập mỗi M thì M, nó cũng là M mà.
 
Vậy làm sao phân biệt giữa M và M, khi bạn nhập mỗi M thì M, nó cũng là M mà.
Qui luật của mình là có 3 dạng chuỗi cần tách lấy số:
1. 1 kí tự chữ riêng lẻ
2. 1 kí tự chữ + 1 kí tự (dấu phẩy dưới ","; dấu phẩy trên "'"; và dấu 2 chấm ":" đứng liền sau kí tự
3. 1 hoặc 2 kí tự chữ + số (như D20 hoặc RG20 - bác có thể xem những file mình chuyển) (chuỗi này được ngăn cách ở trước bới dấu "/" - bác có thể xem file minh họa mình đã chuyển)

Vì vậy, trong 1 chuỗi gốc (cột O) có thể sẽ có trường hợp các tổ hợp như trên đều xuất hiện. Thế mới khổ bác ah. ^_^!
 
Vậy làm sao phân biệt giữa M và M, khi bạn nhập mỗi M thì M, nó cũng là M mà.
Mình sẽ đếm M phẩy trước, đếm xong thì loại bỏ, phần còn lại chỉ có M không phẩy.

Nguyên tắc chung cũng vậy mà: Tìm/ lọc từ chi tiết tới cái chi tiết ít hơn.
 
Bác snow và mọi người xem ý tưởng dưới của mình như nào nhé:
Tìm chuỗi (cần tách số ở ô R10) bắt đầu từ kí tự đầu tiên trong chuỗi gốc trở đi, gặp chuỗi giống với chuỗi cần tìm => Tiến hành kiểm tra liền sau chuỗi này là dạng phẩy dưới/phẩy trên/dấu 2 chấm => loại bỏ. Nếu không phải 1 trong 3 loại kí tự đó thì xác nhận là chuỗi giống với chuỗi cần tách số => tiến hành cộng dồn cho đến khi hết chuỗi gốc => xuất giá trị đã cộng dồn cuối cùng.
 
Bác snow và mọi người xem ý tưởng dưới của mình như nào nhé:
Tìm chuỗi (cần tách số ở ô R10) bắt đầu từ kí tự đầu tiên trong chuỗi gốc trở đi, gặp chuỗi giống với chuỗi cần tìm => Tiến hành kiểm tra liền sau chuỗi này là dạng phẩy dưới/phẩy trên/dấu 2 chấm => loại bỏ. Nếu không phải 1 trong 3 loại kí tự đó thì xác nhận là chuỗi giống với chuỗi cần tách số => tiến hành cộng dồn cho đến khi hết chuỗi gốc => xuất giá trị đã cộng dồn cuối cùng.
Viết một cái UDF mà xài, loại này chỉ có mình bạn xài nên ít người viết.
 
UDF là hàm tự tạo, ví dụ
= Mysumif("2M3M,MM,","M")
Kết quả =3
= Mysumif("2M3M,MM,","M,")
Kết quả =4
Mình đang cần sự giúp đỡ từ bác snow và mọi người để có thể tìm ra được giải pháp nhanh chóng nhất vì sắp tới hạn nộp bài, nếu có thời gian mình sẽ tìm hiểu về cái này chứ giờ mà em hí hoáy cái này chắc tới sang năm cũng chưa có bài để nộp mất :(
 
Mình đang cần sự giúp đỡ từ bác snow và mọi người để có thể tìm ra được giải pháp nhanh chóng nhất vì sắp tới hạn nộp bài, nếu có thời gian mình sẽ tìm hiểu về cái này chứ giờ mà em hí hoáy cái này chắc tới sang năm cũng chưa có bài để nộp mất :(
Bây giờ mới tháng Tư. Có đến tám tháng để học mà cũng sợ. Thiếu tự tin vậy thì thôi học quách.
 
^_^!,

Hic, không phải bài tập của học sinh, sinh viên đâu các bác mà là hồ sơ khối lượng hoàn công của công trình. Chứ bài vở thì mình chả ngán, lúc trước 1 học kì chỉ đi học đúng 1 buổi đầu tiên, và 1 buổi thi ^_^
 
Qui luật của mình là có 3 dạng chuỗi cần tách lấy số:
1. 1 kí tự chữ riêng lẻ
2. 1 kí tự chữ + 1 kí tự (dấu phẩy dưới ","; dấu phẩy trên "'"; và dấu 2 chấm ":" đứng liền sau kí tự
3. 1 hoặc 2 kí tự chữ + số (như D20 hoặc RG20 - bác có thể xem những file mình chuyển) (chuỗi này được ngăn cách ở trước bới dấu "/" - bác có thể xem file minh họa mình đã chuyển)

Vì vậy, trong 1 chuỗi gốc (cột O) có thể sẽ có trường hợp các tổ hợp như trên đều xuất hiện. Thế mới khổ bác ah. ^_^!
Nếu trường hợp 3 luôn ở sau dấu "/" thì có thể sài code này:
Mã:
Function ssum(ByVal str As String, ByVal sptn As String) As Long
Dim macth
Static regexp As Object
If regexp Is Nothing Then Set regexp = CreateObject("vbscript.regexp")
regexp.Global = True
regexp.Pattern = "(\d*)" & IIf(Len(sptn) = 1, sptn & "(?=[^\:\,\'])", sptn)
If regexp.test(str) Then
    For Each macth In regexp.Execute(str)
        If macth.submatches(0) = Empty Then
            ssum = ssum + 1
        Else
            ssum = ssum + Val(macth.submatches(0))
        End If
    Next
End If
End Function
Nhập công thức ở ô R12=ssum($O12,R$10) rồi kéo cho cả bảng
 

File đính kèm

  • 1F.xlsb
    111.5 KB · Đọc: 13
Lần chỉnh sửa cuối:
>.. 1 học kì chỉ đi học đúng 1 buổi đầu tiên, và 1 buổi thi ^_^
tiết đầu tiên: học được các từ pơ-rô, cao thủ, sư phụ, thanh
tiết thi: dùng điện thoại chụp đề thi, gởi các diễn đàn xin bài giải. Tuỳ theo nhận được bài giải nhanh hay chậm mà đạt từ 0 đến 10 điểm.

Cứ căn cứ theo chỗ trên thì:

... nếu có thời gian mình sẽ tìm hiểu về cái này chứ giờ mà em hí hoáy cái này chắc tới sang năm cũng chưa có bài để nộp mất :(
"mình sẽ tìm hiểu": Hứa cuội.

Chỉ tin được cái câu "tới sang năm", còn cái chỗ "hí hoáy" là nói dóc.
Hay người ta nói "hí hoáy" theo nghĩa mỗi tháng bỏ ra học 1 giờ?
 
Lần chỉnh sửa cuối:
Nếu trường hợp 3 luôn ở sau dấu "/" thì có thể sài code này:
Mã:
Function ssum(ByVal str As String, ByVal sptn As String) As Long
Dim macth
Static regexp As Object
If regexp Is Nothing Then Set regexp = CreateObject("vbscript.regexp")
regexp.Global = True
regexp.Pattern = "(\d*)" & IIf(Len(sptn) = 1, sptn & "(?=[^\:\,\'])", sptn)
If regexp.test(str) Then
    For Each macth In regexp.Execute(str)
        If macth.submatches(0) = Empty Then
            ssum = ssum + 1
        Else
            ssum = ssum + Val(macth.submatches(0))
        End If
    Next
End If
End Function
Nhập công thức ở ô R12=ssum($O12,R$10) rồi kéo cho cả bảng
Cám ơn bác nhé, mình đã thử và hiện thời code của bác là giải pháp tốt nhất mình nhận được. Mình cũng rất cám ơn bác snow25 đã tận tình hỗ trợ giải quyết giúp mình một số các bài toán từ đầu bài đến giờ. Cám ơn các bạn trên diễn đàn đã cùng tham gia đóng góp ý kiến & đề xuất.

Cám ơn bác VetMini đã có những nhận định hơi xa rời chủ đề, tuy nhiên mình rất không vui khi đọc những nhận định này. Mình hi vọng diễn đàn là nơi hỗ trợ cho những người thật sự cần giúp đỡ (nếu mình không thật sự cần, có lẽ mình đã không post bài này trên diễn đàn...lol). Và diễn đàn này mình không nghĩ là nơi dành cho những lời nói có tính chọc ngoáy. Có lẽ những lời của bác sẽ đúng với một số người nào đó, nhưng nó không có nghĩa là sẽ đúng cho tất cả. Hi vọng, bác sẽ thay đổi trong cách nhìn nhận cũng như cẩn thận hơn khi post bài. Xin lỗi bác, nếu như mình có nói quá lời nhé. (Mình cũng xin gửi lời xin lỗi đến các thành viên quản trị diễn đàn, các bạn theo dõi chủ đề mình mở vì những bài post của mình làm ảnh hưởng đến mọi người nhé. Đa tạ các bạn ^_^)
 
...
Cám ơn bác VetMini đã có những nhận định hơi xa rời chủ đề, tuy nhiên mình rất không vui khi đọc những nhận định này. ...
Không cần phải cảm ơn trong cái nghiến răng đâu.
Người ở diễn đàn này lâu đều biết tôi có tính phách lối (cứ hỏi đi, mọi người sẽ chứng cho). Bây giờ gặp kẻ còn phách hơn mình về trình độ học thì tôi ghen tức vậy thôi.

(nhưng tôi nhớ là khi khoe trình độ thông minh của mình những ngày còn đi học thì tôi không có hỏi xin ngừoi khác làm giùm từ a đến z)
 
Không cần phải cảm ơn trong cái nghiến răng đâu.
Người ở diễn đàn này lâu đều biết tôi có tính phách lối (cứ hỏi đi, mọi người sẽ chứng cho). Bây giờ gặp kẻ còn phách hơn mình về trình độ học thì tôi ghen tức vậy thôi.

(nhưng tôi nhớ là khi khoe trình độ thông minh của mình những ngày còn đi học thì tôi không có hỏi xin ngừoi khác làm giùm từ a đến z)
LOL,

Điều nào nói cho bạn biết rằng: tôi đang khoe trình độ thông minh của mình vậy, tôi nhớ rằng mình không hề đề cập đến nó; tôi chỉ nhớ có đề cập chuyện đi đến trường 2 lần trong 1 học kì, nhưng không đề cập gì đến chuyện qua môn hay được maximum điểm cả. Bạn khiến tôi phải công nhận bạn là một người thông minh ^_^

Một lần nữa xin lỗi tất cả các bạn vì đoạn hội thoại đầy ngẫu hứng giữa mình và bác Vetmini nhé. Xin phép kết thúc chủ đề.
(Nếu bác Vetmini có điều gì cần trao đổi thì bác cứ nhắn vào hộp thư riêng của tôi nhé, tránh làm ảnh hưởng không hay đến những người khác.)
 
Lần chỉnh sửa cuối:
...(Nếu bác Vetmini có điều gì cần trao đổi thì bác cứ nhắn vào hộp thư riêng của tôi nhé, tránh làm ảnh hưởng không hay đến những người khác.)
Mắc mớ gì ảnh hưởng không hay đến người khác. Sợ họ bắt chước theo cách học của mình à?
Tôi vốn không muốn nói chuyện tiếng Anh với người Việt. Chớ giở cái mớ Tây bồi với tôi.
Hồi còn đi học tiếng Anh, tôi học đủ tiết, và còn qua lớp khác học thêm nữa. Muốn khoe hàng thì tôi cho biết: tôi nói, viết tiếng Anh còn chuẩn hơn tiếng Việt.
 
Các bác cho em hỏi.
Ô A1 em có 1+2+3+0.5+4
Ô B1 em muốn tính tổng của A1 thì làm sao ạ?
Em cám ơn.
 
Web KT
Back
Top Bottom