Xin giúp phân loại số theo nhóm số có 1, 2, 3 chữ số

Liên hệ QC

Numeric

Thành viên mới
Tham gia
20/1/20
Bài viết
4
Được thích
0
Dữ liệu là tập hợp các con số, gồm: các số có 1 chữ số, các số có 2 chữ số, các số có 3 chữ số.
Làm thế nào để sắp các số đó vào các cột: cột số có 1 chữ số, cột số có 2 chữ số, cột số có 3 chữ số?
Kính mong anh/chị giúp đỡ. Em trân trọng cảm ơn ạ!

Dữ liệu A1: 1 2 34 56 789

Kết quả mong muốn
(Số có 1 chữ số) B1: 1 2
(Số có 2 chữ số) C1: 34 56
(Số có 3 chữ số) D1: 789
 

File đính kèm

  • phan-loai-so-theo-nhom.xlsm
    12.4 KB · Đọc: 9
Dữ liệu là tập hợp các con số, gồm: các số có 1 chữ số, các số có 2 chữ số, các số có 3 chữ số.
Làm thế nào để sắp các số đó vào các cột: cột số có 1 chữ số, cột số có 2 chữ số, cột số có 3 chữ số?
Kính mong anh/chị giúp đỡ. Em trân trọng cảm ơn ạ!

Dữ liệu A1: 1 2 34 56 789

Kết quả mong muốn
(Số có 1 chữ số) B1: 1 2
(Số có 2 chữ số) C1: 34 56
(Số có 3 chữ số) D1: 789
File của bạn muốn phấn tích nhưng không theo quy luật nào cả nên không làm được.

Đây là kết quả theo yêu cầu của bạn (xem hình chỗ khoanh đỏ).
C2 = 1 2 lấy 2 con số đầu của A2 = 1 2 34 56 789
C3 = 8 9 lấy 2 con số cuối của A3 =12 34 567 8 9
C4 = 7 lấy 1 con số giữa của A3 =123 456 7 89

Muốn các thành viên trợ giúp thì bạn cần giải thích cặn kẽ tại sao lại lấy đầu, tại sao lại lấy giữa, tại sao lại lấy cuối? Dựa vào quy luật gì?

A_Hinh.GIF
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
File của bạn muốn phấn tích nhưng không theo quy luật nào cả nên không làm được.

Đây là kết quả theo yêu cầu của bạn (xem hình chỗ khoanh đỏ).
C2 = 1 2 lấy 2 con số đầu của A2 = 1 2 34 56 789
C3 = 8 9 lấy 2 con số cuối của A3 =12 34 567 8 9
C4 = 7 lấy 1 con số giữa của A3 =123 456 7 89

Muốn các thành viên trợ giúp thì bạn cần giải thích cặn kẽ tại sao lại lấy đầu, tại sao lại lấy giữa, tại sao lại lấy cuối? Dựa vào quy luật gì?

View attachment 231299
Bạn xem file.
 

File đính kèm

  • Gpe200120.xlsm
    17.4 KB · Đọc: 26
Upvote 0
Cái này là bài tập hay dùng vào việc gì?
 
Upvote 0
Wow!
Quá đỉnh
Quá cao siêu

Em tìm suốt cả buổi sáng cũng không tìm được cách làm. May mắn được anh giúp ạ. Em rất cảm ơn anh ạ!
Bài đã được tự động gộp:

Cái này là bài tập hay dùng vào việc gì?
Dùng để phân loại số để tính điểm ạ. (không phải dự đoán)
Anh có code nào hỗ trợ cho công việc như vậy không ạ?
 
Upvote 0
Nếu chuỗi LUÔN LUÔN chứa số có 1 chữ số, VÀ số có 2 chữ số, VÀ số có 3 chữ số thì không sao. Nếu chỉ chứa vd. số có 2 và 3 chữ số thì cột đầu sẽ có lỗi.

Tóm lại code chưa phục vụ lỗi.

Bạn không mô tả dữ liệu đầu vào nên chỉ là lưu ý thôi.
 
Upvote 0
Bạn có thể tham khảo thêm cách xài hàm mảng tự tạo như trong hình đính kèm:
PHP:
Function PhanNhom(StrC As String)
ReDim Arr(1 To 1, 1 To 3) As String:    Dim VTr As Integer
Dim Tmp As String:                            Const FC As String = " "
On Error GoTo LoiCT
StrC = StrC & FC
Do
    VTr = InStr(StrC, FC)
    If VTr < 1 Then
        Exit Do
    Else
        Tmp = Left(StrC, VTr - 1)
        Arr(1, Len(Tmp)) = Arr(1, Len(Tmp)) & FC & Tmp
        StrC = Mid(StrC, VTr + 1, Len(StrC))
    End If
