Thay thế(Replace) nhiều từ thành một từ. . . (1 người xem)

Liên hệ QC

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

zPeterPan

Thành viên hoạt động
Tham gia
27/2/21
Bài viết
154
Được thích
11
Em chào các anh chị em. Mọi người cho em hỏi về cách thay thế( Replace) với ạ. . .
ví dụ là:
QW hoặc WQ đổi thành QWxWQ
ER hoặc RE đổi thành ERxRE
TY hoặc YT đổi thành TYxYT
UI hoặc IU đổi thành UIxIU
trong mảng dữ liệu khoảng từ A3:AZ10000
Em có dùng theo cách record macro nhưng khi chạy thì ra kết quả kiểu như này ạ QWxQWxWQ, ERxERxRE,QQxQQxYY .
Nhờ mọi người giúp em code này với ạ. . .
File này là ví dụ thôi ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Em chào các anh chị em. Mọi người cho em hỏi về cách thay thế( Replace) với ạ. . .
ví dụ là:
AB đổi thành ABxBA
CD đổi thành CDxDC
EF đổi thành EFxFE
BA đổi thành ABxBA
DC đổi thành CDxDC
FE đổi thành EFxFE
trong mảng dữ liệu khoảng từ A3:AZ10000
Em có dùng theo cách record macro nhưng khi chạy thì ra kết quả kiểu như này ạ ABxABxBA,CDxCDxDC ,EFxEFxFE .
Nhờ mọi người giúp em code này với ạ. . .
File này là ví dụ thôi ạ
Thử code này xem:
Mã:
Option Explicit

Sub ABC()
Dim sArr(), dArr(), I&, J&, U1&, U2&
With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        For J = 1 To U2
            dArr(I, J) = StrReverse(sArr(I, J)) & "x" & sArr(I, J)
        Next
    Next
    .Range("G3").Resize(U1, U2) = dArr
End With
End Sub
 
Upvote 0
Thử code này xem:
Mã:
Option Explicit

Sub ABC()
Dim sArr(), dArr(), I&, J&, U1&, U2&
With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        For J = 1 To U2
            dArr(I, J) = StrReverse(sArr(I, J)) & "x" & sArr(I, J)
        Next
    Next
    .Range("G3").Resize(U1, U2) = dArr
End With
End Sub
Em cảm ơn bác. . . Nếu là giá trị AB thì đổi thành ABxBA , nhưng nếu là AA hoặc BB thì code chạy ra là AAxAA, BBxBB ạ
1.JPG
 
Upvote 0
Function DoiChac(byval strDoi as string) as string
Dim listDoi as variant, listChac as variant, index as long
listDoi = array("AB","CD","EF","BA","DC","FE")
listChac = array("ABxBA", ...)
On error resume next
index = application.match(strDoi, listDoi, 0)
If err.number = 0 then
DoiChac = listChac (index-1)
End if
On error goto 0
End Function
 
Upvote 0
Function DoiChac(byval strDoi as string) as string
Dim listDoi as variant, listChac as variant, index as long
listDoi = array("AB","CD","EF","BA","DC","FE")
listChac = array("ABxBA", ...)
On error resume next
index = application.match(strDoi, listDoi, 0)
If err.number = 0 then
DoiChac = listChac (index-1)
End if
On error goto 0
End Function
nếu là "AA" thì mình có phải thêm vào listChac là "AAxBB" phải không ạ
 
Upvote 0
nếu là "AA" thì mình có phải thêm vào listChac là "AAxBB" phải không ạ
Đúng rồi.

Bài 1 của bạn. Bạn mô tả rõ quy định đầu vào, đầu ra (bao nhiêu ký tự, điểm gì đặc biệt), quy luật từ vào tới ra như nào?.

Cái đặc biệt là khi đầu vào mà ký tự trước có vị trí trong bảng chữ cái lớn hơn ký tự sau thì làm xyz mình lại bí mật không nói ra. :-p
 
Upvote 0
Thế quy luật chạy ra cái này là như thế nào, hay là do quy ước? nếu là quy ước thì bảng quy ước đâu?
dạ. . . quy luật là ký tự viết tắt ạ ( Q,W,E,R,T,Y,U,I,O,P) trong đó ( nếu là QQ hoặc YY thì là "QQxYY" , nếu là WW hoặc UU thì là "WWxUU", nếu là EE hoặc II thì là "EExII", nếu là RR hoặc OO thì là "RRxOO", còn nếu là TT hoặc PP thì là "TTxPP" ) đây anh ạ
Bài đã được tự động gộp:

