HeSanbi
Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
- Tham gia
- 24/2/13
- Bài viết
- 2,781
- Được thích
- 4,423
- Giới tính
- Nam
Tôi có một Function dùng Hàm Replace để thay thế chuỗi
mong GPE giúp tôi rút gọn Function bằng vòng lặp
mong được sự giúp đỡ của GPE và cũng để học hỏi thêm về cách viết vòng lặp
xin cảm ơn!
Function ThayThe(val As String, range1 As Range, range2 As Range) As String
Dim sArr, dArr, I As Long
If Len(val) = 0 Then Exit Function
sArr = range1.Value: dArr = range2.Value
For I = 1 To UBound(sArr)
val = Replace(val, sArr(I, 1), dArr(I, 1))
Next I
ThayThe = val
End Function
Private Function ConvertTo1DArray(ByVal SourceArray)
Dim aTmp, Item, arr()
Dim n As Long
On Error Resume Next
aTmp = SourceArray
If Not IsArray(aTmp) Then aTmp = Array(aTmp)
For Each Item In aTmp
n = n + 1
ReDim Preserve arr(1 To n)
arr(n) = Item
Next
ConvertTo1DArray = arr
End Function
Function ThayThe(val As String, range1 As Range, range2 As Range) As String
Dim sArr, dArr, I As Long
If Len(val) = 0 Then Exit Function
sArr = ConvertTo1DArray(range1): dArr = ConvertTo1DArray(range2)
For I = LBound(sArr) To UBound(sArr)
val = Replace(val, sArr(I), dArr(I))
Next I
ThayThe = val
End Function
Chi cho cực vậy? Bạn sửa lại 1 chút sẽ không cần thêm hàm ConvertTo1DArraySử dụng thêm hàm ConvertTo1DArray của thầy ndu96081631 range1, range2 dọc ngang đều được
Mã:Private Function ConvertTo1DArray(ByVal SourceArray) Dim aTmp, Item, arr() Dim n As Long On Error Resume Next aTmp = SourceArray If Not IsArray(aTmp) Then aTmp = Array(aTmp) For Each Item In aTmp n = n + 1 ReDim Preserve arr(1 To n) arr(n) = Item Next ConvertTo1DArray = arr End Function
PHP:Function ThayThe(val As String, range1 As Range, range2 As Range) As String Dim sArr, dArr, I As Long If Len(val) = 0 Then Exit Function sArr = ConvertTo1DArray(range1): dArr = ConvertTo1DArray(range2) For I = LBound(sArr) To UBound(sArr) val = Replace(val, sArr(I), dArr(I)) Next I ThayThe = val End Function
Function ThayThe(ByVal val As String, ByVal range1 As Range, ByVal range2 As Range) As String
Dim I As Long
ThayThe = val
For I = 1 To range1.Count
ThayThe = Replace(ThayThe, range1(I), range2(I))
Next
End Function
Mình từng gặp vụ này vài lần, chẳng hạn ở hàm UniConvert. Mục đích của hàm là biến phương pháp gõ tiếng Việt thành tiếng Việt có dấu thật sự. Ví dụ:Vì chủ thớt có nói rằng "học hỏi thêm về cách viết vòng lặp" nên tôi cũng khuyến cáo:
Vòng lặp có nghĩa là lặp lại nhiều lần. Và mõi lần lặp có cái thứ thự của nó. Nếu không cẩn thận, không phân tích trước sự độc lập của mỗi lượt chạy, kết quả của lần n2 có thể chồng lên kết quả của lần n1. Hoặc kết quả của lần n2 cần phải có sử hoạt động của lần n1
Ví dụ thay thế chuỗi là ví dụ điển hình của trường hợp "mỗi lượt không hẳn độc lập này"
Chuỗi: "Tôi chỉ thích ăn cơm và không thích ăn cá"
thay thế: "chỉ" -> "không", "không thích" -> "luôn luôn"
Thứ tự thay thế có thể làm cho kết quả khác biệt
UniConvert("Nguye64n Anh Tua61n", "VNI")
Mình từng gặp vụ này vài lần, chẳng hạn ở hàm UniConvert. Mục đích của hàm là biến phương pháp gõ tiếng Việt thành tiếng Việt có dấu thật sự. Ví dụ:
Sẽ cho kết quả là Nguyễn Anh TuấnMã:UniConvert("Nguye64n Anh Tua61n", "VNI")
(hàm phục cho vụ việc gõ tiếng Việt trong môi trường VBA)
Cách giải quyết để tránh nhận kết quả sai: Sắp xếp bảng tra sao cho hợp lý nhất để ép code tìm và thay thế cái nào "to nhất" trước rồi dần dần sẽ thay thế đến cái "nhỏ". Ví dụ sẽ thay a61 trước rồi mới thay a6 sau
------------------------
Tương tự vậy cho bài toán này, cũng là sắp xếp bảng tra sao cho hợp lý!
Thắng cho một ví dụ cụ thể thử xemGiải pháp thay thế theo thứ tự giảm dần độ dài chuỗi bị thay thế chưa thể giải quyết triệt để bài toán thay thế nhiều giá trị. Trường hợp chuỗi thay thế này là một phần của chuỗi bị thay thế khác thì vẫn sai.
Theo em cần phải qua bộ chuỗi trung gian (chưa nghĩ ra cách nào hay hơn).
thuộc tính value thường trả lại mảng 2 chiều, duyệt theo hàng và cột là ok. còn về hàm convett mảng thì khó nhất là không biết kích thước mảng kết quả. nếu là value thì là 1 phần tử, mảng một chiều thì hiển nhiên quá, mảng hai chiều thì là tích row và colmun.Sử dụng thêm hàm ConvertTo1DArray của thầy ndu96081631 range1, range2 dọc ngang đều được
Mã:Private Function ConvertTo1DArray(ByVal SourceArray) Dim aTmp, Item, arr() Dim n As Long On Error Resume Next aTmp = SourceArray If Not IsArray(aTmp) Then aTmp = Array(aTmp) For Each Item In aTmp n = n + 1 ReDim Preserve arr(1 To n) arr(n) = Item Next ConvertTo1DArray = arr End Function
PHP:Function ThayThe(val As String, range1 As Range, range2 As Range) As String Dim sArr, dArr, I As Long If Len(val) = 0 Then Exit Function sArr = ConvertTo1DArray(range1): dArr = ConvertTo1DArray(range2) For I = LBound(sArr) To UBound(sArr) val = Replace(val, sArr(I), dArr(I)) Next I ThayThe = val End Function
giả sử a->bVì chủ thớt có nói rằng "học hỏi thêm về cách viết vòng lặp" nên tôi cũng khuyến cáo:
Vòng lặp có nghĩa là lặp lại nhiều lần. Và mõi lần lặp có cái thứ thự của nó. Nếu không cẩn thận, không phân tích trước sự độc lập của mỗi lượt chạy, kết quả của lần n2 có thể chồng lên kết quả của lần n1. Hoặc kết quả của lần n2 cần phải có sử hoạt động của lần n1
Ví dụ thay thế chuỗi là ví dụ điển hình của trường hợp "mỗi lượt không hẳn độc lập này"
Chuỗi: "Tôi chỉ thích ăn cơm và không thích ăn cá"
thay thế: "chỉ" -> "không", "không thích" -> "luôn luôn"
Thứ tự thay thế có thể làm cho kết quả khác biệt
Ví dụ đơn giản như chuỗi "ABC", thay "A" thành "B" và thay "B" thành "A". Hoặc chuỗi "NGUYỄN VĂN NAM HỌC TRUNG HỌC", thay "NGUYỄN VĂN NAM" thành "TRẦN QUỐC TRUNG" và "TRUNG HỌC" thành "ĐẠI HỌC".Thắng cho một ví dụ cụ thể thử xem
Thì thay "trung học" ---> "đại học" trước. Bởi dữ liệu trên Excel phải có giới hạn cho ngành nghề nào đó chứ không thể mông lung đượcVí dụ đơn giản như chuỗi "ABC", thay "A" thành "B" và thay "B" thành "A". Hoặc chuỗi "NGUYỄN VĂN NAM HỌC TRUNG HỌC", thay "NGUYỄN VĂN NAM" thành "TRẦN QUỐC TRUNG" và "TRUNG HỌC" thành "ĐẠI HỌC".