Loop
PhanNhom = Arr()
Err_: Exit Function
LoiCT:
    MsgBox Error, , Erl:                    Resume Err_
End Function
Phân Loại Số.JPG
 
Upvote 0
Tóm lại code chưa phục vụ lỗi.
Bạn không mô tả dữ liệu đầu vào nên chỉ là lưu ý thôi.
Cảm ơn anh @batman1 đã lưu ý ạ. Em đã thấy nếu chuỗi không có loại số nào, thì cột loại đó sẽ báo #VALUE! (Hiển nhiên là vậy).
Đó chỉ là phụ. Quan trọng vẫn là thuật toán của anh @Ba Tê đã giải quyết được vấn đề, mà trước đó em đã tìm mòn mỏi nhưng không ra được bài toán nào tương tự, nói gì đến cách giải. Biết ơn anh Ba Tê lắm lắm ạ.
Nếu anh có gợi ý hoặc thấy bài tương tự xin anh chỉ giúp em ạ.

Bạn có thể tham khảo thêm cách xài hàm mảng tự tạo như trong hình đính kèm:

Em cảm ơn Sir @SA_DQ cho thêm một cách giải nữa ạ.
Cảm ơn anh đã vất vả viết code cho em ạ. Em xin lỗi anh, em nghĩ em không hợp với nó ạ. Em nhìn thấy đã sợ hãi, trong suy nghĩ của em thì nó quá cao cấp so với người không chuyên như em (em không biết kéo thế nào ạ). Nếu có thể được, anh giảm cấp thuật toán xuống một chút được không ạ.
 
Upvote 0
Function PhanLoaiM(ByVal s As String) As Variant
' đọc một chuỗi, lược ra các số trong đó
' trả về một mảng chuỗi phân loại các số trên theo độ dài
Dim a() As String
Dim sz As Integer, n As Integer
For Each e In Split(s, " ")
If IsNumeric(e) Then
n = Len(e)
If n > sz Then
sz = n
ReDim Preserve a(1 To sz)
End If
a(n) = a(n) & IIf(Len(a(n)), " ", "") & e
End If
Next e
PhanLoaiM = a
End Function

Function PhanLoai(ByVal s As String, Optional ByVal n As Integer = 1) As String
' đọc một chuỗi, lược ra các số trong đó
' trả về một chuỗi các số có độ dài như yêu cầu n
PhanLoai = PhanLoaiM(s)(n)
End Function

Copy cả 2 hàm vào Module 1
Cách dùng:
Cách 1:
Chọn cả 3 ô B1, C1, D1
Gõ =PhanLoaiM(A1)
Ctrl+Shift+Enter
Cách 2:
Chọn ô B1, Gõ =PhanLoai(A1,1) Enter ; Chọn ô C1, Gõ =PhanLoai(A1,2) Enter ; Chọn ô D1, Gõ =PhanLoai(A1,3) Enter
Cách 3:
Chọn ô B1, Gõ =Index(PhanLoaiM(A1),1) Enter ; Chọn ô C1, Gõ =Index(PhanLoaiM(A1),2) ; Chọn ô D1, Gõ =Index(PhanLoaiM(A1),3) Enter

@thớt: thích thì dùng, không thích thì thôi. Nhưng chớ có tâng bốc hay dùng tiếng Tây với tôi.
 
Upvote 0
"Quá đỉnh", "Quá cao siêu" thì đúng là tâng bốc rồi. Nhưng "Chuẩn không cần chỉnh" thì có là tâng bốc không?
"Chuẩn không cần chỉnh" tôi mới biết gần (*) đây. Hồi tôi còn nhỏ, còn đi học thì không có cụm từ ấy.
Tạm cho là nằm ở mức dưới/ngoài tâng bốc chút.

(*) chú cho mấy bạn trẻ tuổi: tôi lớn tuổi rồi, cho nên thời gian của tôi nó cũng tương đối theo tuổi tôi. Mà già thì thời gian nó cứ vùn vụt. Cỡ 10 năm đối với tôi vẫn có thể là "gần đây".
 