Đúng rồi.

Bài 1 của bạn. Bạn mô tả rõ quy định đầu vào, đầu ra (bao nhiêu ký tự, điểm gì đặc biệt), quy luật từ vào tới ra như nào?.

Cái đặc biệt là khi đầu vào mà ký tự trước có vị trí trong bảng chữ cái lớn hơn ký tự sau thì làm xyz mình lại bí mật không nói ra. :p
dạ vâng ạ. đây là ký tự viết tắt ạ .bài #10 em có trình bày rồi ạ. . . Ở bài #1 em có kèm theo file đấy ạ. Bác xem giúp em ạ. . .
 
Lần chỉnh sửa cuối:
Upvote 0
dạ vâng ạ. . . A và B là em viết chữ đầu trong bảng chữ cái thôi ạ . . .hề hề
Quất đại rồi tính tiếp:
Mã:
Option Explicit

Sub ABC()
Dim sArr(), dArr(), I&, J&, K&, U1&, U2&, str$
str = ".QQxYY.WWxUU.EExII.RRxOO.TTxPP."
str = Replace(str, ".", "     ") '5 khoang trang
With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        For J = 1 To U2
            K = InStr(str, sArr(I, J))
            If K Then
                dArr(I, J) = Trim(Mid(str, K - 5, 10))
            Else
            dArr(I, J) = StrReverse(sArr(I, J)) & "x" & sArr(I, J)
            End If
        Next
    Next
    .Range("G3").Resize(U1, U2) = dArr
End With
End Sub
 
Upvote 0
Em chào các anh chị em. Mọi người cho em hỏi về cách thay thế( Replace) với ạ. . .
ví dụ là:
QW hoặc WQ đổi thành QWxWQ
ER hoặc RE đổi thành ERxRE
TY hoặc YT đổi thành TYxYT
UI hoặc IU đổi thành UIxIU
trong mảng dữ liệu khoảng từ A3:AZ10000
Em có dùng theo cách record macro nhưng khi chạy thì ra kết quả kiểu như này ạ QWxQWxWQ, ERxERxRE,QQxQQxYY .
Nhờ mọi người giúp em code này với ạ. . .
File này là ví dụ thôi ạ
Chạy code
Mã:
Sub ABC()
  Dim sArr(), Res(), i&, j&, k&, sRow&, sCol&, str$, str2$
 
  str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
  str2 = "EWQ"
  With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    sRow = UBound(sArr, 1): sCol = UBound(sArr, 2)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      For j = 1 To sCol
        tmp = sArr(i, j)
        k = InStr(str, tmp)
        If k Then
          Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5)
        Else
          If InStr(1, str2, Mid(tmp, 2, 1)) > InStr(1, str2, Mid(tmp, 1, 1)) Then
            tmp = StrReverse(tmp)
          End If
          Res(i, j) = tmp & "x" & StrReverse(tmp)
        End If
      Next
    Next
    .Range("G3").Resize(sRow, sCol) = Res
  End With
End Sub
 
Upvote 0
Quất đại rồi tính tiếp:
Mã:
Option Explicit

Sub ABC()
Dim sArr(), dArr(), I&, J&, K&, U1&, U2&, str$
str = ".QQxYY.WWxUU.EExII.RRxOO.TTxPP."
str = Replace(str, ".", "     ") '5 khoang trang
With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    U1 = UBound(sArr, 1): U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        For J = 1 To U2
            K = InStr(str, sArr(I, J))
            If K Then
                dArr(I, J) = Trim(Mid(str, K - 5, 10))
            Else
            dArr(I, J) = StrReverse(sArr(I, J)) & "x" & sArr(I, J)
            End If
        Next
    Next
    .Range("G3").Resize(U1, U2) = dArr
End With
End Sub
Em sửa được lỗi ngược rồi ạ. . . nhưng anh cho em hỏi nếu các cột có độ dài khác nhau thì tính bị lỗi ạ
Chạy code
Mã:
Sub ABC()
  Dim sArr(), Res(), i&, j&, k&, sRow&, sCol&, str$, str2$

  str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
  str2 = "EWQ"
  With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    sRow = UBound(sArr, 1): sCol = UBound(sArr, 2)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      For j = 1 To sCol
        tmp = sArr(i, j)
        k = InStr(str, tmp)
        If k Then
          Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5)
        Else
          If InStr(1, str2, Mid(tmp, 2, 1)) > InStr(1, str2, Mid(tmp, 1, 1)) Then
            tmp = StrReverse(tmp)
          End If
          Res(i, j) = tmp & "x" & StrReverse(tmp)
        End If
      Next
    Next
    .Range("G3").Resize(sRow, sCol) = Res
  End With
