[VBA] Hàm xử lý văn bản

vistaab

Yêu THVBA
1. Asc
Asc(String As String) 'As Long'
Trả về một số nguyên (0-255) đại diện cho mã ký tự tương ứng với một ký tự.
Nếu tham số string đưa vào nhiều hơn 1 ký tự thì kết quả trả về ứng với ký tự đầu tiên.

Ví dụ:
Mã:
Sub ASC_Fn()
Debug.Print Asc("A")
Debug.Print Asc("z")
End Sub
Mã:
Sub Test1()
Dim i as Long
For i = 1 to 256 then
Cells(i,1).value = i - 1
Cells(i,2).value = Asc(i)
Next i
End Sub
2. AscW
AscW(String As String) 'As Long'
Trả về một số nguyên (0-65535) đại diện cho mã ký tự tương ứng với một ký tự.
Nếu tham số string đưa vào nhiều hơn 1 ký tự thì kết quả trả về ứng với ký tự đầu tiên.

Ví dụ:
Mã:
Sub ASCW_Fn()
Debug.Print AscW("á")
Debug.Print AscW(" ")
End Sub
3. Chr
Chr(CharCode as Long)
Trả về ký tự tương ứng với mã ký tự (0-255) chỉ định đưa vào.

Ví dụ:
Mã:
Sub CHR_Fn()
Debug.Print Chr(66)
End Sub
Mã:
Sub Test2()
Dim i as Long
For i = 1 to 256 then
Cells(i,1).value = i - 1
Cells(i,2).value = Chr(i)
Next i
End Sub
4. ChrW
ChrW(CharCode as Long)
Trả về ký tự tương ứng với mã ký tự (0-65535) chỉ định đưa vào.

Ví dụ:
Mã:
Sub CHRW_Fn()
Dim s As String
s = ChrW(3000)
Debug.Print s
End Sub
5. Format strings
Format (Expression, [Format ]) 'As String
Định dạng giá trị đưa vào theo định dạng chỉ định
Expression: Giá trị cần định dạng
[Format]: Tùy chọn định dạng đưa vào. Gồm:
FormatChú thích
General NumberHiển thị dạng số không có dấu phân cách phần nghìn.
CurrencyHiển thị dạng số có phân cách phần nghìn với 2 chữ số phần thập phân.
FixedHiển thị ít nhất một chữ số ở bên trái của phần thập phân và hai chữ số ở bên phải của phần thập phân.
StandardHiển thị phân cách phần nghìn, ít nhất một chữ số ở bên trái phần thập phân, và hai chữ số ở bên phải của phần thập phân.
PercentHiển thị giá trị phần trăm với hai chữ số ở bên phải của phần thập phân.
ScientificKý hiệu khoa học.
Yes/NoHiển thị "No" nếu số là 0. Hiển thị "Yes" nếu số không phải là 0.
True/FalseHiển thị False nếu số là 0. Hiển thị True nếu số không phải là 0.
On/OffHiển thị Off nếu số là 0. Hiển thị On là số không phải là 0.
General DateHiển thị ngày theo định dạng ngày cài đặt trong hệ thống (hệ điều hành).
Long DateHiển thị ngày theo định dạng cài đặt ngày kiểu dài của hệ thống.
Medium DateHiển thị ngày theo định dạng cài đặt ngày kiểu trung bình của hệ thống.
Short DateHiển thị ngày theo định dạng cài đặt ngày kiểu ngắn của hệ thống.
Long TimeHiển thị thời gian theo cài đặt thời gian dài của hệ thống.
Medium TimeHiển thị thời gian theo cài đặt thời gian trung bình của hệ thống.
Short TimeHiển thị thời gian theo cài đặt thời gian ngắn của hệ thống.
Ví dụ:
Mã:
Sub Format_Fn()
Debug.Print Format(1000000, "#,0")
Debug.Print Format("0", "On/Off")
Debug.Print Format("Sep 3, 2003", "Short Date")
Debug.Print Format(Date, "dd/mm/yyyy")
End Sub
6. InStr
InStr([Start],[String1],[String2],[Compare As VbCompareMethod = vbBinaryCompare]) 'As Long'
Trả về vị trí xuất hiện đầu tiên của chuỗi con trong chuỗi đang xét.
start: Tùy chọn, là vị trí bắt đầu tìm kiếm. Nếu không nhập thì mặc định là 1.
string1: Chuỗi đưa ra để xét
string2: Chuỗi con cần tìm
compare: Tùy chọn
Tham sốValueChú thích
vbBinaryCompare0Phân biệt chữ hoa, chữ thường
vbTextCompare1Không phân biệt chữ hoa, chữ thường
Ghi chú:
Vị trí đầu tiên trong "string1" là 1.
Khi tìm vị trí của "string2" trong "string1", chức năng InStr thực hiện tìm kiếm theo từng chữ.
Nếu "string2" không được tìm thấy trong "string1", thì hàm InStr sẽ trả về 0.