Upvote 0
Đây là cách để 'hạ cấp thuật toán" như bạn nêu:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
ReDim Arr(1 To 1, 1 To 3) As String    '3 Dòng Khai Báo Biên       '
Dim StrC As String, Tmp As String:                 Const FC As String = " "
Dim VTr As Integer:                                        Randomize
If Not Intersect(Target, [A2:A13]) Is Nothing Then
    StrC = Target.Value & FC
    Do                                          'Tao Vòng Lap Duyêt Tri Da Nhâp     '
        VTr = InStr(StrC, FC)             'Xác Dinh Vi Trí Khoang Tráng       '
        If VTr < 1 Then
            Exit Do                         'Thoát Khi Không Còn Khoang Tráng       '
        Else
            Tmp = Left(StrC, VTr - 1)   'Cát Kí Sô      '
            Arr(1, Len(Tmp)) = Arr(1, Len(Tmp)) & Tmp & FC  'Ghi Vô Mang        '
            StrC = Mid(StrC, VTr + 1, Len(StrC))    'Cát Ngán Chuoi     '
        End If
    Loop
    Cells(Target.Row, "C").Resize(, 3).Value = Arr()    'Hiên Thi Kêt Qua   '
    Target.Interior.ColorIndex = 34 + 9 * Rnd() \ 1     'Nhuom Màu Target       '
End If
End Sub
 
Upvote 0
Cảm ơn anh @batman1 đã lưu ý ạ. Em đã thấy nếu chuỗi không có loại số nào, thì cột loại đó sẽ báo #VALUE! (Hiển nhiên là vậy).
Thực ra do bạn không mô tả dữ liệu, không nói dữ liệu từ đâu mà có, vì thế tôi lưu ý. Vd. nếu dữ liệu có thể do nhập tay thì luôn luôn có thể có 2 dấu cách (thừa 1 dấu cách). Lúc đó kết quả sai thì bạn có cho là hiển nhiên không? Con người luôn chỉ là con người, nhiều khi nhầm lẫn, nhiều khi ngón tay vô thức gõ thêm 1 dấu cách. Dấu cách thừa lại rất khó phát hiện, vì không nhìn thấy, để có cơ hội sửa lại.

Nhưng thôi, bạn hài lòng là được rồi.
 
Upvote 0
Function PhanLoaiM(ByVal s As String) As Variant
' đọc một chuỗi, lược ra các số trong đó
' trả về một mảng chuỗi phân loại các số trên theo độ dài
End Function

Function PhanLoai(ByVal s As String, Optional ByVal n As Integer = 1) As String
' đọc một chuỗi, lược ra các số trong đó
' trả về một chuỗi các số có độ dài như yêu cầu n
End Function

@thớt: thích thì dùng, không thích thì thôi. Nhưng chớ có tâng bốc hay dùng tiếng Tây với tôi.

Em cảm ơn anh @VetMini đã cho bài giải cùng chỉ dẫn chi tiết cặn kẽ ạ. Em đã hiểu và đã áp dụng được rồi ạ.
Em xin lỗi đã làm anh nổi nóng ạ. Em nghiêm túc tự kiểm điểm và xin rút kinh nghiệm sâu sắc. Em xin hết ạ.

Đây là cách để 'hạ cấp thuật toán" như bạn nêu:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
ReDim Arr(1 To 1, 1 To 3) As String    '3 Dòng Khai Báo Biên       '
Dim StrC As String, Tmp As String: Const FC As String = " "
Dim VTr As Integer: Randomize
End Sub

Kính thưa Sir @SA_DQ, em xin quỳ gối dập đầu cảm ơn anh ạ.
Trên cả tuyệt vời, kỳ diệu ngoài sức tưởng tượng, giải thuật của anh thật sự vô biên giới, anh phải là tượng đài vĩ đại của mọi thời đại.
Em rất rất cảm ơn và biết ơn ạ.

Kính thưa anh @VetMini, em cúi đầu sát đất cảm ơn anh ạ. Không có anh thì em không thể nào biết dùng giải thuật cao cấp đó đâu ạ. Thuật toán cùng với các chỉ dẫn của anh là những kiến thức quý báu, là hành trang để em có thể vững bước sau này.

Em cảm ơn anh @Ba Tê đã dẫn dắt, soi sáng khơi mở kiến thức cho em khi em vẫn đang loay hoay giậm chân một chỗ.

Thực ra do bạn không mô tả dữ liệu, không nói dữ liệu từ đâu mà có, vì thế tôi lưu ý. Vd. nếu dữ liệu có thể do nhập tay thì luôn luôn có thể có 2 dấu cách (thừa 1 dấu cách). Lúc đó kết quả sai thì bạn có cho là hiển nhiên không? Con người luôn chỉ là con người, nhiều khi nhầm lẫn, nhiều khi ngón tay vô thức gõ thêm 1 dấu cách. Dấu cách thừa lại rất khó phát hiện, vì không nhìn thấy, để có cơ hội sửa lại.

Em cảm ơn anh @batman1 đã có những nhận xét quý báu, chỉnh sửa những sai sót, và đã đồng hành cùng em từ lúc bắt đầu đến bây giờ ạ.