End Sub
1233.JPG
Em cảm ơn anh HieuCD. . . Nhưng nếu trường hợp độ dài cột trong mảng không bằng nhau thì kết quả lại những ô trống thì đều cho ra kết quả "QQxYY" anh ạ
 
Upvote 0
Em sửa được lỗi ngược rồi ạ. . . nhưng anh cho em hỏi nếu các cột có độ dài khác nhau thì tính bị lỗi ạ

View attachment 254902
Em cảm ơn anh HieuCD. . . Nhưng nếu trường hợp độ dài cột trong mảng không bằng nhau thì kết quả lại những ô trống thì đều cho ra kết quả "QQxYY" anh ạ
Them điều kiện loại ô rổng
Mã:
Sub ABC()
  Dim sArr(), Res(), i&, j&, k&, sRow&, sCol&, str$, str2$
 
  str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
  str2 = "EWQ"
  With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    sRow = UBound(sArr, 1): sCol = UBound(sArr, 2)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      For j = 1 To sCol
        tmp = sArr(i, j)
        If tmp <> Empty Then
          k = InStr(str, tmp)
          If k Then
            Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5)
          Else
            If InStr(1, str2, Mid(tmp, 2, 1)) > InStr(1, str2, Mid(tmp, 1, 1)) Then
              tmp = StrReverse(tmp)
            End If
            Res(i, j) = tmp & "x" & StrReverse(tmp)
          End If
        End If
      Next
    Next
    .Range("G3").Resize(sRow, sCol) = Res
  End With
End Sub
 
Upvote 0
Them điều kiện loại ô rổng
Mã:
Sub ABC()
  Dim sArr(), Res(), i&, j&, k&, sRow&, sCol&, str$, str2$

  str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
  str2 = "EWQ"
  With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    sRow = UBound(sArr, 1): sCol = UBound(sArr, 2)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      For j = 1 To sCol
        tmp = sArr(i, j)
        If tmp <> Empty Then
          k = InStr(str, tmp)
          If k Then
            Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5)
          Else
            If InStr(1, str2, Mid(tmp, 2, 1)) > InStr(1, str2, Mid(tmp, 1, 1)) Then
              tmp = StrReverse(tmp)
            End If
            Res(i, j) = tmp & "x" & StrReverse(tmp)
          End If
        End If
      Next
    Next
    .Range("G3").Resize(sRow, sCol) = Res
  End With
End Sub
Đoạn này có nghĩa là gì vậy ạ: " Mid(str, Int(k / 6) * 6 + 1, 5)"
Bài đã được tự động gộp:

 
Lần chỉnh sửa cuối:
Upvote 0
Đoạn này có nghĩa là gì vậy ạ: " Mid(str, Int(k / 6) * 6 + 1, 5)"
Bài đã được tự động gộp:
str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
Tính cả dấu "," mỗi kết quả có 6 ký tự
Int(k / 6) * 6 + 1: là thứ tự của kết quả cần lấy trong chuổi str
Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5) là kết quả thay thế
 
Upvote 0
str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
Tính cả dấu "," mỗi kết quả có 6 ký tự
Int(k / 6) * 6 + 1: là thứ tự của kết quả cần lấy trong chuổi str
Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5) là kết quả thay thế
Vâng ạ. . . em cảm ơn anh nhiều ạ. . .
anh cho em hỏi chút tại sao em dùng Remove Duplicates nhưng không lọc trùng được hết cả mảng được ạ. . .

456.JPG
 
Upvote 0
Upvote 0
Chỉ là một quy luật chung (XY thành XYxYZ) và một cái bảng tra các trường hợp ngoại lệ (TE > ETxTE, UU > WWxUU, ...) nhưng thớt lười lập cái bảng tra cbo nên đến 20 bài mới xong.
Bi giờ "thêm chút" nữa. Để xem bao nhiêu bài.
 
Upvote 0
Nếu mảng gồm nhiều cột, Remove Duplicates loại trùng giá trị cho cả dòng
Bảng Data, Dòng 3 và 5 không trùng vì chỉ cần có E3<>E5
ý của em là lọc trùng cho bảng Kết quả Data cơ ạ
Bài đã được tự động gộp:

Chỉ là một quy luật chung (XY thành XYxYZ) và một cái bảng tra các trường hợp ngoại lệ (TE > ETxTE, UU > WWxUU, ...) nhưng thớt lười lập cái bảng tra cbo nên đến 20 bài mới xong.
Bi giờ "thêm chút" nữa. Để xem bao nhiêu bài.
Do em trình bày sơ sài nên mọi người không rõ nội dung nên nhiều bài ạ. . .
 
Upvote 0
Chạy code
Mã:
Sub ABC()
  Dim sArr(), Res(), i&, j&, k&, sRow&, sCol&, str$, str2$

  str = "QQxYY,WWxUU,EExII,RRxOO,TTxPP"
  str2 = "EWQ"
  With Sheets("Sheet1")
    sArr = .Range("A3:E18").Value
    sRow = UBound(sArr, 1): sCol = UBound(sArr, 2)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      For j = 1 To sCol
        tmp = sArr(i, j)
        k = InStr(str, tmp)
        If k Then
          Res(i, j) = Mid(str, Int(k / 6) * 6 + 1, 5)
        Else
          If InStr(1, str2, Mid(tmp, 2, 1)) > InStr(1, str2, Mid(tmp, 1, 1)) Then
            tmp = StrReverse(tmp)
          End If
          Res(i, j) = tmp & "x" & StrReverse(tmp)
        End If
      Next
    Next
    .Range("G3").Resize(sRow, sCol) = Res
  End With
End Sub
Không biết có kiểu "OR", "OT"... không, nếu có thì code chưa đúng ý thì phải bác ạ
 
Upvote 0
Không biết có kiểu "OR", "OT"... không, nếu có thì code chưa đúng ý thì phải bác ạ
có kiểu đó chứ ạ, ký tự gồm có 10 ký tự ( POIUYTREWQ) kết hợp với nhau thành 2 ký tự. . . code của bác chạy đúng hướng. . . và phải thêm dữ liệu cho (str= ) thì kết quả đúng ý tưởng luôn ạ. . .
 
Upvote 0
có kiểu đó chứ ạ, ký tự gồm có 10 ký tự ( POIUYTREWQ) kết hợp với nhau thành 2 ký tự. . . code của bác chạy đúng hướng. . . và phải thêm dữ liệu cho (str= ) thì kết quả đúng ý tưởng luôn ạ. . .
Vậy thì code bác ấy str2 bạn sửa thành chuỗi "POIUYTREWQ" là được (đoán vậy :D )
 
Upvote 0
Mình thử nhiều lần, nếu trùng sẽ xóa nguyên dòng
56788.JPG

Sub RemoveDuplicates() With Sheet1 Range("M3:M11").Select ActiveSheet.Range("$M$3:$M$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("N3:N11").Select ActiveSheet.Range("$N$3:$N$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("O3:O10").Select ActiveSheet.Range("$O$3:$O$10").RemoveDuplicates Columns:=1, Header:=xlNo Range("P3:P11").Select ActiveSheet.Range("$P$3:$P$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("Q3:Q9").Select ActiveSheet.Range("$Q$3:$Q$9").RemoveDuplicates Columns:=1, Header:=xlNo End With End Sub
nếu như khoảng 1000 cột thì sao ạ
 
Upvote 0
View attachment 254913

Sub RemoveDuplicates() With Sheet1 Range("M3:M11").Select ActiveSheet.Range("$M$3:$M$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("N3:N11").Select ActiveSheet.Range("$N$3:$N$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("O3:O10").Select ActiveSheet.Range("$O$3:$O$10").RemoveDuplicates Columns:=1, Header:=xlNo Range("P3:P11").Select ActiveSheet.Range("$P$3:$P$11").RemoveDuplicates Columns:=1, Header:=xlNo Range("Q3:Q9").Select ActiveSheet.Range("$Q$3:$Q$9").RemoveDuplicates Columns:=1, Header:=xlNo End With End Sub
nếu như khoảng 1000 cột thì sao ạ
Bạn lập thớt mới, với dữ liệu và yêu cầu xử lý, thêm bảng kết quả. Nói rỏ có loại trùng dữ liệu khác cột không
 
Upvote 0

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

Back
Top Bottom