Ví dụ:
Mã:
Sub INSTR_Fn()
Dim LPos As Integer
LPos = InStr(3, "Day la mot vi du!", "a")
Debug.Print LPos
'Result: LPos=6
End Sub
7. InStrRev
InStrRev(StringCheck As String,StringMatch As String,[Start As Long = -1],[Compare As VbCompareMethod = vbBinaryCompare]) 'As Long'
Trả về vị trí xuất hiện đầu tiên của chuỗi con trong chuỗi đang xét tính từ cuối chuỗi.
StringCheck: Chuỗi đưa ra để xét
StringMatch: Chuỗi cần tìm
start: Không bắt buộc. Đây là vị trí bắt đầu cho việc tìm kiếm. Nếu tham số này bị bỏ qua, việc tìm kiếm sẽ bắt đầu ở vị trí -1 là vị trí ký tự cuối cùng.
compare: Không bắt buộc. Đây là kiểu so sánh để thực hiện. Nó có thể là một trong các giá trị sau:
Tham số
Value​
Chú thích
vbBinaryCompare
0​
Phân biệt chữ hoa, chữ thường
vbTextCompare
1​
Không phân biệt chữ hoa, chữ thường
Ví dụ:
Mã:
Sub INSTRREV_Fn()
Dim LPos As Integer
LPos = InStrRev("Tim ky tu phia cuoi", "i")
Debug.Print LPos
'Result: LPos=19
LPos = InStrRev("Tim ky tu phia cuoi", "i", 3)
Debug.Print LPos
'Result: LPos=2
End Sub
1 ví dụ về tách họ tên sử dụng hàm InStr và InStrRev:
Mã:
Sub tachht()
Dim arrhvt(), arrHo(), arrTendem(), arrTenrieng()
Dim ik, jk, LrA As Long
Dim KT1, KT2, KTT As Long
Dim Ho, Tendem, Ten As String
LrA = Range("A" & Rows.Count).End(xlUp).Row
ReDim arrhvt(1 To LrA, 1 To 1)
ReDim arrHo(1 To LrA, 1 To 1)
ReDim arrTendem(1 To LrA, 1 To 1)
ReDim arrTenrieng(1 To LrA, 1 To 1)
arrhvt = Sheet1.Range("A2:A" & LrA).Value
For ik = 1 To UBound(arrhvt, 1)
        arrhvt(ik, 1) = Trim(arrhvt(ik, 1))
        KTT = Len(arrhvt(ik, 1))
        KT1 = InStr(1, arrhvt(ik, 1), " ", 1)
        KT2 = InStrRev(arrhvt(ik, 1), " ", -1, 1)
        jk = jk + 1
        arrHo(jk, 1) = Left(arrhvt(ik, 1), KT1 - 1)
        arrTenrieng(jk, 1) = Right(arrhvt(ik, 1), KTT - KT2)
        arrTendem(jk, 1) = Mid(arrhvt(ik, 1), KT1 + 1, KT2 - KT1)
Next ik
Sheet1.Cells(1, 1).Resize(UBound(arrhvt, 1), 1).Offset(1, 1).Value = arrHo
Sheet1.Cells(1, 1).Resize(UBound(arrhvt, 1), 1).Offset(1, 2).Value = arrTendem
Sheet1.Cells(1, 1).Resize(UBound(arrhvt, 1), 1).Offset(1, 3).Value = arrTenrieng
End Sub
8. LCase
LCase(String) 'As String
Chuyển chuỗi từ chữ in hoa thành chữ thường.

Ví dụ:
Mã:
Sub LCase_Fn()
Dim lowerText As String
lowerText = LCase("XIN CHAO!")
'Result: lowerText = "xin chao!"
End Sub
9. UCase
UCase(String) 'As String
Chuyển chuỗi từ chữ thường thành chữ in hoa.

Ví dụ:
Mã:
Sub UCase_Fn()
Dim UpperText As String
UpperText = UCase("xin chao!")
'Result: UpperText = "XIN CHAO!"
End Sub
10. Left
Left(String, Length As Long) 'As String
Trích xuất một chuỗi con từ một chuỗi, bắt đầu từ ký tự đầu tiên bên trái.
String: Chuỗi đưa vào
Length: Số ký tự cần lấy