Mặc dù chỉ mới tham gia được vài giờ ngắn ngủi, nhưng tại nơi đây, em đã được trải qua đủ mọi cung bậc cảm xúc thăng trầm ... Em đã trưởng thành hơn, lối tư duy đã có tính hệ thống, đổi mới ... Em cảm ơn các chuyên gia, em cảm ơn GiaiphapExcel.com ạ.
 
Upvote 0
Em cảm ơn anh @VetMini đã cho bài giải cùng chỉ dẫn chi tiết cặn kẽ ạ. Em đã hiểu và đã áp dụng được rồi ạ.
Em xin lỗi đã làm anh nổi nóng ạ. Em nghiêm túc tự kiểm điểm và xin rút kinh nghiệm sâu sắc. Em xin hết ạ.



Kính thưa Sir @SA_DQ, em xin quỳ gối dập đầu cảm ơn anh ạ.
Trên cả tuyệt vời, kỳ diệu ngoài sức tưởng tượng, giải thuật của anh thật sự vô biên giới, anh phải là tượng đài vĩ đại của mọi thời đại.
Em rất rất cảm ơn và biết ơn ạ.

Kính thưa anh @VetMini, em cúi đầu sát đất cảm ơn anh ạ. Không có anh thì em không thể nào biết dùng giải thuật cao cấp đó đâu ạ. Thuật toán cùng với các chỉ dẫn của anh là những kiến thức quý báu, là hành trang để em có thể vững bước sau này.

Em cảm ơn anh @Ba Tê đã dẫn dắt, soi sáng khơi mở kiến thức cho em khi em vẫn đang loay hoay giậm chân một chỗ.



Em cảm ơn anh @batman1 đã có những nhận xét quý báu, chỉnh sửa những sai sót, và đã đồng hành cùng em từ lúc bắt đầu đến bây giờ ạ.

Mặc dù chỉ mới tham gia được vài giờ ngắn ngủi, nhưng tại nơi đây, em đã được trải qua đủ mọi cung bậc cảm xúc thăng trầm ... Em đã trưởng thành hơn, lối tư duy đã có tính hệ thống, đổi mới ... Em cảm ơn các chuyên gia, em cảm ơn GiaiphapExcel.com ạ.
Chỉ học cách mô tả câu hỏi là đủ, nếu không thì tự học là sớm ngon.
 
Upvote 0
Function PhanLoaiM(ByVal s As String) As Variant
' đọc một chuỗi, lược ra các số trong đó
' trả về một mảng chuỗi phân loại các số trên theo độ dài
Dim a() As String
Dim sz As Integer, n As Integer
For Each e In Split(s, " ")
If IsNumeric(e) Then
n = Len(e)
If n > sz Then
sz = n
ReDim Preserve a(1 To sz)
End If
a(n) = a(n) & IIf(Len(a(n)), " ", "") & e
End If
Next e
PhanLoaiM = a
End Function

Function PhanLoai(ByVal s As String, Optional ByVal n As Integer = 1) As String
' đọc một chuỗi, lược ra các số trong đó
' trả về một chuỗi các số có độ dài như yêu cầu n
PhanLoai = PhanLoaiM(s)(n)
End Function

Copy cả 2 hàm vào Module 1
Cách dùng:
Cách 1:
Chọn cả 3 ô B1, C1, D1
Gõ =PhanLoaiM(A1)
Ctrl+Shift+Enter
Cách 2:
Chọn ô B1, Gõ =PhanLoai(A1,1) Enter ; Chọn ô C1, Gõ =PhanLoai(A1,2) Enter ; Chọn ô D1, Gõ =PhanLoai(A1,3) Enter
Cách 3:
Chọn ô B1, Gõ =Index(PhanLoaiM(A1),1) Enter ; Chọn ô C1, Gõ =Index(PhanLoaiM(A1),2) ; Chọn ô D1, Gõ =Index(PhanLoaiM(A1),3) Enter

@thớt: thích thì dùng, không thích thì thôi. Nhưng chớ có tâng bốc hay dùng tiếng Tây với tôi.
Có cách nào gộp 2 Function lại thành một cho gọn, khỏi phải nhớ 2 Funtion
 
Upvote 0
Sau khi học hỏi hàm PhanLoaiM ở #11, ta có thể thực hiện như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Randomize
If Not Intersect(Target, [A2:A13]) Is Nothing Then
    Target.Offset(, 2).Resize(, 3).Value = PhanLoaiM(Target.Value)
    Target.Offset(, 2).Resize(, 3).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
End If
End Sub
Mã:
Function PhanLoaiM(ByVal S As String) As Variant
ReDim Arr(1 To 1, 1 To 3) As String

For Each E In Split(S, " ")
    Arr(1, Len(E)) = Arr(1, Len(E)) & E & " "
Next E
PhanLoaiM = Arr()
End Function
 
Upvote 0
Web KT
Back
Top Bottom