Giúp code đổi tên theo điều kiện

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Văn Toàn 1996

Thành viên hoạt động
Tham gia
5/6/23
Bài viết
102
Được thích
22
Chào tất cả mọi người . Mình cần 1 đoạn code đổi 1 tên trong 1 vùng như ảnh mô tả bên dưới
Tên mặt hàng có 2 kiểu , Kiểu 1 là Tên gốc ( Ví dụ: Cam ) , Kiểu 2 thì mình nối thêm -1,-2... ( Ví dụ: Cam-1, Cam-2 ) mình muốn đổi tên mặt hàng là Cam sang Ngô thì chỉ áp dụng cho các tên ký tự bên tay Trái là Cam Hoặc tên có nối Cam-1, Cam-2...Các tên mặt hàng không thỏa mãn điều kiện trên thì vẫn giử nguyên , Và code không phân biệt chữ Hoa và Chữ Thường. Xin chân thành cảm ơn

1698115565865.png
 

File đính kèm

  • doi ten.xlsm
    16.9 KB · Đọc: 6
Dùng tạm trong khi chờ phương án khác:

PHP:
Option Explicit
Sub doiten()
Dim lr&, i&, rng, res(), oldV As String, newV As String
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("B3:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
oldV = Range("D3").Value: newV = Range("E3").Value
For i = 1 To UBound(rng)
    If Len(rng(i, 1)) = Len(oldV) Or rng(i, 1) & "-" Like oldV & "-*" Then
        res(i, 1) = Replace(rng(i, 1), oldV, newV)
    Else
        res(i, 1) = rng(i, 1)
    End If
Next
Range("G3:G10000").ClearContents
Range("G3").Resize(UBound(res), 1).Value = res
End Sub
 

File đính kèm

  • doi ten.xlsm
    18.3 KB · Đọc: 6
Upvote 0
Dùng tạm trong khi chờ phương án khác:

PHP:
Option Explicit
Sub doiten()
Dim lr&, i&, rng, res(), oldV As String, newV As String
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("B3:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
oldV = Range("D3").Value: newV = Range("E3").Value
For i = 1 To UBound(rng)
    If Len(rng(i, 1)) = Len(oldV) Or rng(i, 1) & "-" Like oldV & "-*" Then
        res(i, 1) = Replace(rng(i, 1), oldV, newV)
    Else
        res(i, 1) = rng(i, 1)
    End If
Next
Range("G3:G10000").ClearContents
Range("G3").Resize(UBound(res), 1).Value = res
End Sub
Cảm ơn bạn. Code chạy đúng thuật Toán mình mong muốn, Nhưng mình không muốn phân biệt chữ Hoa và chữ Thường , tức là ( CAM,cam, Cam, CAm ) đều được. Nhờ bạn sửa lại giúp
 
Upvote 0
Cảm ơn bạn. Code chạy đúng thuật Toán mình mong muốn, Nhưng mình không muốn phân biệt chữ Hoa và chữ Thường , tức là ( CAM,cam, Cam, CAm ) đều được. Nhờ bạn sửa lại giúp
Thử lại nhé....
PHP:
Option Explicit
Sub doiten()
Dim lr&, i&, rng, res(), oldV As String, newV As String
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("B3:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
oldV = UCase(Range("D3").Value): newV = Range("E3").Value
For i = 1 To UBound(rng)
    If UCase(rng(i, 1)) = oldV Or _
    (UCase(rng(i, 1)) & "-" Like oldV & "-*" And IsNumeric(Mid(rng(i, 1), Len(oldV) + 2, 1))) Then
        res(i, 1) = newV & Mid(rng(i, 1), Len(oldV) + 1, 255)
    Else
        res(i, 1) = rng(i, 1)
    End If
Next
Range("G3:G10000").ClearContents
Range("G3").Resize(UBound(res), 1).Value = res
End Sub
 
Upvote 0
Function DoiTenTraiCay(rg As Range, tcu As String, tmoi As String)
' returns the name of produce in rg, with tcu replaced by tmoi
' rules/conditons:
' tcu is at the left most place in string, eg. "Cam..."
' tcu may or may not be followed by a hyphen plus a number., eg. "Cam-1..."

Static rx As Object
' Set rx = Nothing ' sử dụng dòng này lúc debug, sau đó comment nó đi
If rx Is Nothing Then
Set rx = CreateObject("VBScript.RegExp")
rx.Global = True
rx.IgnoreCase = True
rx.Pattern = Replace("^(<TC>)(-[0-9]+)?$", "<TC>", tcu)
End If
DoiTenTraiCay = rx.Replace(rg.Value, tmoi & "$2")
End Function

Ô G3, gõ:,
=DoiTenTraiCay($B3, $D$3, $E$3)
Kéo xuống đến hết

Đính chính: code trước đây không có đánh dấu cuối chuỗi cho nên dòng "Cam Cam" sẽ ra sai. Đã chỉnh lại, thêm $ vào cuối pattern.
 
Lần chỉnh sửa cuối:
Upvote 0
Code chưa bẫy lỗi:

Mã:
Public Function ThayDoiTen(ByVal s As String, ByVal tenCu As String, ByVal tenMoi As String) As String
tenCu = UCase(tenCu)
ThayDoiTen = s
If UCase(Split(s & "-", "-")(0)) = tenCu Then ThayDoiTen = tenMoi & VBA.Mid(s, Len(tenCu) + 1)
End Function
 
Upvote 0
Thử lại nhé....
PHP:
Option Explicit
Sub doiten()
Dim lr&, i&, rng, res(), oldV As String, newV As String
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("B3:B" & lr).Value
ReDim res(1 To UBound(rng), 1 To 1)
oldV = UCase(Range("D3").Value): newV = Range("E3").Value
For i = 1 To UBound(rng)
    If UCase(rng(i, 1)) = oldV Or _
    (UCase(rng(i, 1)) & "-" Like oldV & "-*" And IsNumeric(Mid(rng(i, 1), Len(oldV) + 2, 1))) Then
        res(i, 1) = newV & Mid(rng(i, 1), Len(oldV) + 1, 255)
    Else
        res(i, 1) = rng(i, 1)
    End If
Next
Range("G3:G10000").ClearContents
Range("G3").Resize(UBound(res), 1).Value = res
End Sub
cảm ơn anh. Code đúng ý em rồi. em test rât kỹ không sai 1 trường hợp nào cả
1698205318728.png
 

File đính kèm

  • 1698205275226.png
    1698205275226.png
    83.9 KB · Đọc: 2
Upvote 0
Ngoài dùng các code trên, bạn xài công thức này xem:
=IFERROR(IF(AND(FIND($D$3;B3)=1;LEFT(B3;4)="-");REPLACE(B3;1;3;"Ngô");B3);B3)
1698205428813.png
 
Upvote 0
Web KT

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

Back
Top Bottom