Ví dụ:
Mã:
Sub LEFT_Fn()
Debug.Print Left("Cat phan ben trai", 3)
'Result: "Cat"
End Sub
11. Len
Len(Expression) As Long 'As Long
Trả về số ký tự của chuỗi.

Ví dụ:
Mã:
Sub LEN_Fn()
Debug.Print Len("Day la mot chuoi.")
'Result=17
End Sub
12. LTrim
Ltrim(String) 'As String
Loại bỏ khoảng trắng ở đầu (bên trái) chuỗi đưa vào.
Mã:
Sub LTRIM_Fn()
Debug.Print LTrim(" Day la mot vi du.")
'Result: "Day la mot vi du."
End Sub
13. Mid
Mid(String,Start As Long,[Length]) 'As String
Trích xuất một chuỗi con từ một chuỗi (bắt đầu ở bất kỳ vị trí nào)
String: Chuỗi đưa vào.
Start: Vị trí bắt đầu trích xuất chuỗi con.
Length: Số ký tự cần trích xuất.

Ví dụ:
Mã:
Sub MID_Fn()
Debug.Print Mid("Cat khuc giua.", 5, 4)
'Result: "khuc"
End Sub
14. Replace
Replace(Expression As String, Find As String, Replace As String, [Start As Long = 1], [Count As Long=-1],[Compare As VbComapareMethod = VbBinaryCompare]) 'As String
Thay thế một chuỗi ký tự trong một chuỗi bởi một tập hợp các ký tự khác.
Expression: Chuỗi ký tự đưa vào.
Find: Chuỗi ký tự cần tìm để thay thế.
Replace: Chuỗi ký tự để thay thế mới.
Start: Không bắt buộc. Là vị trí bắt đầu tìm kiếm trong chuỗi đang xét, xét từ trái sang phải, bắt đầu =1
Count: Không bắt buộc. Là số lần xuất hiện để thay thế. Nếu bỏ qua tham số này thì sẽ thay thế tất cả các lần tìm thấy.
Compare: Không bắt buộc. Đây là kiểu so sánh để thực hiện. Nó có thể là một trong các giá trị sau:
Tham sốChú thích
vbBinaryComparePhân biệt chữ hoa, chữ thường
vbTextCompareKhông phân biệt chữ hoa, chữ thường
Ví dụ:
Mã:
Sub REPLACE_Fn()
Debug.Print Replace("Doi cac ky tu a thanh ky tu x.", "a", "x")
End Sub
15. Right
Right(String,Length As Long) 'As String
Trích một chuỗi con từ một chuỗi bắt đầu từ ký tự đầu tiên bên phải.

Ví dụ:
Mã:
Sub RIGHT_Fn()
Debug.Print Right("Ben phai", 4)
End Sub
16. RTrim
Rtrim(String) 'As String
Loại bỏ khoảng trắng ở cuối (bên phải) chuỗi đưa vào.

Ví dụ:
Mã:
Sub RTRIM_Fn()
Debug.Print RTrim("Loai khoang trang ben phai. ")
End Sub
17. Space
Space(Number As Long) 'As String
Trả về chuỗi là các ký tự khoảng trắng, với số lượng ký tự chỉ định đưa vào.

