Xin viết dùng mã vba thay thế cho hàm vlookup (1 người xem)

Liên hệ QC

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

Chào mọi người

Cho em hỏi là cùng 1 đoạn code mà trên máy em lại không chạy được nhưng qua máy khác lại chạy được.

Mọi người chỉ cho em khắc phục lỗi này với ạ. Em cám ơn!
lỗi cụ thể là lỗi j bạn? bạn thử chụp hình lên đây xem sao
 
lỗi cụ thể là lỗi j bạn? bạn thử chụp hình lên đây xem sao
Em gửi file đính kèm. nhờ mọi người xem giúp em. bình thường em mở file là nó chạy bình thường nhưng giờ nó không chạy được. nhưng đem qua máy khác thì vẩn chạy bình thường. em cám ơn!
 

File đính kèm

Mình gửi vd lên nhờ các bắc bớt chút thời gian chỉ dùm vài chiêu
Cảm ơn các bạn nhiều!!!

Ngắn nhất cho bạn. Dể hiểu nhất cho bạn......Buye

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
        Range("C4") = "=IFERROR(VLOOKUP(RC[-1],MA!R3C2:R7C4,2,0),"""")"
        Range("D4") = "=IFERROR(VLOOKUP(RC[-2],MA!R3C2:R7C4,3,0),"""")"
        Range("C4:d4").Value = Range("C4:d4").Value
End If
End Sub
 

File đính kèm

Ngắn hơn một chút:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
    Range("C4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,2,0),"""")")
    Range("D4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,3,0),"""")")
End If
End Sub
 
Ngắn hơn một chút:
...
Cái mồ này đã tám năm rồi mà.
Cu cậu Âm Mộc sau khi đội mồ cứng da cứng thịt rồi, bắt đầu đi đào mồ. Vốn là chỉ để dùi mài mấy câu quen thuộc: "quá đơn giản", "đẳng cấp", ...
 
Em gửi file đính kèm. nhờ mọi người xem giúp em. bình thường em mở file là nó chạy bình thường nhưng giờ nó không chạy được. nhưng đem qua máy khác thì vẩn chạy bình thường. em cám ơn!
Tôi có mở file, nhìn code vậy tôi cũng chưa ra được lỗi gì? Máy này chạy được, máy kia ko chạy được có thể do phần Path (không tồn tại đường dẫn này).
Như một số chuyên gia có tư vấn, việc gộp File bạn nên dùng thử Power Query, có tài liệu của thầy @ptm0412.
Thử xem sao nhé
 
Tôi có mở file, nhìn code vậy tôi cũng chưa ra được lỗi gì? Máy này chạy được, máy kia ko chạy được có thể do phần Path (không tồn tại đường dẫn này).
Như một số chuyên gia có tư vấn, việc gộp File bạn nên dùng thử Power Query, có tài liệu của thầy @ptm0412.
Thử xem sao nhé
dạ em cám ơn ạ!
 
Ngắn nhất cho bạn. Dể hiểu nhất cho bạn......Buye

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
        Range("C4") = "=IFERROR(VLOOKUP(RC[-1],MA!R3C2:R7C4,2,0),"""")"
        Range("D4") = "=IFERROR(VLOOKUP(RC[-2],MA!R3C2:R7C4,3,0),"""")"
        Range("C4:d4").Value = Range("C4:d4").Value
End If
End Sub
Ngắn hơn một chút:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
    Range("C4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,2,0),"""")")
    Range("D4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,3,0),"""")")
End If
End Sub
Chào bạn,
Tương tự như yêu cầu của chủ đề,
Bạn ban đầu Vlookup cho 1 giá trị. Nếu mở rộng thêm nhiều giá trị tương tự thì code VBA thế nào vậy, có thể giúp mình được không.
Thanks
 

File đính kèm

Chào bạn,
Tương tự như yêu cầu của chủ đề,
Bạn ban đầu Vlookup cho 1 giá trị. Nếu mở rộng thêm nhiều giá trị tương tự thì code VBA thế nào vậy, có thể giúp mình được không.
Thanks
Dùng thử phương thức tìm kiếm Find xem sao, click Update
Code
Mã:
Sub FindMethod()
Dim i&, Rng As Range, KQ(), Ma()
Ma = Range(Sheets("CT").[B4], Sheets("CT").[B500].End(3))
ReDim KQ(1 To UBound(Ma), 1 To 2)
For i = 1 To UBound(Ma)
    Set Rng = Sheets("MA").[B3:B500].Find(Ma(i, 1), , , 1)
    If Not Rng Is Nothing Then
        KQ(i, 1) = Rng(, 1)
        KQ(i, 2) = Rng(, 2)
    End If
Next
Sheets("CT").[C4].Resize(i - 1, 2) = KQ
End Sub
 

File đính kèm

Có đúng xì tai của anh @quanghai1969 ??? (thấy like là biết a khỏe rùi)
(Spam chút)
 
yêu câu thứ 1: khi thay đổi bất kỳ bên sheet "LLNV" thì sheet "chitiet" cập nhật theo (giống tính năng của hàm vlookup)
cái này có thể sử dụng find method trong sự kiện worksheet change cho sheet "LLNV"
tuy nhiên cho hỏ là: các mã cột C của sheet "chi tiet" có trùng nhau ko?

câu hỏi 2: nếu nằm ở file khác thì phức tạp hơn là phải mở file đó ra rồi dùng phương pháp Find
(hoặc dùng ADO, cái này thì tôi chỉ biết là vậy chứ chưa biết làm)
yêu câu thứ 1: khi thay đổi bất kỳ bên sheet "LLNV" thì sheet "chitiet" cập nhật theo (giống tính năng của hàm vlookup)
cái này có thể sử dụng find method trong sự kiện worksheet change cho sheet "LLNV"
tuy nhiên cho hỏ là: các mã cột C của sheet "chi tiet" có trùng nhau ko?

câu hỏi 2: nếu nằm ở file khác thì phức tạp hơn là phải mở file đó ra rồi dùng phương pháp Find
(hoặc dùng ADO, cái này thì tôi chỉ biết là vậy chứ chưa biết làm)
Câu 2 bạn đã nhận được sự giúp đỡ chưa? Mình cũng đang tìm đề tài này.
Rất mong bạn và các bạn trên diễn đàn chia sẻ
Cảm ơn
 
chào mọi người
cho em hỏi nếu link từ 1 file khác sang thi nên dùng code nào ạ

Mong mọi người giúp đỡ
 
chào mọi người
cho em hỏi nếu link từ 1 file khác sang thi nên dùng code nào ạ

Mong mọi người giúp đỡ
Link File thì không cần dùng code, cứ gõ dấu = ; hoặc copy - paste link thông thường của Excel là được
Nhưng link file của Excel càng thêm rắc rối
 
Cái ni cũng vừa đủ sòai nề

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4:B99")) Is Nothing Then
    Dim Rng As Range, sRng As Range, Sh As Worksheet
   
    Set Sh = ThisWorkbook.Worksheets("MA")
    Set Rng = Sh.Range(Sh.[b2], Sh.[b2].End(xlDown))
    Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Nothing"
    Else
        Target.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
    End If
End If
End Sub
Code viết rất hay, cảm on bạn sẽ để dành dùng khin cần
 
Chào các bác.
Nhờ các bác thêm giúp e đoạn code để có thể tìm từ cột MA sang nhiều sheet với ạ.
Hiện tại ở File e đã lấy từ một bác ở trên, chạy khá ổn, giờ e muốn nó chạy thêm vài sheet nữa để.
 

File đính kèm

Chào các bác.
Nhờ các bác thêm giúp e đoạn code để có thể tìm từ cột MA sang nhiều sheet với ạ.
Hiện tại ở File e đã lấy từ một bác ở trên, chạy khá ổn, giờ e muốn nó chạy thêm vài sheet nữa để.
Bạn thử Code.
Mã:
Sub laydulieu()
    Dim i As Long, lr As Long, dic As Object, a As Long, sh As Worksheet, kq, arr, dk As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Ma")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("B3:E" & lr).Value
         For i = 1 To UBound(arr)
             dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, arr(i, 4)
             End If
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "MA" Then
           With sh
                lr = .Range("B" & Rows.Count).End(xlUp).Row
                If lr > 3 Then
                   arr = .Range("B4:C" & lr).Value
                   ReDim kq(1 To UBound(arr), 1 To 1)
                   For i = 1 To UBound(arr)
                       dk = arr(i, 1)
                       If dic.exists(dk) Then
                          kq(i, 1) = dic.Item(dk)
                       End If
                   Next i
                End If
                .Range("G4:G" & lr).Value = kq
         End With
     End If
   Next
End Sub
 
Bạn thử Code.
Mã:
Sub laydulieu()
    Dim i As Long, lr As Long, dic As Object, a As Long, sh As Worksheet, kq, arr, dk As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Ma")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("B3:E" & lr).Value
         For i = 1 To UBound(arr)
             dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, arr(i, 4)
             End If
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "MA" Then
           With sh
                lr = .Range("B" & Rows.Count).End(xlUp).Row
                If lr > 3 Then
                   arr = .Range("B4:C" & lr).Value
                   ReDim kq(1 To UBound(arr), 1 To 1)
                   For i = 1 To UBound(arr)
                       dk = arr(i, 1)
                       If dic.exists(dk) Then
                          kq(i, 1) = dic.Item(dk)
                       End If
                   Next i
                End If
                .Range("G4:G" & lr).Value = kq
         End With
     End If
   Next
End Sub
Bác Coppy đoạn code này và chạy thử trong file đính kèm giúp em. e đã thử mà không được ạ.
 

File đính kèm

File đính kèm

Lần chỉnh sửa cuối:

File đính kèm

Bác quick87 em thấy file bác rất hay. em muốn áp dụng vào file cửa em nhưng không rõ phải sửa đổi chỗ nào nào mò mãi không được. bác giúp em với.
Không chỉ riêng mình mà rất nhiều thành viên khác sẽ giúp được bạn nhưng file như thế này thì sao giúp được bạn đây:

1624694509042.png

Thêm nữa, không nên nhờ đích danh một cá nhân thì kết quả bạn sẽ nhận được nhiều hơn bạn mong đợi đó!
 
Không chỉ riêng mình mà rất nhiều thành viên khác sẽ giúp được bạn nhưng file như thế này thì sao giúp được bạn đây:

View attachment 261339

Thêm nữa, không nên nhờ đích danh một cá nhân thì kết quả bạn sẽ nhận được nhiều hơn bạn mong đợi đó!
chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!
 

File đính kèm

chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!
các bác cho em hỏi. em làm nhưng sao nó cú chạy là các dữ liệu ở sheet khác bị xóa sạch. các giúp em với?
 
chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!
Nếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.
Ở sh MASTER Danpla mình đã làm Data validation cho bạn rồi, cứ kích chọn một mã trong danh sách sổ xuống và xem diễn biến ở các ô cần lấy dữ liệu. Có điều danh sách sổ xuống cõ chữ nhỏ quá mà mình tìm mãi để nó to lên mà không được.
 

File đính kèm

Nếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.
Ở sh MASTER Danpla mình đã làm Data validation cho bạn rồi, cứ kích chọn một mã trong danh sách sổ xuống và xem diễn biến ở các ô cần lấy dữ liệu. Có điều danh sách sổ xuống cõ chữ nhỏ quá mà mình tìm mãi để nó to lên mà không được.
Bạn đã chạy thử chưa. nếu thấy ưng ý thì nhờ mọi người giúp đỡ cái vụ Data Validation có cỡ chữ nhỏ muốn phóng to lên hơn thì phải làm thế nào , Cỡ chữ của Data validation to lên thì xem dễ hơn và thao tác chọn cũng dễ hơn.
 
Nếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.
Ở sh MASTER Danpla mình đã làm Data validation cho bạn rồi, cứ kích chọn một mã trong danh sách sổ xuống và xem diễn biến ở các ô cần lấy dữ liệu. Có điều danh sách sổ xuống cõ chữ nhỏ quá mà mình tìm mãi để nó to lên mà không được.
file cửa bác rất hay, nhưng nó lại không cập nhật khi mình thay đổi nội dung ở sheet DMSP. em làm theo code bắc

quick87

ở trên thì mày mò ra được cho file cửa em ở dưới. nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!

 

File đính kèm

file cửa bác rất hay, nhưng nó lại không cập nhật khi mình thay đổi nội dung ở sheet DMSP. em làm theo code bắc

quick87

ở trên thì mày mò ra được cho file cửa em ở dưới. nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!


1/ file bạn gửi có cấu trúc không giống với file ỏ bài #229 và file bạn gửi của sổ VBE có pass --> không mở được (bạn lưu ý lần sau nhé), và cứ bám vào bác Quick87 để hỏi nhé.
2/ file mình làm cho bạn đã Define name động phần mã sản phẩm (Thùng/mã vạch) cột (D sh DMSP Danpla )rồi. bạn thử thêm một mã mới vào chạy thử xem).
Nếu thay đổi lại nội dung của các cột khác (<> D) thì phải chạy lại dòng đó bên sh MASTER danpla.
 
1/ file bạn gửi có cấu trúc không giống với file ỏ bài #229 và file bạn gửi của sổ VBE có pass --> không mở được (bạn lưu ý lần sau nhé), và cứ bám vào bác Quick87 để hỏi nhé.
2/ file mình làm cho bạn đã Define name động phần mã sản phẩm (Thùng/mã vạch) cột (D sh DMSP Danpla )rồi. bạn thử thêm một mã mới vào chạy thử xem).
Nếu thay đổi lại nội dung của các cột khác (<> D) thì phải chạy lại dòng đó bên sh MASTER danpla.
1- vâng! fiile này em thây đổi cột mã đưa về đầu để làm cho dễ. nhưng nó chạy ra được nhưng các Sheet khách không liên quan bị xóa nội dùng, em cũng muốn bác Quick87 tư vấn nhưng forum không có phần chat riêng sao đó. các bác cao nhân hiểu về VBA giúp em với.
2- em biết file bác làm chạy được nhưng chỉ có nhược điểm việc cập nhật thông tin thay đổi ở sheet DMSP Danpla thì lại phải load lại hết mã ở sheet MASTER danpla. mà file cửa em nó phải để trên 18000 dòng, mà đôi khi mình quên dẫn đến sai. bác có cách nào khác phuc giúp em!
 
1- vâng! fiile này em thây đổi cột mã đưa về đầu để làm cho dễ. nhưng nó chạy ra được nhưng các Sheet khách không liên quan bị xóa nội dùng, em cũng muốn bác Quick87 tư vấn nhưng forum không có phần chat riêng sao đó. các bác cao nhân hiểu về VBA giúp em với.
2- em biết file bác làm chạy được nhưng chỉ có nhược điểm việc cập nhật thông tin thay đổi ở sheet DMSP Danpla thì lại phải load lại hết mã ở sheet MASTER danpla. mà file cửa em nó phải để trên 18000 dòng, mà đôi khi mình quên dẫn đến sai. bác có cách nào khác phuc giúp em!
Bạn up lại file của bạn có code của anh Quick87lên đi (nhớ là gỡ bỏ pass) nhé, để mình xem có giúp được không?
 
Bạn up lại file của bạn có code của anh Quick87lên đi (nhớ là gỡ bỏ pass) nhé, để mình xem có giúp được không?
Vâng bác. bài #233 em có up file mới bỏ pass và đưa được code cửa bác @quick87 vào thì chạy được như lại bị lỗi xóa nội dung ở các sheet khác (sheet "Bảng mã nguyên vật liệu"....). đang nhờ mọi người và bác ấy giúp ạ!
1625143667785.png
 
Lần chỉnh sửa cuối:
Mở ở của máy mình bình thường mà có sao đâu?
 

File đính kèm

  • Screenshot (8).png
    Screenshot (8).png
    471.7 KB · Đọc: 7
Bác phải thay đổi nội dung ở sheet DMSP hoặc nhập mã ở sheet MÁTER. Để nó chạy update dữ liệu thì mới bị ạ
Sheet MASTER có quan hệ thế nào với Sh Bang Ma NVL? mình nghi ngờ là sub Update ấy tác động đến Sh Bang ma NVL ở đoạn code trong sh DMSP Danpla
 
Sheet MASTER có quan hệ thế nào với Sh Bang Ma NVL? mình nghi ngờ là sub Update ấy tác động đến Sh Bang ma NVL ở đoạn code trong sh DMSP Danpla
Có anh. Sheet Master nấy thông tin nguyên liệu ở sh NVL ( em có dùng hàm Vlock up ). Đúng là cái phần auto nó nỗi. Do em nấy code ở file bác quick87 viết nó sẽ chạy cho nhiều sheet phía sau giống nhau ở bài # 224. Mà em mò hoài ko biết cách thoát khỏi cái đó mà file vẫn cập nhật bình thường.
 
Có anh. Sheet Master nấy thông tin nguyên liệu ở sh NVL ( em có dùng hàm Vlock up ). Đúng là cái phần auto nó nỗi. Do em nấy code ở file bác quick87 viết nó sẽ chạy cho nhiều sheet phía sau giống nhau ở bài # 224. Mà em mò hoài ko biết cách thoát khỏi cái đó mà file vẫn cập nhật bình thường.
Bây giờ mình làm theo hướng liên hệ qua lại giữa 2 sh DMSP và sh MASTER thôi nhé, Có nghĩa là nếu Sh MASTER thay đổi (thêm dòng chẳng hạn) thì nó sẽ lấy dữ liệu từ Sh DMSP điền vào các ô theo yêu cầu, và ngược lại khi sh DMSP thay đổi (thay đổi các mục tên sản phẩm, hay kích thước ...) thì những dòng của sh MASTER có liên quan cũng thay đỏi theo. còn các sh không liên quan nhé.
 
nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!

Mình xóa bỏ hết code ở sh DMSP và sửa lại sự kiện Workbook_Change là khi có thay đổi ở range (A5:I1000000) thì chạy sub LOAD để cập nhật lại các dòng của Sh MASTER.
(SH Bang ma NVL bạn để nhiều công thức quá --> file nặng---> load chậm)
 

File đính kèm

nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!

Mình xóa bỏ hết code ở sh DMSP và sửa lại sự kiện Workbook_Change là khi có thay đổi ở range (A5:I1000000) thì chạy sub LOAD để cập nhật lại các dòng của Sh MASTER.
(SH Bang ma NVL bạn để nhiều công thức quá --> file nặng---> load chậm)
file chạy ngon luôn bác! thank bác rất nhiều! :)
Đúng là file em nó lắm công thức quá load nâu thật.hihi!
 
file chạy ngon luôn bác! thank bác rất nhiều! :)
Đúng là file em nó lắm công thức quá load nâu thật.hihi!
Bạn giải thích một cách cụ thể về cách lấy dữ liệu vào sh Bang ma NVL ỏ các ô và dòng tương ứng thì tin chắc sẽ có nhiều người giúp bạn dùng VBA để lấy không phải dùng công thức(nhất là những worksheets có nhiều dòng nhiều cột phải lấy dũ liệu bằng công thức)---> file sẽ nhẹ hơn--> load sẽ nhanh hơn.
Mình có sửa lại code của sh DMSP để đảm bảo khi dữ liệu của Sh MASTER nhiều dòng thì khi sửa dữ liệu của sh DMSP sẽ đồng thời sửa lại dữ liệu Sh MASTER ở dòng tương ứng (nhanh hơn).
bạn xem code trong file đính kèm và sửa lại dữ liệu, chạy thử nhé. nếu thấy ưng ý thì thay code trong Sh DMSP.
 

File đính kèm

Bạn giải thích một cách cụ thể về cách lấy dữ liệu vào sh Bang ma NVL ỏ các ô và dòng tương ứng thì tin chắc sẽ có nhiều người giúp bạn dùng VBA để lấy không phải dùng công thức(nhất là những worksheets có nhiều dòng nhiều cột phải lấy dũ liệu bằng công thức)---> file sẽ nhẹ hơn--> load sẽ nhanh hơn.
Mình có sửa lại code của sh DMSP để đảm bảo khi dữ liệu của Sh MASTER nhiều dòng thì khi sửa dữ liệu của sh DMSP sẽ đồng thời sửa lại dữ liệu Sh MASTER ở dòng tương ứng (nhanh hơn).
bạn xem code trong file đính kèm và sửa lại dữ liệu, chạy thử nhé. nếu thấy ưng ý thì thay code trong Sh DMSP.
file bác em đã up vào file em chạy ngon luôn bác. nhưng cái code này em mò mãi không hiểu. định tự làm cái chạy mã nguyên liệu nhưng không ra. bác giúp em lốt phát này là File em ngon lành. :)
- Cũng giống như cái cái trước là mã thành phẩm thì cái này là nhập mã nguyên liệu thì nó chạy tự động và tự động cập nhật các thông số từ Sheet "Ma NL"sang sheet " MASTER Danpla"
#cập nhật# Em nay chèn thêm 4 hàng mã sản phẩm mới ở sh DMSP thì sang sh MASTER nó lại không cập nhật lên. mà phải thao tác vào từng ô dữ liệu cửa các mã mới đó thì nó mới load sang.
 

File đính kèm

Lần chỉnh sửa cuối:
file bác em đã up vào file em chạy ngon luôn bác. nhưng cái code này em mò mãi không hiểu. định tự làm cái chạy mã nguyên liệu nhưng không ra. bác giúp em lốt phát này là File em ngon lành. :)
- Cũng giống như cái cái trước là mã thành phẩm thì cái này là nhập mã nguyên liệu thì nó chạy tự động và tự động cập nhật các thông số từ Sheet "Ma NL"sang sheet " MASTER Danpla"
#cập nhật# Em nay chèn thêm 4 hàng mã sản phẩm mới ở sh DMSP thì sang sh MASTER nó lại không cập nhật lên. mà phải thao tác vào từng ô dữ liệu cửa các mã mới đó thì nó mới load sang.

Đã sửa lại code, có sửa tự cập nhật Dic khi có thay đổi rồi, chạy thử nhé. Các cột AC,AD,AF mình đã làm cho tự cập nhật công thức rồi đó nếu thấy không cần thì gỡ bỏ.
Còn cái đoạn code
Set SRng = Intersect(Range("AB5:AB60000"), Target)
If Not SRng Is Nothing Then
sRow = SRng.Rows.Count
For i = 1 To sRow
....... đến đoạn
ElseIf UCase(DonVi) Like "T?M" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
ElseIf UCase(DonVi) Like "THANH" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/INT(RC[2]/RC[-10])"
Else
Rng.Offset(, 1) = Empty
End If
Next i
End If
End If

ở sh MASTER đấy để làm gì nếu không cần thiết thì gỡ bỏ cho code chạy nhanh và mượt hơn (tùy bạn- mình không can thiệp)
Dữ liệu ở cột O sh MaNVL được lấy ở đâu vào?
Nên đặt tên file bằng TÊN TIẾNG VIỆT -nhưng viết tắt cũng được, Tên Sh nên đặt bằng tiếng việt không dấu- viết tắt và ngắn bấy nhiêu , gọn bấy nhiêu)
 

File đính kèm

Đã sửa lại code, có sửa tự cập nhật Dic khi có thay đổi rồi, chạy thử nhé. Các cột AC,AD,AF mình đã làm cho tự cập nhật công thức rồi đó nếu thấy không cần thì gỡ bỏ.
Còn cái đoạn code
Set SRng = Intersect(Range("AB5:AB60000"), Target)
If Not SRng Is Nothing Then
sRow = SRng.Rows.Count
For i = 1 To sRow
....... đến đoạn
ElseIf UCase(DonVi) Like "T?M" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
ElseIf UCase(DonVi) Like "THANH" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/INT(RC[2]/RC[-10])"
Else
Rng.Offset(, 1) = Empty
End If
Next i
End If
End If

ở sh MASTER đấy để làm gì nếu không cần thiết thì gỡ bỏ cho code chạy nhanh và mượt hơn (tùylỗi.png bạn- mình không can thiệp)
Dữ liệu ở cột O sh MaNVL được lấy ở đâu vào?
Nên đặt tên file bằng TÊN TIẾNG VIỆT -nhưng viết tắt cũng được, Tên Sh nên đặt bằng tiếng việt không dấu- viết tắt và ngắn bấy nhiêu , gọn bấy nhiêu)
- Anh ơi! em chạy thay đổi mã nguyên liệu nó cú báo lỗi như trên rồi out ra. bác xem giúp em.
- đoạn code đó em để chạy công thức tự động cho cột AC và AF theo mỗi loại nguyên liệu dựa vào đơn vị nguyên liệu ở cột AB và AE ( file trước em để ví dụ hơn ít và ít loại nguyên liệu khác nhau lên không thể hiện rõ, em có gửi lai file nhiều dữ kiệm ở sheet MASTER ).
- dữ liệu ở cộ O Sheet Ma NVL là công thức cộng tổng nguyên liệu ở Sheet Master ạ. tại em xóa bớt Sheet nên nó bị lỗi.
 

File đính kèm

- Anh ơi! em chạy thay đổi mã nguyên liệu nó cú báo lỗi như trên rồi out ra. bác xem giúp em.
- đoạn code đó em để chạy công thức tự động cho cột AC và AF theo mỗi loại nguyên liệu dựa vào đơn vị nguyên liệu ở cột AB và AE ( file trước em để ví dụ hơn ít và ít loại nguyên liệu khác nhau lên không thể hiện rõ, em có gửi lai file nhiều dữ kiệm ở sheet MASTER ).
- dữ liệu ở cộ O Sheet Ma NVL là công thức cộng tổng nguyên liệu ở Sheet Master ạ. tại em xóa bớt Sheet nên nó bị lỗi.

Bạn gửi file có Pass nên không mở được VBE.
 

File đính kèm

file bạn gửi không có code mà mình đã gửi. lấy code ở trong file mình gửi lại và chạy thử
nhớ là copy toàn bộ code ở các modul và ở các sh (kể cả ở This WorkBook) nhé!
- File em up lại là em mới up code bài #245 cửa bác. em đang để thấy shett MASTER sử dụng nhiều lại nguyên liệu nhiều công thưc tính khác nhau thôi ạ.
- File bác mới Up ở bài #247 và #251 em tải về thi đổi mã nguyên liệu khác ở cột Z thì nó báo lỗi như anh bác ak. hay do máy em nó thiếu phần j nên báo vậy nhi?
 

File đính kèm

  • báo lỗi.png
    báo lỗi.png
    464.7 KB · Đọc: 6
- File em up lại là em mới up code bài #245 cửa bác. em đang để thấy shett MASTER sử dụng nhiều lại nguyên liệu nhiều công thưc tính khác nhau thôi ạ.
- File bác mới Up ở bài #247 và #251 em tải về thi đổi mã nguyên liệu khác ở cột Z thì nó báo lỗi như anh bác ak. hay do máy em nó thiếu phần j nên báo vậy nhi?

File mình up cho bạn là mình đã thử và sửa rất nhiều lần trên máy mình rồi chạy êm ru, không vấp lỗi gì mà.
bạn up lại file bi lỗi lên mình xem lại xem có vấn đề gì tại máy hay tại code.
 
File mình up cho bạn là mình đã thử và sửa rất nhiều lần trên máy mình rồi chạy êm ru, không vấp lỗi gì mà.
bạn up lại file bi lỗi lên mình xem lại xem có vấn đề gì tại máy hay tại code.
em chỉ tải về chạy luôn khôn động chạm j cả. chắc máy em nó thiếu cái j đó rùi. em dùng win 7, off13.
mà code cũ không thêm cái phần mã nguyên liệu thì được. lạ thật!
 

File đính kèm

em chỉ tải về chạy luôn khôn động chạm j cả. chắc máy em nó thiếu cái j đó rùi. em dùng win 7, off13.
mà code cũ không thêm cái phần mã nguyên liệu thì được. lạ thật!

Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Auto_Open lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
 

File đính kèm

Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Auto_Open lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
Vâng! Chắc tại máy em để em thử máy khác xem ạ.
Thank bác rất nhiều!!!
 
Thật ra tôi rất thích tranh luận để chứng minh vấn đề
Vậy thay vì nói suông ta làm cuộc thí nghiệm với 10000 dòng dữ liệu giữa code của tôi VS với VLOOKUP nhé (xem file)
Tại sheet ChiTiet, điền dữ liệu vào cột C rồi lookup 16 cột còn lại bên phải
Code của tôi như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
  Dim Arr(), tmp
  On Error Resume Next
  TG = Timer
  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C65536"), Target)
    If IsArray(rTarget.Value) Then
      aTarget = rTarget.Value
    Else
      ReDim aTarget(1 To 1, 1 To 1)
      aTarget(1, 1) = rTarget.Value
    End If
    ReDim Arr(1 To UBound(aTarget, 1), 1 To 17)
    For i = 1 To UBound(aTarget, 1)
      If aTarget(i, 1) <> "" Then
        tmp = aTarget(i, 1)
        If Dic.Exists(tmp) Then
          For j = 2 To 17
            Arr(i, j - 1) = aResult(Dic.Item(tmp), j)
          Next
        End If
      End If
    Next
    rTarget.Offset(, 1).Resize(, 16).Value = Arr
    MsgBox Timer - TG
  End If
End Sub
- Còn code "mượn" VLOOKUP như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
  Dim Arr(), tmp
  On Error Resume Next
  TG = Timer
  If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C65536"), Target)
    With rTarget.Offset(, 1).Resize(, 16)
      .Value = "=IF(RC3="""","""",VLOOKUP(RC3,LLNV!R5C2:R10000C18,2,0))"
      .Value = .Value
    End With
    MsgBox Timer - TG
  End If
End Sub
Code này tương đương bạn tự tay gõ hàm VLOOKUP vào rồi copy/paste value thôi (tôi nghĩ không khó hiểu đối với bạn)
----------------
Giờ so sánh khi copy paste 10000 dòng dữ liệu vào cột C của sheet ChiTiet (dữ liệu tôi đã làm sẵn tại sheet1)
- Code tôi viết trên nền tảng xử lý mảng cho kết quả trong vòng 1.1 giây
- Code dùng VLOOKUP cho kết quả không vòng 25 giây
Đó là chưa nói code dùng VLOOKUP chỉ tìm duy nhất trên cột 2 ---> Nếu tìm 1 lần 16 cột như code của tôi dùng Array chắc là cách dùng VLOOKUP sẽ... đói luôn
Nếu thay đoạn "VLOOKUP(RC3,LLNV!R5C2:R10000C18, 2,0)" thành "VLOOKUP(RC3,LLNV!R5C2:R10000C18, COLUMNS(RC3:RC),0)" để lookup luôn 16 cột thì... Ẹc.. Ẹc... tôi không kiên nhẩn để chờ (lâu quá, treo máy luôn)
Đương nhiên khi làm cuộc thí nghiệm này tôi đã thử bằng rất nhiều cách với VLOOKUP... Chẳng hạn dùng WorksheetFunction.Vlookup ---> Kết quả còn tệ hơn rất nhiều

Bạn muốn dữ liệu "chuẩn" thế nào, hoặc muốn sửa VLOOKUP như thế nào, cứ đưa lên đây, chúng ta sẽ cùng thí nghiệm để bạn tâm phục khẩu phục về tốc độ của xửF

Thật ra tôi rất thích tranh luận để chứng minh vấn đề
Vậy thay vì nói suông ta làm cuộc thí nghiệm với 10000 dòng dữ liệu giữa code của tôi VS với VLOOKUP nhé (xem file)
Tại sheet ChiTiet, điền dữ liệu vào cột C rồi lookup 16 cột còn lại bên phải
Code của tôi như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
  Dim Arr(), tmp
  On Error Resume Next
  TG = Timer
  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C65536"), Target)
    If IsArray(rTarget.Value) Then
      aTarget = rTarget.Value
    Else
      ReDim aTarget(1 To 1, 1 To 1)
      aTarget(1, 1) = rTarget.Value
    End If
    ReDim Arr(1 To UBound(aTarget, 1), 1 To 17)
    For i = 1 To UBound(aTarget, 1)
      If aTarget(i, 1) <> "" Then
        tmp = aTarget(i, 1)
        If Dic.Exists(tmp) Then
          For j = 2 To 17
            Arr(i, j - 1) = aResult(Dic.Item(tmp), j)
          Next
        End If
      End If
    Next
    rTarget.Offset(, 1).Resize(, 16).Value = Arr
    MsgBox Timer - TG
  End If
End Sub
- Còn code "mượn" VLOOKUP như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
  Dim Arr(), tmp
  On Error Resume Next
  TG = Timer
  If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C65536"), Target)
    With rTarget.Offset(, 1).Resize(, 16)
      .Value = "=IF(RC3="""","""",VLOOKUP(RC3,LLNV!R5C2:R10000C18,2,0))"
      .Value = .Value
    End With
    MsgBox Timer - TG
  End If
End Sub
Code này tương đương bạn tự tay gõ hàm VLOOKUP vào rồi copy/paste value thôi (tôi nghĩ không khó hiểu đối với bạn)
----------------
Giờ so sánh khi copy paste 10000 dòng dữ liệu vào cột C của sheet ChiTiet (dữ liệu tôi đã làm sẵn tại sheet1)
- Code tôi viết trên nền tảng xử lý mảng cho kết quả trong vòng 1.1 giây
- Code dùng VLOOKUP cho kết quả không vòng 25 giây
Đó là chưa nói code dùng VLOOKUP chỉ tìm duy nhất trên cột 2 ---> Nếu tìm 1 lần 16 cột như code của tôi dùng Array chắc là cách dùng VLOOKUP sẽ... đói luôn
Nếu thay đoạn "VLOOKUP(RC3,LLNV!R5C2:R10000C18, 2,0)" thành "VLOOKUP(RC3,LLNV!R5C2:R10000C18, COLUMNS(RC3:RC),0)" để lookup luôn 16 cột thì... Ẹc.. Ẹc... tôi không kiên nhẩn để chờ (lâu quá, treo máy luôn)
Đương nhiên khi làm cuộc thí nghiệm này tôi đã thử bằng rất nhiều cách với VLOOKUP... Chẳng hạn dùng WorksheetFunction.Vlookup ---> Kết quả còn tệ hơn rất nhiều

Bạn muốn dữ liệu "chuẩn" thế nào, hoặc muốn sửa VLOOKUP như thế nào, cứ đưa lên đây, chúng ta sẽ cùng thí nghiệm để bạn tâm phục khẩu phục về tốc độ của xử lý Array
Ví dụ như trong bài này có 17 cột , nếu em muốn lấy chỉ một số cột nhất định trong 17 cột đó thì sẽ thay đổi ở đâu ạ
 

File đính kèm

(1) Ví dụ như trong bài này có 17 cột , nếu em muốn lấy chỉ một số cột nhất định trong 17 cột đó thì sẽ thay đổi ở đâu ạ
(2) Hãy copy B6:B10000 ở sheet LLNV rồi paste vào C6 tại sheet này
(1) Bạn phải cho biết những cột nào cần Ccopy.
(2) ???
 
(1) Bạn phải cho biết những cột nào cần Ccopy.
(2) ???
Em muốn biết cách thay đổi code ở đâu luôn ấy ạ, ví dụ như file này em muốn lấy 2 cột là người phụ trách và số đt người phụ trạch. Vì em muốn biết để custom vào những file sau luôn
 

File đính kèm

Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Auto_Open lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
bác cho em hỏi! em muốn bỏ phần tự chạy công thức ở cột AC; AD; AF để nó chạy như code cũ cửa em. em có xóa đoạn code này đi thì nó lại không chạy được NVL luôn.
"
kTarget.Offset(, -1).Resize(, 15).Value = arr1
kTarget.Offset(, 3).FormulaR1C1 = "=(RC[-7]/1000*RC[-8]/1000)/RC[-5]"
kTarget.Offset(, 4).FormulaR1C1 = "=RC[-1]*RC[-13]"
kTarget.Offset(, 6).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
' kTarget.Offset(, 10).FormulaR1C1 = "=(RC[-5]+RC[-5]*RC[-1])*RC[1]"' DUA VAO CODE CHAY SAI--> CHÂM "
 
bác cho em hỏi! em muốn bỏ phần tự chạy công thức ở cột AC; AD; AF để nó chạy như code cũ cửa em. em có xóa đoạn code này đi thì nó lại không chạy được NVL luôn.
"
kTarget.Offset(, -1).Resize(, 15).Value = arr1
kTarget.Offset(, 3).FormulaR1C1 = "=(RC[-7]/1000*RC[-8]/1000)/RC[-5]"
kTarget.Offset(, 4).FormulaR1C1 = "=RC[-1]*RC[-13]"
kTarget.Offset(, 6).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
' kTarget.Offset(, 10).FormulaR1C1 = "=(RC[-5]+RC[-5]*RC[-1])*RC[1]"' DUA VAO CODE CHAY SAI--> CHÂM "
Bạn xóa bỏ đoạn code đó như thế nào; nếu xóa hoàn toàn như đoạn ở trên thì bạn đã xóa mất đoạn code để nó ghi lại kết quả; các dòng có ....FormulaR1C1="=.... là dòng code điền công thức.
dòng code dưới đây là dòng ghi lại kết quả lên sheet (bạn không được xóa bỏ dòng này-dòng tô đậm).
kTarget.Offset(, -1).Resize(, 15).Value = arr1

Có điều khi xóa các dòng tự điền công thức thì cứ mỗi khi bạn thêm dữ liệu lại phải sao chép công thức xuống các ô thôi.
Chúc thành công.
 
Em muốn biết cách thay đổi code ở đâu luôn ấy ạ, ví dụ như file này em muốn lấy 2 cột là người phụ trách và số đt người phụ trạch. Vì em muốn biết để custom vào những file sau luôn
macro sau sẽ hiện kết quả 3 cột (thêm cột đầu) ở trang 'ChiTiet':

PHP:
Sub Auto_Open()
  Dim Wks As Worksheet, SrcRng As Range, sArray
  Dim lR As Long, I As Long, J As Long, Num As Long, Tmp
'  On Error Resume Next '
  Set Wks = Sheets("LLNV")
  lR = Wks.[B6].CurrentRegion.Rows.Count    '+  +       '
  Set SrcRng = Wks.Range("B6:R" & lR)       '*  *       '
  sArray = SrcRng.Value:                    lR = 0      ''
  ReDim aResult(1 To UBound(sArray, 1), 1 To UBound(sArray, 2))
  Set Dic = CreateObject("Scripting.Dictionary")
  For I = 1 To UBound(sArray, 1)
    If CStr(sArray(I, 1)) <> "" Then
      Tmp = sArray(I, 1)
      If Not Dic.Exists(Tmp) Then
        lR = lR + 1
        Dic.Add Tmp, lR
        For J = 1 To UBound(sArray, 2) Step 2     '17 '
            Num = Num + 1
            aResult(lR, Num) = sArray(I, J)
        Next
        Num = 0
      End If
    End If
  Next
  Sheets("Chitiet").[C6].Resize(lR, 3).Value = aResult()
End Sub
 
Bạn xóa bỏ đoạn code đó như thế nào; nếu xóa hoàn toàn như đoạn ở trên thì bạn đã xóa mất đoạn code để nó ghi lại kết quả; các dòng có ....FormulaR1C1="=.... là dòng code điền công thức.
dòng code dưới đây là dòng ghi lại kết quả lên sheet (bạn không được xóa bỏ dòng này-dòng tô đậm).
kTarget.Offset(, -1).Resize(, 15).Value = arr1

Có điều khi xóa các dòng tự điền công thức thì cứ mỗi khi bạn thêm dữ liệu lại phải sao chép công thức xuống các ô thôi.
Chúc thành công.
em có xóa bỏ được công thức. nhưng có vấn đề là khi kéo hoặc paste nhiều mã NVL ở cột Z thì nó chỉ chạy có đúng 1 dòng trên , cú phải nhấp vào rồi enter từng cái 1 mới chạy code không được như cột mã sản phẩm ở cột A. và khi thay đổi j đó ở Sh ma NVL thì nó không auto thay đổi ở Sh bang MASTER. lại phải kích vào enter mới cập nhật. làm sao để nó hoạt động auto như phần nhập mã sản phẩm ạ. Bác xem giúp em với!
 

File đính kèm

Nhờ anh chị nào giúp code dùng mãng thay thế cho dùng vba vlookup do dữ liệu lớn nên vlookup chạy giật quá. Xin cám ơn
Bài đã được tự động gộp:

Nhờ anh chị nào giúp code dùng mãng thay thế cho dùng vba vlookup do dữ liệu lớn nên vlookup chạy giật quá. Xin cám ơn
 

File đính kèm

Nhờ anh chị nào giúp code dùng mãng thay thế cho dùng vba vlookup do dữ liệu lớn nên vlookup chạy giật quá. Xin cám ơn
Bài đã được tự động gộp:
Trong khi chờ các giải pháp khác thử tham khảo code trong file sau
1/ Chạy sub DoTim để được kết quả cả bảng tính (sheet2)
2/ Dùng hàm tự tạo:
D6=Dotim1(C6;2) nhấn Enter
F6=Dotim1(C6;4)
I6=Dotim1(C6;6)
 

File đính kèm

Giờ này mà còn nói chuyện "Vlookup gặp dữ liệu lớn chạy giật quá" là quá sức lỗi thời.
MS đã có cách khắc phục bảng dữ liệu hàng triệu dòng cả 10 năm nay.
 

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

Back
Top Bottom