Find and replace theo 2 điều kiện (1 người xem)

  • Thread starter Thread starter LYSM
  • Ngày gửi Ngày gửi
Liên hệ QC

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

LYSM

Thành viên thường trực
Tham gia
16/3/11
Bài viết
290
Được thích
26
Em chào các thầy cô, anh chị!
Nhờ các thầy cô, anh chị cho em xin code find and replace với 2 điều kiện như file đính kèm, em đã tìm các chủ đề tương tự nhưng code không áp dụng được với trường hợp của em mà em lại không biết chỉnh sửa code theo ý mình. Mong các thầy, cô, anh, chị giúp đỡ ạ.
Em cảm ơn nhiều!
 

File đính kèm

Hàm lookup có khả năng tìm trên nhiều điều kiện. Dùng hàm này để tìm trong bảng đổi, điều kiện thứ nhất là đúng MSP, điều kiện thứ hai là khác MKH

Tìm từ khoá Lookup(2, 1/cái gì đó)
 
Upvote 0
Em chào các thầy cô, anh chị!
Nhờ các thầy cô, anh chị cho em xin code find and replace với 2 điều kiện như file đính kèm, em đã tìm các chủ đề tương tự nhưng code không áp dụng được với trường hợp của em mà em lại không biết chỉnh sửa code theo ý mình. Mong các thầy, cô, anh, chị giúp đỡ ạ.
Em cảm ơn nhiều!
Làm vầy đi, code chi cho mệt
Mã:
 =IF(AND(COUNTIF($M$2:$M$3,A2)=0,COUNTIF(C2,$K$2:$K$11)>0),VLOOKUP(C2,$K$2:$L$11,2,0),C2)
 
Upvote 0
Cảm ơn tất cả mọi người, nhưng em muốn xin code VBA vì dữ liệu của em lên đến 7000-10000 dòng, làm công thức sẽ nặng file với lại em muốn thay nó vào chính cột C (Mã SP) mà công thức thì không thể lấy tham chiếu chính nó được, lại phải làm ra 1 cột khác sau đó copy lại vào cột đó.
 
Upvote 0
Cảm ơn tất cả mọi người, nhưng em muốn xin code VBA vì dữ liệu của em lên đến 7000-10000 dòng, làm công thức sẽ nặng file với lại em muốn thay nó vào chính cột C (Mã SP) mà công thức thì không thể lấy tham chiếu chính nó được, lại phải làm ra 1 cột khác sau đó copy lại vào cột đó.
Làm xong thì xóa cột công thức chứ bạn để làm gì mà nặng file.

Có thể bạn nghĩ bấm nút một cái (vài giây) sẽ nhanh hơn làm bằng công thức. Nhưng bạn có nghĩ đến viết ra code có thể mất 15 phút trong khi bạn làm công thức chỉ mất vài phút.
 
Upvote 0
Cảm ơn tất cả mọi người, nhưng em muốn xin code VBA vì dữ liệu của em lên đến 7000-10000 dòng, làm công thức sẽ nặng file với lại em muốn thay nó vào chính cột C (Mã SP) mà công thức thì không thể lấy tham chiếu chính nó được, lại phải làm ra 1 cột khác sau đó copy lại vào cột đó.
Thật là lý do hết mức!
 
Upvote 0
Làm xong thì xóa cột công thức chứ bạn để làm gì mà nặng file.

Có thể bạn nghĩ bấm nút một cái (vài giây) sẽ nhanh hơn làm bằng công thức. Nhưng bạn có nghĩ đến viết ra code có thể mất 15 phút trong khi bạn làm công thức chỉ mất vài phút.
Em hiểu ý của bác, cảm ơn bác đã góp ý, có thể lập công thức sẽ nhanh hơn, nhưng thao tác để copy 7k dòng dữ liệu và ngày nào cũng lặp đi lặp lại thế sẽ lâu hơn rất nhiều so với code chưa kể có thể gây nhầm lẫn nữa. Nên em nghĩ viết code chỉ tốn 1 lần mà sau này dùng tiện hơn nhiều, em cũng mày mò tự làm nhưng không làm được, cực chẳng đã mới phải lên đây nhờ cậy mọi người ạ.
 
Upvote 0
Thật là lý do hết mức!
haiz, công thức thì em cũng đã làm rồi ạ, nhưng trong quá trình sử dụng hàng ngày em nhận ra sự bất tiện của nó nên em mới lên xin code, nếu dữ liệu chỉ có như file đính kèm thì không nói làm gì, nhưng nó rất nhiều, chỉ thêm 1 động tác thừa hay nhầm lẫn sẽ gây mất nhiều thời gian.
 
Upvote 0
Cảm ơn tất cả mọi người, nhưng em muốn xin code VBA vì dữ liệu của em lên đến 7000-10000 dòng, làm công thức sẽ nặng file với lại em muốn thay nó vào chính cột C (Mã SP) mà công thức thì không thể lấy tham chiếu chính nó được, lại phải làm ra 1 cột khác sau đó copy lại vào cột đó.
Chạy thử đoạn code này xem sao
Mã:
Public Sub ThayThe()
Dim Nguon, r As Long

Nguon = Sheet1.Range("K1").CurrentRegion
With CreateObject("scripting.dictionary")
For r = 2 To UBound(Nguon)
.Add Nguon(r, 1), Array(Nguon(r, 3), Nguon(r, 2))
Next r

Nguon = Sheet1.Range("A1").CurrentRegion
For r = 2 To UBound(Nguon)
If .exists(Nguon(r, 3)) Then
If Nguon(r, 1) <> .Item(Nguon(r, 3))(0) Then
Nguon(r, 3) = .Item(Nguon(r, 3))(1)
End If
End If
Next r
End With

With Sheet1
.Range("A1").CurrentRegion.ClearContents
.Range("A1").Resize(UBound(Nguon), UBound(Nguon, 2)) = Nguon
End With
End Sub
---
Cột MSP, các mã phải là duy nhất.
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy thử đoạn code này xem sao
Mã:
Public Sub ThayThe()
Dim Nguon, r As Long

Nguon = Sheet1.Range("K1").CurrentRegion
With CreateObject("scripting.dictionary")
For r = 2 To UBound(Nguon)
.Add Nguon(r, 1), Array(Nguon(r, 3), Nguon(r, 2))
Next r

Nguon = Sheet1.Range("A1").CurrentRegion
For r = 2 To UBound(Nguon)
If .exists(Nguon(r, 3)) Then
If Nguon(r, 1) <> .Item(Nguon(r, 3))(0) Then
Nguon(r, 3) = .Item(Nguon(r, 3))(1)
End If
End If
Next r
End With

With Sheet1
.Range("A1").CurrentRegion.ClearContents
.Range("A1").Resize(UBound(Nguon), UBound(Nguon, 2)) = Nguon
End With
End Sub
---
Cột MSP, các mã phải là duy nhất.

Điều kiện các MSP phải là duy nhất có hợp lý không?
Tôi cứ ngỡ đề bài này muốn mã SP1234 đổi thành SP4321 cho tất cả khách hàng, trừ khách hàng KH010203

Dạng bài này, nếu dùng đít thì phải dùng 2 đít. 1 để đổi mã sản phẩm, và 1 để xét những khách hàng không đổi.
Nếu muốn dùng 1 đít thì key là MSP, item là MSP mới. Nhưng đồng thời cũng ghi thêm key MSP+Mã KH
 
Lần chỉnh sửa cuối:
Upvote 0
Điều kiện các MSP phải là duy nhất có hợp lý không?
Tôi cứ ngỡ đề bài này muốn mã SP1234 đổi thành SP4321 cho tất cả khách hàng, trừ khách hàng KH010203
Là MSP nằm tại cột K, bên cạnh mã đổi. Là duy nhất trong vùng điều kiện so sánh
Còn tại A:D, những khách hàng có cùng mã, phù hợp với điều kiện tại K:M đều được đổi cả.

Dạng bài này, nếu dùng đít thì phải dùng 2 đít. 1 để đổi mã sản phẩm, và 1 để xét những khách hàng không đổi.
Nếu muốn dùng 1 đít thì key là MSP, item là MSP mới. Nhưng đồng thời cũng ghi thêm key MSP+Mã KH
Dic trong code cũng theo tiêu chí này.
Key là MSP cần đổi
Item là mảng, phần tử 0 là Mã KH, phần tử 1 là Mã đổi
Dữ liệu nạp dic lấy tai K:M
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu 1 mã SP có nhiều hơn 1 KH cần loại trừ thì sao?

[TABLE="width: 192"]
[TR]
[TD="class: xl68, width: 64"]MSP[/TD]
[TD="class: xl68, width: 64"]Mã đổi[/TD]
[TD="class: xl69, width: 64"]Mã loại trừ[/TD]
[/TR]
[TR]
[TD]01SB01[/TD]
[TD]01SB02[/TD]
[TD="class: xl67"]HL10151[/TD]
[/TR]
[TR]
[TD]01SB01[/TD]
[TD]01SB02[/TD]
[TD="class: xl67"]VM10111[/TD]
[/TR]
[TR]
[TD]01SX01[/TD]
[TD]01SX02[/TD]
[TD="class: xl67"]VM10111
[/TD]
[/TR]
[TR]
[TD]02AA20[/TD]
[TD]02AA22[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AA32[/TD]
[TD]02AA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AA43[/TD]
[TD]02AA43[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AG33[/TD]
[TD]02AG33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AU11[/TD]
[TD]02AU12[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA32[/TD]
[TD]02BA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA39[/TD]
[TD]02BA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA42[/TD]
[TD]02BA43[/TD]
[TD][/TD]
[/TR]
[/TABLE]

Chú: Bảng trên tôi trình bày theo kiểu chuẩn CSDL. Cũng có khi người ta trình bày theo kiểu crosstab.
 
Upvote 0
Nếu 1 mã SP có nhiều hơn 1 KH cần loại trừ thì sao?

[TABLE="width: 192"]
[TR]
[TD="class: xl68, width: 64"]MSP[/TD]
[TD="class: xl68, width: 64"]Mã đổi[/TD]
[TD="class: xl69, width: 64"]Mã loại trừ[/TD]
[/TR]
[TR]
[TD]01SB01[/TD]
[TD]01SB02[/TD]
[TD="class: xl67"]HL10151[/TD]
[/TR]
[TR]
[TD]01SB01[/TD]
[TD]01SB02[/TD]
[TD="class: xl67"]VM10111[/TD]
[/TR]
[TR]
[TD]01SX01[/TD]
[TD]01SX02[/TD]
[TD="class: xl67"]VM10111[/TD]
[/TR]
[TR]
[TD]02AA20[/TD]
[TD]02AA22[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AA32[/TD]
[TD]02AA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AA43[/TD]
[TD]02AA43[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AG33[/TD]
[TD]02AG33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02AU11[/TD]
[TD]02AU12[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA32[/TD]
[TD]02BA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA39[/TD]
[TD]02BA33[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]02BA42[/TD]
[TD]02BA43[/TD]
[TD][/TD]
[/TR]
[/TABLE]
Cái kẹt nhất ở đây là trường hợp nhiều hơn 1 thì không biết MSP giống nhau thì mã loại trừ có giống nhau hay không.
Nếu MSP giống nhau, Mã loại trừ giống nhau thì thêm bước kiểm tra tồn tại trong dic là được.
Nếu MSP giống nhau, Mã loại trừ khác nhau thì có lẽ phải thay đổi lại các nạp dic.
---
Có lẽ nếu MSP giống nhau, Mã loại trừ khác nhau sẽ tạo key=MSP+Mã loại trừ
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 bác HungQuoc49 và VietMini, để em nói lại điều kiện của để bài các bác xem giúp code vậy đã ổn chưa (do em mù code nên ngoài khả năng).
1. Mỗi MSP (cột K) chỉ có duy nhất 1 mã loại trừ tương ứng, cột MSP thì mỗi mã cũng chỉ xuất hiện duy nhất 1 lần.
2. Mỗi Mã KH có thể có nhiều Mã SP (cột C) và ngược lại mỗi Mã SP (cột C) có thể có nhiều Mã KH
Nhờ 2 bác xem giúp em ạ, mấy hôm nay em bận quá (trông mẹ em nằm viện) nên giờ mới phản hồi lại cho các bác.
PS: hình như code trên chưa ổn lắm ạ, vì nó chỉ thực hiện mỗi dòng có MSP tương ứng với Mã loại trừ.
Nó giống như công thức này là được ạ:
=IF(AND(COUNTIF($M$2:$M$3,A2)=0,COUNTIF(C2,$K$2:$K$11)>0),VLOOKUP(C2,$K$2:$L$11,2,0),C2)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 bác HungQuoc49 và VietMini, để em nói lại điều kiện của để bài các bác xem giúp code vậy đã ổn chưa (do em mù code nên ngoài khả năng).
1. Mỗi MSP (cột K) chỉ có duy nhất 1 mã loại trừ tương ứng, cột MSP thì mỗi mã cũng chỉ xuất hiện duy nhất 1 lần.
2. Mỗi Mã KH có thể có nhiều Mã SP (cột C) và ngược lại mỗi Mã SP (cột C) có thể có nhiều Mã KH
Nhờ 2 bác xem giúp em ạ, mấy hôm nay em bận quá (trông mẹ em nằm viện) nên giờ mới phản hồi lại cho các bác.
PS: hình như code trên chưa ổn lắm ạ, vì nó chỉ thực hiện mỗi dòng có MSP tương ứng với Mã loại trừ.
Nó giống như công thức này là được ạ:
=IF(AND(COUNTIF($M$2:$M$3,A2)=0,COUNTIF(C2,$K$2:$K$11)>0),VLOOKUP(C2,$K$2:$L$11,2,0),C2)
code bài trước đủ 2 điều kiện theo bài 1 của bạn.
Bạn chạy thử xem kết quả lỗi chỗ nào gửi file lên cho cụ thể.
 
Upvote 0
Cảm ơn 2 bác HungQuoc49 và VietMini, để em nói lại điều kiện của để bài các bác xem giúp code vậy đã ổn chưa (do em mù code nên ngoài khả năng).
1. Mỗi MSP (cột K) chỉ có duy nhất 1 mã loại trừ tương ứng, cột MSP thì mỗi mã cũng chỉ xuất hiện duy nhất 1 lần.
2. Mỗi Mã KH có thể có nhiều Mã SP (cột C) và ngược lại mỗi Mã SP (cột C) có thể có nhiều Mã KH
Nhờ 2 bác xem giúp em ạ, mấy hôm nay em bận quá (trông mẹ em nằm viện) nên giờ mới phản hồi lại cho các bác.
PS: hình như code trên chưa ổn lắm ạ, vì nó chỉ thực hiện mỗi dòng có MSP tương ứng với Mã loại trừ.
Nó giống như công thức này là được ạ:
=IF(AND(COUNTIF($M$2:$M$3,A2)=0,COUNTIF(C2,$K$2:$K$11)>0),VLOOKUP(C2,$K$2:$L$11,2,0),C2)

Giải thích mãi, nói chưa đúng,... mà ý bạn muốn kết quả cụ thể nó ra sao.
Giải thích như bạn thì có rất nhiều cách hiểu (như những cách giải khác nhau ở những bài trên)
Sao không gởi file trong đó có kết quả mẫu, chỉ có hơn 10 dòng thôi, bạn nhập thủ công đâu có lâu nhưng người khác "mò" theo kết quả mẫu sẽ dễ hiểu ý bạn hơn là kiểu giải thích của bạn.
Tôi ví dụ bạn nhập 1 bảng kết quả muốn có vào file như trong hình, chú thích thêm lý do dòng nào thay đổi, lý do dòng nào không thay đổi...
Untitled.jpg
Nếu rõ ràng thì chắc 1 hay 2 bài trả lời là xong rồi.
 
Upvote 0
Giải thích mãi, nói chưa đúng,... mà ý bạn muốn kết quả cụ thể nó ra sao.
Giải thích như bạn thì có rất nhiều cách hiểu (như những cách giải khác nhau ở những bài trên)
Sao không gởi file trong đó có kết quả mẫu, chỉ có hơn 10 dòng thôi, bạn nhập thủ công đâu có lâu nhưng người khác "mò" theo kết quả mẫu sẽ dễ hiểu ý bạn hơn là kiểu giải thích của bạn.
Tôi ví dụ bạn nhập 1 bảng kết quả muốn có vào file như trong hình, chú thích thêm lý do dòng nào thay đổi, lý do dòng nào không thay đổi...
View attachment 153126
Nếu rõ ràng thì chắc 1 hay 2 bài trả lời là xong rồi.
Dạ vâng, như hình ảnh của thầy là đúng rồi ạ, em có đưa file lên #17 rồi đó thầy ơi.
 
Upvote 0
Dạ vâng, như hình ảnh của thầy là đúng rồi ạ, em có đưa file lên #17 rồi đó thầy ơi.

Đúng sai không thể là "hình như" được.
Kết quả đó là chạy từ Sub này, tặng bạn tùy chỉnh lại mấy chỗ địa chỉ các vùng cho phù hợp rồi sử dung (nếu đúng)
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), I As Long
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range("M2:M3").Value     '<---------------'
For I = 1 To UBound(sArr, 1)
    Dic.Add sArr(I, 1), ""
Next I
sArr = Range("K2:L11").Value    '<---------------------'
For I = 1 To UBound(sArr, 1)
    Dic.Add sArr(I, 1), sArr(I, 2)
Next I
sArr = Range("A2:D18").Value    '<---------------------'
ReDim dArr(1 To UBound(sArr, 1), 1 To 4)
For I = 1 To UBound(sArr, 1)
    If Not Dic.Exists(sArr(I, 1)) Then
        If Dic.Exists(sArr(I, 3)) Then
            sArr(I, 3) = Dic.Item(sArr(I, 3))
        End If
    End If
Next I
Range("F2").Resize(UBound(sArr, 1), 4) = sArr   '<-----------------'
Set Dic = Nothing
End Sub
 
Upvote 0
Những ô em bôi vàng là những mã cần giữ nguyên ạ
Bảng K:M ý nghĩa là thế nào?
Cột M, các ô M2, M3 có phải là đi cùng MSP 01SB01, 01SX01.

Theo ý bạn, cột M là danh sách chung?
Nếu cột M là danh sách chung, không liên quan tới MSP thì phải để riêng.

---
Gửi bạn lại đoạn code sửa theo hướng cột M là danh sách chung cho tất cả.
Mã:
Public Sub ThayThe()
Dim Nguon, Dk, r As Long

Nguon = Sheet1.Range("K1").CurrentRegion
With CreateObject("scripting.dictionary")
For r = 2 To UBound(Nguon)
.Add Nguon(r, 1), Nguon(r, 2)
Dk = Dk & " " & Nguon(r, 3)
Next r
Dk = Dk & " "

Nguon = Sheet1.Range("A1").CurrentRegion
For r = 2 To UBound(Nguon)
If .exists(Nguon(r, 3)) Then
If InStr(Dk, " " & Nguon(r, 1) & " ") = 0 Then
Nguon(r, 3) = .Item(Nguon(r, 3))
End If
End If
Next r
End With

With Sheet1
.Range("A1").CurrentRegion.ClearContents
.Range("A1").Resize(UBound(Nguon), UBound(Nguon, 2)) = Nguon
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom