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

  • Thread starter lehongduc
  • Ngày gửi
L

lehongduc

Thành viên thân thiết
29/3/05
129
1
18
59
VietNam
#1
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
 

Đính kèm

Sửa lần cuối:
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
845
7
18
37
Nha Trang
#2
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.
 
HongViet

HongViet

Thành viên thân thiết
10/11/05
286
10
18
Đà nẵng
#3
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;
 
L

lehongduc

Thành viên thân thiết
29/3/05
129
1
18
59
VietNam
#4
Là thực tế. Không phải không tưởng.

HongViet nói:
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;
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é.
 
L

levanduyet

Welcome
16/10/04
535
11
18
HCM
my.opera.com
#5
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
 
QDuc

QDuc

Thành viên thân thiết
3/6/06
254
18
18
Biển khơi
#6
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:
Function SmallThanA(Rng As Range) As Variant
Dim vVal, bDai As Byte, iCount As Integer
Dim StrC As String, StrNeg As String, StrDec As String, StrNum As String

StrC = Rng.Value: bDai = Len(StrC)
For iCount = bDai To 1 Step -1
vVal = Mid(StrC, iCount, 1)
If Asc(vVal) < 65 Then StrNum = Mid(StrC, iCount, 1) & StrNum
Next iCount
If InStr(StrNum, "+") < 2 Or InStr(StrNum, "-") < 2 Then StrNum = CDbl(StrNum)
SmallThanA = StrNum

End Function
 

Thành viên trực tuyến

Không có thành viên trực tuyến.

Xem nhiều