Cần giúp tách, phân loại chuỗi

Liên hệ QC

hackerchicken

Thành viên mới
Tham gia
13/10/07
Bài viết
8
Được thích
0
Giả thuyết, cột A của e bao gồm 1000 số điện thoại, lẫn lộn các mạng khác nhau
E muốn phân loại, lấy tất cả các số điện thoại mạng vina sang cột B, mạng mobi sang cột C và mạng viettel sang cột D
Với dữ liệu các mạng như sau:
Vina: 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129
Mobi: 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128
Viettel: 096 - 097 - 098 - 016
Mong các pro giúp đỡ ạ
 
PHP:
Sub LocDt()
Dim EndR As Long
Dim BRow As Long, CRow As Long, DRow As Long
Dim SArr, RArr
EndR = Cells(50000, 1).End(xlUp).Row
SArr = Range("A2:A" & EndR).Value
ReDim RArr(1 To EndR, 1 To 3)
For i = 1 To EndR - 1
    Select Case Left(SArr(i, 1), 3)
        Case "091", "094"
            BRow = BRow + 1
            RArr(BRow, 1) = SArr(i, 1)
        Case "093", "090"
            CRow = CRow + 1
            RArr(CRow, 2) = SArr(i, 1)
        Case "096", "097", "098", "016"
            DRow = DRow + 1
            RArr(DRow, 3) = SArr(i, 1)
        Case Else
            Select Case Left(SArr(i, 1), 4)
                Case "0123" To "0125", "0127", "0129"
                    BRow = BRow + 1
                    RArr(BRow, 1) = SArr(i, 1)
                Case "0120" To "0122", "0126", "0128"
                    CRow = CRow + 1
                    RArr(CRow, 2) = SArr(i, 1)
            End Select
    End Select
Next
Range("B2:D" & EndR).ClearContents
Range("B2:D" & EndR) = RArr
End Sub
 

File đính kèm

  • LocSDT.rar
    221.8 KB · Đọc: 36
Lần chỉnh sửa cuối:
Giả thuyết, cột A của e bao gồm 1000 số điện thoại, lẫn lộn các mạng khác nhau
E muốn phân loại, lấy tất cả các số điện thoại mạng vina sang cột B, mạng mobi sang cột C và mạng viettel sang cột D
Với dữ liệu các mạng như sau:
Vina: 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129
Mobi: 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128
Viettel: 096 - 097 - 098 - 016
Mong các pro giúp đỡ ạ

Bạn muốn giúp theo cách nào ?
 
Giả thuyết, cột A của e bao gồm 1000 số điện thoại, lẫn lộn các mạng khác nhau
E muốn phân loại, lấy tất cả các số điện thoại mạng vina sang cột B, mạng mobi sang cột C và mạng viettel sang cột D
Với dữ liệu các mạng như sau:
Vina: 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129
Mobi: 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128
Viettel: 096 - 097 - 098 - 016
Mong các pro giúp đỡ ạ
#

Giả định vùng số điện thoại nằm ở cột A bắt đầu từ ô A2

Hãy thử phương án sub này, bấm Alt+F11 --> insert module --> paste sub sau, rùi trở lại excel bấm Alt+F8 chạy ArrangeMobileNumber là được như ý (nhớ format ba cột B C D dưới dạng text trước khi chạy sub đó , để giữ định dạng số 0 đầu tiên)

PHP:
Sub ArrangeMobileNumber()
    Dim i As Long, n As Long, v As Long, m As Long, t As Long, sA, rA
    sA = Range([A2], [A65000].End(xlUp)).Value
    n = UBound(sA):   ReDim rA(1 To n, 1 To 3)
    For i = 1 To n
        Select Case CLng(Left(sA(i, 1), 4))
            Case 910 To 919, 940 To 949, 123 To 125, 127, 129
                v = v + 1:  rA(v, 1) = sA(i, 1)
            Case 930 To 939, 900 To 909, 120 To 122, 126, 128
                m = m + 1:  rA(m, 2) = sA(i, 1)
            Case 960 To 969, 970 To 979, 980 To 989, 160 To 169
                t = t + 1:  rA(t, 3) = sA(i, 1)
        End Select
    Next
    i = v:  If i < m Then i = m:    If i < t Then i = t
    [B2].Resize(65000, 3).ClearContents
    [B2].Resize(i, 3) = rA
End Sub
 
Lần chỉnh sửa cuối:
Giả thuyết, cột A của e bao gồm 1000 số điện thoại, lẫn lộn các mạng khác nhau
E muốn phân loại, lấy tất cả các số điện thoại mạng vina sang cột B, mạng mobi sang cột C và mạng viettel sang cột D
Với dữ liệu các mạng như sau:
Vina: 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129
Mobi: 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128
Viettel: 096 - 097 - 098 - 016
Mong các pro giúp đỡ ạ

Mã:
Sub Tachsdt()
Dim cell As Range
Vina = " 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129"
Mobi = " 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128"
Viettel = " 096 - 097 - 098 - 016"
For Each cell In [A:A]
If cell <> "" Then
    If InStr(Vina, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 1).End(xlUp).Offset(1) = cell
    If InStr(Mobi, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 2).End(xlUp).Offset(1) = cell
    If InStr(Viettel, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 3).End(xlUp).Offset(1) = cell
End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Giả thuyết, cột A của e bao gồm 1000 số điện thoại, lẫn lộn các mạng khác nhau
E muốn phân loại, lấy tất cả các số điện thoại mạng vina sang cột B, mạng mobi sang cột C và mạng viettel sang cột D
Với dữ liệu các mạng như sau:
Vina: 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129
Mobi: 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128
Viettel: 096 - 097 - 098 - 016
Mong các pro giúp đỡ ạ

Thật ra loại bài toán này bạn không cần phải suy nghĩ chi cho sâu xa, cứ dùng công cụ Advanced Filter là giải quyết gọn gàng và đơn giản

Capture.JPG



































Xem hình, tự hiểu nhé
 
Mã:
Sub Tachsdt()
Dim cell As Range
Vina = " 091 - 094 - 0123 - 0124 - 0125 - 0127 - 0129"
Mobi = " 090 - 093 - 0120 - 0121 - 0122 - 0126 - 0128"
Viettel = " 096 - 097 - 098 - 016"
For Each cell In [A:A]
If cell <> "" Then
    If InStr(Vina, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 1).End(xlUp).Offset(1) = cell
    If InStr(Mobi, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 2).End(xlUp).Offset(1) = cell
    If InStr(Viettel, " " & Left(cell, Len(cell) - 7)) Then cell.Offset(, 3).End(xlUp).Offset(1) = cell
End If
Next
End Sub
1. Dùng Instr hơi chậm 1 chút
2. gán giá trị từng ô xuống sheet: Rất chậm
3. Vòng lặp duyệt hết A:A, tức là 1 triệu ô. Lại càng chậm
 
Thật ra loại bài toán này bạn không cần phải suy nghĩ chi cho sâu xa, cứ dùng công cụ Advanced Filter là giải quyết gọn gàng và đơn giản

View attachment 114581



































Xem hình, tự hiểu nhé

Đúng là ví dụ điển hình cho advance fillter. cần phải bổ sung vào help trong excel để mọi người đọc help này có thể sử dụng được advance fillter ạ.

Khoi
 
Web KT
Back
Top Bottom