Kết quả 1 đến 5 của 5

Chủ đề: Cách tách số riêng và chữ riêng trong 1 chuỗi có kèm thêm điều kiện

  1. #1
    Ngày tham gia
    Aug 2015
    Bài viết
    0

    Cách tách số riêng và chữ riêng trong 1 chuỗi có kèm thêm điều kiện

    Chào các anh chị, em đang tìm cách để tách phần số ra riêng 1 ô, phần chữ ra riêng 1 ô của 1 chuỗi hỗn hợp chữ và số). Hôm trước lên diễn đàn GPE, thấy có 1 người viết sẵn file tachso bằng VB (thành thật xin lỗi vì sau khi down về xài, hôm nay em lại quên mất tên người viết ra để gởi lời cảm ơn , hic...)

    Tuy nhiên file tachso đó lại chỉ tách được phần số, không tách được phần chữ, vì thế hôm nay em gởi file lên để nhờ các anh chị trên diễn đàn xem qua giúp em ạ.

    Yêu cầu :

    Em có chuỗi dữ liệu :

    2 (nhu) Tg 25den74-dau30. kg.dl.34.b2,5n.3dai.72.b3n.dd10n.572.d2n.d20n. 52 dd10. . Dl 52 dd5.

    Tg 34,35,36,37,38,39,43,45,46,47,48,49,53,54,56,57,98dau5.59,47dau60,95dau30.

    1. Tách số riêng và chữ riêng (tách ra từng ô riêng biệt). Số thì phải lấy luôn số lẻ (ví dụ 2,5). Cái khó ở đây là mình nhìn thì mình hiểu đó là 2,5n (nghĩa là hai ngàn rưỡi), còn công thức trong code VB thì lại hiểu là số 2 và số 5. Nếu cho công thức tìm theo dấu , thì trường hợp nếu có nhiều số viết theo kiểu : 34,35,36..... thì làm sao cho nó xuất ra đúng là số 34 , số 35 và số 36 chứ không phải là 34,35 ? nên cũng rất khó để định ra quy luật tách

    2. Bỏ hết khoảng trắng, bỏ cả dấu . Và dấu , (không cần lấy)

    3. Những con số đi trước chữ n hoặc chữ ngan (có khi họ viết là chữ ngàn nữa) thì lấy cả con số và chữ đó luôn vì nó là số tiền ví dụ 20n là 20 ngàn, 2,5n : là 2 ngàn rưỡi

    4. Những con số đi trước chữ d hoặc chữ đ, hoặc chữ dai, chữ đài thì cũng vậy, lấy cả số và chữ (ví dụ : 2d hoặc 2dai : thì không lấy số 2 riêng , chữ d riêng mà phải giữ nguyên là 2d, 2dai. 3đài, 3d , 3đ... cũng vậy giữ nguyên là 3đài, 3d , 3đ
    Em xin cảm ơn các anh chị nhiều nhiều.


    P/s : em cũng có thêm 1 đề nghị này, xin ban quản trị đừng xóa bài của em vì đề nghị này nhé (vì em không biết post ở đâu và post như thế nào ạ)
    Em đang muốn nhờ anh chị nào giỏi về excel có thể liên hệ trực tiếp với em dùm để em nhờ viết mới hoàn toàn 1 file excel có thể làm những việc như sau (và còn nhiều thứ khác cũng hơi rắc rối, không biết phải diễn giải ngắn gọn như thế nào) :

    1. Tạo 1 sheet 1 link trực tiếp vào 1 trang web để lấy dữ liệu của trang web đó về rồi sheet 2 sẽ tham chiếu vào sheet 1 để trích xuất 1 phần dữ liệu của sheet 1 ra. Hiện nay em đang dùng cách vào mục Data, From WEB thì nó cũng lấy được, nhưng qua ngày mai, khi nội dung trang web thay đổi thì toàn bộ sheet 2 của em nó nhảy lung tung hết (phần dữ liệu này nhìn trên trang web thì thấy vị trí của nó không thay đổi, luôn nằm ở giữa trang web) nhưng sao cứ mỗi ngày qua là cái sheet 2 của em nó nhảy loạn xạ cả lên

    2. Cũng là yêu cầu tách số riêng và chữ riêng giống như ở trên nhưng có thêm 1 số yêu cầu khác hơi phức tạp, chắc phải gặp trực tiếp thì mới có thể trao đổi chứ rất khó để diễn giải trên diễn đàn


    Em tên Huê, ở Q3, TpHCM. số điện thoại : 0916 . 545 . 725. Email : luugiacp@gmail.com
    Em xin cảm ơn các anh chị đã xem bài của em

  2. #2
    vivi Guest
    Ngồi buồn viết chơi thôi chứ dạng bài này bạn phải đưa khoảng chục cell chứa "gần như" tất cả kiểu dữ liệu mới mong thỏa mãn 80% ==> 90%. Híc

    Mã:
    Public Sub TachBuaXua()
        Application.ScreenUpdating = False
        Dim Vung, Tach, I, J, K, Nguon, Thay, TachNua
            Vung = [A3]
            Nguon = Array("dau", "den", "dl", "dd", "d", "b", "-", ".")
            Thay = Array(" @au ", " @en ", " @l ", " @d ", "@ ", " b ", " ", " ")
                For I = LBound(Nguon) To UBound(Nguon)
                    Vung = Replace(Vung, Nguon(I), Thay(I))
                Next I
            Vung = Application.WorksheetFunction.Trim(Replace(Vung, "@", "d"))
            Tach = Split(Vung)
            [B3:DS3].ClearContents
                    For I = LBound(Tach) To UBound(Tach)
                        If InStr(Tach(I), ",") = 0 Or Right(Tach(I), 1) = "n" Then
                            K = K + 1
                            Cells(3, 2 + K) = Tach(I)
                        ElseIf Right(Tach(I), 1) <> "n" Then
                            TachNua = Split(Tach(I), ",")
                            For J = 1 To UBound(TachNua) + 1
                                Cells(3, 2 + K + J) = TachNua(J - 1)
                            Next J
                            K = K + J - 1
                        End If
                    Next I
        Application.ScreenUpdating = True
    End Sub
    Nói chung, code chỉ chạy dữ liệu của bài này, khi nào đủ kiểu dữ liệu thì ....sửa, nếu sửa hông được thì.....thua vậy
    Mình xử dụng Sub cho dễ kiểm tra, bạn bấm vào đầu con mèo xem kết quả kế bên
    Cái Function trong bài là của bạn khác chứ hông phải của mình đâu nhé (mình hông có đặt tên biến là Temp)
    Thân

  3. #3
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    perfect !!! cảm ơn anh HungQuoc49. Tách được đến 99% luôn. Đã thử 50 tin nhắn, đạt 99%, hic, quá đỉnh luôn. Cảm ơn anh nhiều nhiều[IMG]images/smilies/a01.gif[/IMG]

  4. #4
    thaoduoc Guest
    Cảm ơn concogia nhiều lắm nha, đúng là tách được khoảng 80% dữ liệu. Rút kinh nghiệm, đúng là em đưa quá ít dữ liệu để mấy anh chị xem, nhưng dù sao cũng cảm ơn các anh / chị đã dành thời gian giúp đỡ em ạh.

  5. #5
    thuyvt123 Guest
    Quá ít mẫu, dùng thử hàm nay xem sao
    ( các chữ "ngàn", "ngan", "đồng"... phải được viết tắt )

    Mã:
    Public Function Tach(Str, k)
    Str = Replace(Str, "-", ".")
    
    With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "([A-Za-z])(\d)"
    Str = .Replace(Str, "$1" & "." & "$2")
    .Pattern = "(\d)([a-zA-Z]{2,})"
    Str = .Replace(Str, "$1" & "." & "$2")
    .Pattern = ",(\d+),"
    Str = .Replace(Str, "." & "$1" & ".")
    .Pattern = "(\.\d+),(\d+\.)"
    Str = .Replace(Str, "$1" & "." & "$2")
    End With
    
    Str = Replace(Str, " ", ".")
    Tam = Split(Application.Trim(Join(Split(Str, "."), " ")), " ")
    Tach = Tam(k - 1)
    End Function
    Cú pháp: Tach(chuỗi cần tách, vị trí cần tách)

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •