Tạo Function thay thế chuỗi trong một chuỗi! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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!
 

File đính kèm

Function ThayThe(val As String) As String
Dim Rng As Range
For Each Rng In Sheets("Replace").Range("E5:E18")
val = Replace(val, Rng.Value, Rng.Offset(, 1).Value)
Next
ThayThe = val
End Function
 
Upvote 0
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!

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 = 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
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Upvote 0
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
Chi cho cực vậy? Bạn sửa lại 1 chút sẽ không cần thêm hàm ConvertTo1DArray
PHP:
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
Tuy nhiên, bất cứ so sánh chuỗi nào cũng cần phải lưu ý đến CompareMode, bởi ai biết được người dùng muốn so sánh kiểu gì, có phân biệt HOA thường hay không?
Vụ CompareMode các bạn tự sửa lấy nhé
 
Upvote 0
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
 
Upvote 0
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
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ụ:
Mã:
UniConvert("Nguye64n Anh Tua61n",  "VNI")
Sẽ cho kết quả là Nguyễn Anh Tuấn
(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ý!
 
Upvote 0
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ụ:
Mã:
UniConvert("Nguye64n Anh Tua61n",  "VNI")
Sẽ cho kết quả là Nguyễn Anh Tuấn
(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ý!

Giả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).
 
Upvote 0
Giả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).
Thắng cho một ví dụ cụ thể thử xem
 
Upvote 0
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
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.
 
Upvote 0
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
giả sử a->b
c->d thì thay a thành một chuỗi lạ hoắc 1, rồi c thành một chuỗi lạ hoắc 2. rồi mới thay các chuỗi lạ hoắc thành b và d. nó sẽ cxhayj chậm chút
 
Upvote 0
Thắng cho một ví dụ cụ thể thử xem
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".
 
Upvote 0
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ì 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 được
Còn nếu muốn viết 1 code thật tổng quát thì ta dần dần tiến tới việc xử lý ngôn ngữ rồi. Tin chắc chỉ có ông lớn Google hay Microsoft mới có được thuật toán tối ưu
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom