Bài này làm thủ công thì mất khoảng gần một phút, vba là hơi phí.Chép lại cho dẻo tay
View attachment 287144
Anh ơi, ký tự gạch thẳng đứng viết thế nào anh, em ko tìm được ký tự đó trên bàn phím anh ạ.Chép lại cho dẻo tay
View attachment 287144
Thay bằng kí tự khác cũng được hoặc "|"Anh ơi, ký tự gạch thẳng đứng viết thế nào anh, em ko tìm được ký tự đó trên bàn phím anh ạ.
Dạ anh, vì dữ liệu sau nhiều í anh. mỗi lần lại lọc trùng rồi lại copy vào thì hơi mệt anh ạ.Bài này làm thủ công thì mất khoảng gần một phút, vba là hơi phí.
Ghi lại các thao tác lượt đầu rồi khi nào dùng thì "bấm một phát thôi".Dạ anh, vì dữ liệu sau nhiều í anh. mỗi lần lại lọc trùng rồi lại copy vào thì hơi mệt anh ạ.
Cái này nếu biết 1 xíu thì có thể record macro để đạt được mục đích mà. Nhưng có vẻ thớt cũng lười. Và tận dụng được những thành phần ngứa tay như em.Ghi lại các thao tác lượt đầu rồi khi nào dùng thì "bấm một phát thôi".
Chủ bài đăng muốn chỉ mất ~1 gy thôi bạn à!Bài này làm thủ công thì mất khoảng gần một phút, vba là hơi phí.
Bạn này vào diễn đàn gần 10 năm rồi mà vẫn đi nhờ suốt thế nhỉ.Nhưng có vẻ thớt cũng lười.
Sub abc()Chép lại cho dẻo tay
View attachment 287144
Đơn giản là chép lại sai thôiAnh ơi, em viết lại code như anh mà sao ko chạy được anh nhỉ
Option Explicit
Sub ABC()
Dim dic As Object, sarr(), es(), i&, s, key, k&, m&
Dim rng As Range
Set rng = Sheets("Data pb").Range("A3:B46")
Set dic = CreateObject("scripting.dictionary")
With Sheets("NKC")
sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value
ReDim res(1 To UBound(sarr), 1 To 3)
For i = 1 To UBound(sarr)
If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
End If
Next
For Each key In dic.keys
s = Split(dic(key), "|")
For i = 0 To UBound(s)
k = k + 1
If i = 0 Then
m = m + 1
res(k, 1) = WorksheetFunction.Roman(m)
res(k, 2) = key
res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0)
Else
res(k, 2) = s(i)
End If
Next
Next
End With
Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
Dạ anh, nhưng vẫn báo lỗi anh à, em sửa lại thành key rồi mà vẫn báo lỗi ạĐơn giản là chép lại sai thôi
View attachment 287147
Mã:Option Explicit Sub ABC() Dim dic As Object, sarr(), es(), i&, s, key, k&, m& Dim rng As Range Set rng = Sheets("Data pb").Range("A3:B46") Set dic = CreateObject("scripting.dictionary") With Sheets("NKC") sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value ReDim res(1 To UBound(sarr), 1 To 3) For i = 1 To UBound(sarr) If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1) End If Next For Each key In dic.keys s = Split(dic(key), "|") For i = 0 To UBound(s) k = k + 1 If i = 0 Then m = m + 1 res(k, 1) = WorksheetFunction.Roman(m) res(k, 2) = key res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0) Else res(k, 2) = s(i) End If Next Next End With Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res End Sub
Em cảm ơn anh ạ! Chúc anh cuối tuần vui vẻ ạĐơn giản là chép lại sai thôi
View attachment 287147
Mã:Option Explicit Sub ABC() Dim dic As Object, sarr(), es(), i&, s, key, k&, m& Dim rng As Range Set rng = Sheets("Data pb").Range("A3:B46") Set dic = CreateObject("scripting.dictionary") With Sheets("NKC") sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value ReDim res(1 To UBound(sarr), 1 To 3) For i = 1 To UBound(sarr) If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1) End If Next For Each key In dic.keys s = Split(dic(key), "|") For i = 0 To UBound(s) k = k + 1 If i = 0 Then m = m + 1 res(k, 1) = WorksheetFunction.Roman(m) res(k, 2) = key res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0) Else res(k, 2) = s(i) End If Next Next End With Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res End Sub
Em cảm ơn anh nhiều ạ. Chúc anh cuối tuần vui vẻ và hạnh phúc anh ạChủ bài đăng muốn chỉ mất ~1 gy thôi bạn à!
→ → → → → → → → → → → → → → → → → → → → → → → → → → →
ko phải em lười anh à, khi sheet NKC tháng sau phát sinh thêm mã phí mới thì ko recode được ạCái này nếu biết 1 xíu thì có thể record macro để đạt được mục đích mà. Nhưng có vẻ thớt cũng lười. Và tận dụng được những thành phần ngứa tay như em.
Tại sao không chạy duyệt sheets Data pb trước rồi chạy sheets NKC sau có phải đơn giản hơn không mà không cần sử dụng hàm Vlookup nữa.Chép lại cho dẻo tay
View attachment 287144
Ừ nhỉ. Cách của anh cũng là 1 cách. Hihi. Lúc ấy nghĩ sao thì viết thế ấy mà anhTại sao không chạy duyệt sheets Data pb trước rồi chạy sheets NKC sau có phải đơn giản hơn không mà không cần sử dụng hàm Vlookup nữa.
Anh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.Đơn giản là chép lại sai thôi
View attachment 287147
Mã:Option Explicit Sub ABC() Dim dic As Object, sarr(), es(), i&, s, key, k&, m& Dim rng As Range Set rng = Sheets("Data pb").Range("A3:B46") Set dic = CreateObject("scripting.dictionary") With Sheets("NKC") sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value ReDim res(1 To UBound(sarr), 1 To 3) For i = 1 To UBound(sarr) If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1) End If Next For Each key In dic.keys s = Split(dic(key), "|") For i = 0 To UBound(s) k = k + 1 If i = 0 Then m = m + 1 res(k, 1) = WorksheetFunction.Roman(m) res(k, 2) = key res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0) Else res(k, 2) = s(i) End If Next Next End With Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res End Sub
Trước khi chạy đoạn code trên thì hãy định dạng cột B đấy thành dạng text là được chứ có gì đâuAnh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.
Anh ơi, cũng là cái bảng đó, nhưng em thêm 1 cột kết quả ở cột E. Như file đính kèm, anh giúp nốt em với anh ơi. Em cảm ơn anh ạ!Anh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.
Có vẻ cột E cũng chỉ là cột trung gian, nối chuỗi 2 mã với nhau, mục đích để SUMIF hay VLOOKUP gì đó để ra báo cáo khác.em thêm 1 cột kết quả ở cột E.