Một tình huống xử lý chuỗi trong Excel.

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi lehongduc, 20 Tháng chín 2006.

12,687 lượt xem

  1. lehongduc

    lehongduc Thành viên thân thiết

    Bài viết:
    129
    Đã được thích:
    1
    Nơi ở:
    VietNam
    Xin chào các Bạn,
    Xin trao đổi cùng các bạn hàm tự viết để đáp ứng nhu cầu sau của 1 người bạn đang sử dụng Excel nêu ra với tôi:
    Nhu cầu: Có 1 chuổi ghi địa chỉ theo dạng thức: số nhà và đường phố - ngõ - khu phố - phường - quận
    Cần tách các chuổi số là: số nhà, ngõ, khu phố ghi trong chuổi địa chỉ nêu trên (chỉ cần tách lấy ra các ký tự số và các dấu đặc biệt nối liền các ký tự số như "/" trong chuổi "25/124")

    Sau đây là code của hàm để đáp ứng nhu cầu trên. Các Bạn có ý kiến gì không?

    Function TachSo(ChuoiGoc, Kytu As String, DauNoi As String, VitriBatDau As Integer, TraiPhai As Boolean)
    '
    'ChuoiGoc: Chuoi goc de xu ly
    'Kytu: ky tu ngan cach
    'VitriBatdau: Bat dau cat tai vi tri nay cua Kytu
    'DauNoi: dau noi cac ky so
    'TraiPhai: Cat tu ben trai hay ben phai ChuoiGoc?
    '+ TraiPhai = True => Cat tu ben Trai ChuoiGoc (tu dau chuoi)
    '+ TraiPhai = False => Cat tu ben phai chuoi (tu Cuoi Chuoi)
    Dim SubSt As String, i As Integer, LngSt As Integer, ChuoiKq As String
    Dim k As Integer, intChk As Integer
    Dim vBegin As Integer, vLast As Integer, vStep As Integer
    '
    If IsNull(ChuoiGoc) Then Exit Function
    LngSt = Len(Trim(CStr(ChuoiGoc)))

    ChuoiKq = ""
    intChk = 0
    If TraiPhai = True Then
    vBegin = 1
    vLast = LngSt
    vStep = 1
    Else
    vBegin = LngSt
    vLast = 1
    vStep = -1
    End If
    'Xac dinh vi tri bat dau cat
    If VitriBatDau > 0 Then
    For k = vBegin To vLast Step vStep
    'Xet tung ky tu tu dau chuoi
    SubSt = Mid(ChuoiGoc, k, 1)
    If SubSt = Kytu Then
    intChk = intChk + 1
    If intChk = VitriBatDau Then Exit For
    End If
    Next k
    If TraiPhai = True Then
    k = k + 1
    Else
    k = k - 1
    End If
    Else
    If TraiPhai = True Then
    k = 1
    Else
    k = LngSt
    End If
    End If
    Debug.Print "k: " & k
    Debug.Print "vBegin: " & vBegin
    Debug.Print "vLast: " & vLast
    Debug.Print "Step: " & vStep
    'Bat dau cat tu VitriBatdau
    For i = k To vLast Step vStep
    'Xet tung ky tu tu VitriBatdau den cuoi chuoi
    SubSt = Mid(ChuoiGoc, i, 1)
    Debug.Print "SubSt: " & SubSt
    If SubSt = Kytu Then Exit For
    If IsNumeric(SubSt) Or SubSt = DauNoi Then
    If TraiPhai = True Then
    ChuoiKq = ChuoiKq & SubSt
    Else
    ChuoiKq = SubSt & ChuoiKq
    End If
    End If
    Next i
    TachSo = ChuoiKq
    End Function
     

    Các file đính kèm:

    Last edited: 20 Tháng chín 2006
    #1
  2. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Cảm ơn bác Lehongduc về đoạn code. Có lẻ em cũng sẽ tham bàn luận nhiều với về đoạn code này.
    Trước tiên em xin phép trả lời bác về chuyện thụt vào ló ra :biggrin: cái này thật ra diễn đàn không hổ trợ đành phải chịu vậy thôi bác ạh, em cũng không làm được.
     
    #2
  3. HongViet

    HongViet Thành viên thân thiết

    Bài viết:
    286
    Đã được thích:
    10
    Nơi ở:
    Đà nẵng
    Một vài í kiến ban đầu: /(hông tưởng!

    Bạn nên bỏ ý định này đi; Vì thực tế ngay đến số nhà cùa 1 vùng còn lung tung xèng cả lên mà cắt số làm chi;
    Mình chưa tìm hiểu kỹ hàm của bạn nhưng theo mình bạn có thực tế chưa đã; VD sau
    Số 22/5B/7 lô A1 chung cư NGT;
     
    #3
  4. lehongduc

    lehongduc Thành viên thân thiết

    Bài viết:
    129
    Đã được thích:
    1
    Nơi ở:
    VietNam
    Là thực tế. Không phải không tưởng.

    Xin chào Bạn,
    Như tôi đã nêu trong bài viết, đây là hàm tôi viết để đáp ứng cho nhu cầu của 1 người bạn, đó cũng vừa là 1 khách hàng của tôi. Ngay trên diễn đàn này cũng đã phát sinh nhu cầu tương tự như vậy.
    Hàm trên chỉ đáp ứng được khi chuỗi gốc cần xử lý có cấu trúc tuân theo 1 quy ước xác định trước. bạn có thể xem ví dụ cụ thể trong file XLS gửi kèm theo bài viết của tôi.
    Nhân đây cũng xin góp ý với Bạn: Nhận thức của chúng ta luôn đi sau thực tiễn của cuộc sống, nó luôn là hữu hạn, còn thực tiễn luôn đa dạng và muôn màu. Xem ra cách đánh giá của Bạn qua lời văn là "hơi quá".
    Chúc sức khỏe nhé.
     
    #4
  5. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Góp sức

    Tôi xin góp một hàm Split
    Hàm Split
    Chú ý: Chỉ áp dụng cho Excel 2000 trở về sau.
    Hàm Split của VBA, được giới thiệu với Excel 2000, có thể làm cho một số công việc lập trình đơn giản hơn. Hàm này nhận vào một chuổi (text string) trả về một mảng biến chứa các phần tử của chuổi ký tự (Bạn chỉ định ký tự đặc biệt để phân biệt các phần tử trong chuổi)
    Một ví dụ đơn giản
    Thủ tục sau trình bày cách thức hàm Split làm việc.
    Sub SplitDemo()
    Dim txt As String
    Dim x As Variant
    Dim i As Long
    txt = “The Split function is versatile”
    x = Split(txt, “ “)
    For i = 0 To Ubound(x)
    Debug.Print x(i)
    Next i
    End Sub
    Trong trường hợp này, ký tự đặc biệt để phân biệt các phần tử trong chuổi là khoảng trắng “ “. Các ví dụ sau trình bày một số sử dụng khác của hàm Split.
    Tách ra một phần tử
    Split là một hàm VBA, vì vậy nó có thể được dùng trong công thức trên một worksheet. Hàm dưới đây đơn giản là trả về phần thử thứ n của chuổi ký tự.
    Function ExtractElement(str, n, sepChar)
    ‘ Returns the nth element from a string,
    ‘ using a specified separator character
    Dim x As Variant
    x = Split(str, sepChar)
    If n > 0 And n – 1 <= Ubound(x) Then
    ExtractElement = x(n – 1)
    Else
    ExtractElement = “”
    End If
    End Function
    Công thức dưới đây trình bày cách dùng hàm trên trong công thức.
    =ExtractElement("546-339-909-944",3,"-")
    Công thức này trả về 909, phần tử thứ ba của chuổi ký tự (yếu tố để phân biệt các phần tử ở đây là "-" ).
    Đếm số từ
    Hàm dưới đây trả về số từ trong một chuổi.
    Function WordCount(txt) As Long
    ' Returns the number of words in a string
    Dim x As Variant
    txt = Application.Trim(txt)
    x = Split(txt, " ")
    WordCount = UBound(x) + 1
    End Function
    Tách tên tập tin
    Hai ví dụ sau làm cho việc lấy tên tập tin hay đường dẫn từ một đường dẫn tập tin đầy đủ một cách dễ dàng ví dụ như "c:\files\workbooks\archives\budget98.xls"
    Function ExtractFileName(filespec) As String
    ' Trả về tên tập tin từ một đường dẫn đầy đủ filespec
    Dim x As Variant
    x = Split(filespec, Application.PathSeparator)
    ExtractFileName = x(UBound(x))
    End Function

    Function ExtractPathName(filespec) As String
    ' Trả về đường dẫn không có tên tập tin từ một đường dẫn đầy đủ filespec
    Dim x As Variant
    x = Split(filespec, Application.PathSeparator)
    ReDim Preserve x(0 To UBound(x) - 1)
    ExtractPathName = Join(x, Application.PathSeparator) & Application.PathSeparator
    End Function
    Hàm ExtractFileName trả về "budget98.xls" và hàm ExtractPathName trả về "c:\files\workbooks\archives\"
    Đếm các ký tự đặc biệt trong một chuổi
    Hàm sau sẽ nhận vào một chuổi (string) và chuổi con (sub string) và trả về con số thể hiện số lần mà chuổi con suất hiện trong chuổi.
    Function CountOccurrences(str, substring) As Long
    ' Trả về số lần chuổi substring xuất hiện trong str
    Dim x As Variant
    x = Split(str, substring)
    CountOccurrences = UBound(x)
    End Function
    Tìm từ dài nhất trong một chuổi
    Hàm dưới đây nhận vào một câu và trả về từ dài nhất trong câu đó.
    Function LongestWord(str) As String
    ' Trả về từ dài nhất trong chuổi str
    Dim x As Variant
    Dim i As Long
    str = Application.Trim(str)
    x = Split(str, " ")
    LongestWord = x(0)
    For i = 1 To UBound(x)
    If Len(x(i)) > Len(LongestWord) Then
    LongestWord = x(i)
    End If
    Next i
    End Function

    Với hàm Split này tôi nghĩ rằng các bạn còn có thể làm nhiều điều hơn những hàm chúng ta đã đề cập ở trên.
    Lê Văn Duyệt
     
    #5
  6. QDuc

    QDuc Thành viên thân thiết

    Bài viết:
    254
    Đã được thích:
    18
    Nơi ở:
    Biển khơi
    Mình cũng muốn tham gia cái ni một đoạn Code:

    :angel: Nhưng để dùng vô việc khác:
     
    #6

Chia sẻ trang này