Ví dụ:
Mã:
Sub SPACE_Fn()
Debug.Print "Them" & SPACE(10) & "khoang trang."
End Sub
18. Split
Split(Expression As String, [Delimiter], [Limit As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) 'Array1D() As String
Trả về một mảng 1 chiều, gồm các phần tử là các chuỗi con được tách ra từ chuỗi đưa vào bởi dấu phân cách, chỉ mục cận dưới của mảng luôn bằng 0 cho dù Option Base 1.
Expression: Bắt buộc. Chuỗi cần tách, gồm các chuỗi con và dấu phân cách. Nếu Len(Expression)=0 thì kết quả là một mảng có 1 phần từ là chuỗi có độ dài =0 ("").
Delimiter: Không bắt buộc. Dấu phân cách, là một chuỗi ký tự bất kỳ dùng để phân cách các chuỗi con trong Expression.
- Nếu Delimiter bỏ qua thì giá trị mặc định của Delimiter là một khoảng trắng " ".
- Nếu Delimiter không tìm thấy trong Expression hoặc Len(Delimiter)=0 thì kết quả trả về là một mảng có 1 phần tử chính là chuỗi gốc đưa vào.
Limit: Không bắt buộc. Là số chuỗi con nhiều nhất được tách ra từ chuỗi đưa vào. Nếu bỏ qua, giá trị mặc định Limit=-1, ứng với tất cả các chuỗi con được tách ra.
Compare: Không bắt buộc. Kiểu so sánh để thực hiện khi phân tích các chuỗi con.
VBA Constant
Value​
Chú thích
vbBinaryCompare
0​
Phân biệt chữ hoa, chữ thường
vbTextCompare
1​
Không phân biệt chữ hoa, chữ thường

Ví dụ:
Mã:
Sub SPLIT_Fn()
Dim aTmp
aTmp = Split("Tach Chuoi Nay")
''Mang ket qua aTmp gôm 3 phân tu: "Tach" , "Chuoi" , "Nay"
MsgBox aTmp(0)
End Sub
Mã:
Sub SPLIT_Fn2()
Dim aTmp
aTmp = Split("Day-la-mot-vi-du", "-", 1) ''Array("Day-la-mot-vi-du")
aTmp = Split("Day-la-mot-vi-du", "-", 2) ''Array("Day", "la-mot-vi-du")
End Sub
19. Join
Join(SourceArray,[Delimiter]) 'As String'
Trả về một chuỗi được ghép từ các phần từ của mảng một chiều SourceArray bởi dấu phân cách Delimiter.
SourceArray: Bắt buộc. Là mảng một chiều chứa các chuỗi con cần nối.
Delimiter: Không bắt buộc. Dấu phân cách, là một chuỗi ký tự bất kỳ dùng để phân cách các chuỗi con trong chuỗi kết quả.
- Nếu Delimiter bỏ qua thì giá trị mặc định của nó là một khoảng trống " ".
- Nếu Delimiter là một chuỗi có độ dài bằng 0 ("") thì kết quả là các phần tử của SourceArray được nối liền với nhau, không có dấu phân cách.

Ví dụ:
Mã:
Sub JOIN_Fn()
Dim a
a = Array("A", "B", "C", 1, 2, 3)
Debug.Print Join(a) '' "A B C 1 2 3"
Debug.Print Join(a, "") '' "ABC123"
End Sub
20. Str
Str(Numer) 'As String
Trả về dạng chuỗi của một số.

Ví dụ:
Mã:
Sub STR_Fn()
Debug.Print Str(10)
'Result: "10" là chuôi, không phai sô 10
End Sub
21. StrComp
StrComp(String1, String2, [Compare As VbCompareMethod = vbBinaryCompare]) 'As Integer
Trả về kết quả là một số nguyên đại diện cho kết quả so sánh 2 chuỗi.
String1, String2: Hai chuỗi đưa vào để so sánh
Compare: Không bắt buộc. Là kiểu so sánh dữ liệu:
VBA Constant
Value​
Chú thích
vbBinaryCompare
0​
Phân biệt chữ hoa, chữ thường
vbTextCompare
1​
Không phân biệt chữ hoa, chữ thường
Ghi chú:
Nếu String1 bằng String2, hàm StrComp sẽ trả về 0.
Nếu String1 nhỏ hơn String2, hàm StrComp sẽ trả về -1.
Nếu String1 lớn hơn String2, hàm StrComp sẽ trả về 1.
Nếu String1 hoặc String2 là NULL, hàm StrComp sẽ trả về NULL.

Ví dụ:
Mã:
Sub STRCOMP_Fn()
Debug.Print StrComp("A", "B") 'Result: -1
Debug.Print StrComp("Toi", "Ban") 'Result: 1
Debug.Print StrComp("vidu", "vidu") 'Result: 0
Debug.Print StrComp("AB", "") 'Result: Null
End Sub
22. StrConv
StrConv(String,Conversion As VbStrConv,[LocaleID as Long]) 'As String
Trả về một chuỗi được chuyển sang chữ hoa, chữ thường, in hoa ký tự đầu mỗi từ hoặc Unicode.
String: Chuỗi đưa vào để chuyển đổi.
Conversion: Kiểu chuyển đổi
Tham số
Value​
Chú thích
vbUpperCase
1​
Chuyển thành chữ in hoa
vbLowerCase
2​
Chuyển thành chữ in thường
vbProperCase
3​
Chuyển chữ cái đầu tiên cho mỗi từ thành chữ hoa. Tất cả các ký tự khác được để lại dưới dạng chữ thường.
vbUnicode
64​
Chuyển chuỗi thành chuỗi ở dạng bảng mã Unicode.
vbFromUnicode
128​
Chuyển đổi chuỗi từ bảng mã Unicode sang bảng mã mặc định của hệ thống.
LocaleID: Không bắt buộc. Nếu tham số này bỏ qua thì nó lấy địa chỉ của hệ thống.

Ví dụ:
Mã:
Sub STRCONV_Fn()
Debug.Print STRCONV("chuyen thanh chu hoa", vbUpperCase)
Debug.Print STRCONV("CHU THUONG", vbLowerCase)
Debug.Print STRCONV("Chu nua mua", vbProperCase)
End Sub
23. StrReverse
StrReverse(Expression As String) 'As String
Trả về chuỗi mới với các ký tự có thứ tự đảo ngược.

Ví dụ:
Mã:
Sub STRREVERSE_Fn()
Debug.Print StrReverse("Expression As String")
'Result: "gnirtS sA noisserpxE"
End Sub
24. Trim
Trim(String) 'As String
Loại bỏ khoảng trắng ở đầu và cuối của chuỗi.

Ví dụ:
Mã:
Sub TRIM_Fn()
Debug.Print Trim(" Loai khoang trang hai dau. ")
End Sub
25. Val
Val(String as String) 'As Double
Trả về các số được tìm thấy trong một chuỗi.
Lưu ý:
Hàm VAL sẽ ngừng đọc chuỗi khi nó gặp ký tự không phải là số đầu tiên, trừ khoảng trắng Chr(32).

Ví dụ:
Mã:
Sub VAL_Fn()
Debug.Print Val("1 " & Chr(32) & "2345 la 1 vi du ")
'Result: 12345
End Sub
 
Sửa lần cuối:
Cảm ơn chủ topic . Một bài tổng hợp tóm tắt rất bổ ích. Nhưng mỗi hàm khi sử dụng đều có những chú ý.
Ví dụ ở mục 22 StrConv sẽ có các chú ý mà diễn đàn đã nêu :
Trích lời admin tuhocvba:
Hàm StrConv này thật bất tiện nếu như sản phẩm này mang cho nhiều người dùng, và thiết định trên máy tính của mọi người lại không giống nhau.
 

tuhocvba

Administrator
Thành viên BQT
Đây là một topic tổng hợp rất quý giá. Về việc những lưu ý, thì không ai có thể chỉ ra hết được đâu. Mọi người có lưu ý gì thì comment cụ thể trong topic này. Tôi sẽ rất lấy làm biết ơn.

Tối ví dụ trước nhé.
24-Trim.
Hàm này nói là loại khoảng trắng :
Mã:
Trim("     a  ") = "a"
Nhưng nếu là dấu Tab thì nó không loại bỏ khoảng trắng được đâu nhé. Không biết mọi người đang loại bỏ khoảng trắng như thế nào, mình thì đang dùng hàm tự tạo.
 

NhanSu

SMod
Thành viên BQT
Để xóa ký tự tab có thể dùng lệnh application.clean
Lệnh application.trim cũng tốt hơn vba.trim vì application.trim xóa được khoảng trắng liền nhau nằm giữa văn bản.
 

Euler

Administrator
Thành viên BQT
Đối với trim do không có tác dụng nếu là tab ở đầu hay cuối, có thể xử lý như sau:
Mã:
s2 = Replace(s, vbTab, " ", , , vbTextCompare)
    s2 = Trim(s2)
 

vistaab

Yêu THVBA
Đây là một topic tổng hợp rất quý giá. Về việc những lưu ý, thì không ai có thể chỉ ra hết được đâu. Mọi người có lưu ý gì thì comment cụ thể trong topic này. Tôi sẽ rất lấy làm biết ơn.
Những nội dung tôi post trên có là kết quả sưu tầm trên mạng. Trong nội dung gốc sử dụng hàm msgbox để hiển thị kết quả trong các ví dụ. Khi tôi tự học và tự thực hành thì thấy nên dùng debug.print để lấy kết quả cho nhanh nên đã sửa đổi nội dung như trên.
Hiện tại tôi cũng đang tự mày mò học vba trên excel, và có dự định chia sẻ thêm về: Hàm xử lý về ngày tháng, thời gian; Hàm về Toán học; Hàm xử lý về tập tin và thư mục; Hàm chuyển đổi kiểu dữ liệu... Mong nhận được sự ủng hộ thêm của các bạn để hoàn thiện nội dung bài viết và kiến thức.
 

NhanSu

SMod
Thành viên BQT
Mời bạn chia sẻ tiếp. Mọi người sẽ đóng góp ý kiến bổ sung. Ví dụ trong chủ đề này, mình bổ sung hàm Mid ngoài cách sử dụng ở trên (trích xuất nội dung chuỗi con) còn có thể dùng để sửa đổi trực tiếp chuỗi con như sau:
Mã:
Dim S as string
S="abc"
Mid(S,2,1)=a"
Kết quả chuỗi s bị thay đổi thành "aac".
 
Top