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

Kính gửi Các bác trên GPE, tôi có fileVD này kính mong nhờ các bác giúp đỡ giải quyết cái Vlookup thành cái VBA, hiện tại file này tôi làm cho 1 năm nhưng kích thước của sheet nhập liệu quá lớn, nên chạy rất tốn thời gian (tôi đang dùng Atool của Cty Blue soft).
rất mong chờ sự giúp của các bác
Trân trong & cảm ơn
 

File đính kèm

Kính gửi Các bác trên GPE, tôi có fileVD này kính mong nhờ các bác giúp đỡ giải quyết cái Vlookup thành cái VBA, hiện tại file này tôi làm cho 1 năm nhưng kích thước của sheet nhập liệu quá lớn, nên chạy rất tốn thời gian (tôi đang dùng Atool của Cty Blue soft).
rất mong chờ sự giúp của các bác
Trân trong & cảm ơn
Tôi làm code tìm kiếm 3 trường HOTEN, LOAI, KHUVUC theo Mã khách hàng băng phương thức Find.
[gpecode=vb]Sub TimKiem()Dim i&, Rng As Range, MaKH(), KQ()
MaKH = Range(Sheets("DULIEU").[B4], Sheets("DULIEU").[B65000].End(3))
ReDim KQ(1 To UBound(MaKH), 1 To 3)
For i = 1 To UBound(MaKH)
Set Rng = Sheets("KH_HANG").[B4:B500].Find(MaKH(i, 1), , , 1)
If Not Rng Is Nothing Then
KQ(i, 1) = Rng(, 2)
KQ(i, 2) = Rng(, 4)
KQ(i, 3) = Rng(, 5)
End If
Next
Sheets("DULIEU").[H4].Resize(i - 1, 3) = KQ
End Sub[/gpecode]

bạn thử áp dụng tiếp cho bài toán của bạn xem sao, có lẽ đây là cách học tốt nhất.
Chúc bạn thành công
 
Cảm ơn bạn đã giúp đỡ
Mình không có kiến thức về VBA, bạn đã hướng dẫn tìm 3 trường trên, nhưng nếu mình tìm thêm các trướng khác ở sheet khác thì mình phải làm sao nữa.
Mong bạn chỉ giúp nhé !
Cảm ơn nhiều !
 
Cảm ơn bạn đã giúp đỡ
Mình không có kiến thức về VBA, bạn đã hướng dẫn tìm 3 trường trên, nhưng nếu mình tìm thêm các trướng khác ở sheet khác thì mình phải làm sao nữa.
Mong bạn chỉ giúp nhé !
Cảm ơn nhiều !

khi bạn không biết viết code VBA thì bạn cần chỉ rõ chính xác cái gì bạn cần , đừng đi lòng vòng như vậy rất mất thời gian cho cả 2 bên .
 
Kính gửi các bác GPE,

A. Hiện trạng file của mình như sau:
1/ Sheet DULIEU có các trường sau: NGAYPS, MAKH, SLTAP, SLNC, TSC, ADZT, ADZN (là những trường nhập số liệu trực tiếp). HOTEN, LOAI, KHUVUC, DGTAP, TTTAP, QK, DGNC, TTNC, TCONG, DRC, QKDRC, DIACHI (là các trường dùng hàm Vlookup).
2/ Sheet DRC có các trường sau: TSC, DRC.
3/ Sheet DGIA có các trường sau: NGAYGIA, DGTAP, DGNC.
4/ Sheet KHUVUC có các trường sau: MAKV, ADZ.
5/ Sheet KH_HANG có các trường sau: MAKH, HOTEN, DIACHI, LOAI, KHUVUC.
B. Nhu cầu tìm kiếm số liệu:
1/ Các trường HOTEN, LOAI, KHUVUC, DIACHI (sheet DULIEU): tìm kiếm dữ liệu từ sheet KH_HANG với điều kiện tại trường MAKH(DULIEU) với MAKH(KH_HANG).
2/ DGTAP: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA))+ (số liệu trường ADZT (DULIEU)).
3/ DGNC: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA)) + (tìm kiếm dữ liệu từ sheet DGIA, với đk KHUVUC (DULIEU) với MAKV (DGIA)) + (số liệu trường ADZN (DULIEU)).
4/ DRC: tìm kiếm dữ liệu từ sheet DRC, với điều kiện TSC (DULIEU) so sánh với TSC (DRC), trường TSC là số có 2 số thập phân, vì vậy phải làm tròn trước khi tìm kiếm trong sheet DRC.
5/ Các trường còn lại chỉ có tính chất toán tử như: TTTAP (SLTAP x DGTAP), QK (SLNC x TSC), TTNC (QK x DGNC), TCONG (TTTAP + TTNC), QKDRC (SLNC x DRC).

Kính mong các bác giúp đỡ !

Trân trọng & cảm ơn!
 
bạn thử áp dụng tiếp cho bài toán của bạn xem sao, có lẽ đây là cách học tốt nhất.
Chúc bạn thành công

Mình đã thử đoạn code nhưng không được.
Bạn xem lại giúp mình.

A. Hiện trạng file của mình như sau:
1/ Sheet DULIEU có các trường sau: NGAYPS, MAKH, SLTAP, SLNC, TSC, ADZT, ADZN (là những trường nhập số liệu trực tiếp). HOTEN, LOAI, KHUVUC, DGTAP, TTTAP, QK, DGNC, TTNC, TCONG, DRC, QKDRC, DIACHI (là các trường dùng hàm Vlookup).
2/ Sheet DRC có các trường sau: TSC, DRC.
3/ Sheet DGIA có các trường sau: NGAYGIA, DGTAP, DGNC.
4/ Sheet KHUVUC có các trường sau: MAKV, ADZ.
5/ Sheet KH_HANG có các trường sau: MAKH, HOTEN, DIACHI, LOAI, KHUVUC.
B. Nhu cầu tìm kiếm số liệu:
1/ Các trường HOTEN, LOAI, KHUVUC, DIACHI (sheet DULIEU): tìm kiếm dữ liệu từ sheet KH_HANG với điều kiện tại trường MAKH(DULIEU) với MAKH(KH_HANG).
2/ DGTAP: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA))+ (số liệu trường ADZT (DULIEU)).
3/ DGNC: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA)) + (tìm kiếm dữ liệu từ sheet DGIA, với đk KHUVUC (DULIEU) với MAKV (DGIA)) + (số liệu trường ADZN (DULIEU)).
4/ DRC: tìm kiếm dữ liệu từ sheet DRC, với điều kiện TSC (DULIEU) so sánh với TSC (DRC), trường TSC là số có 2 số thập phân, vì vậy phải làm tròn trước khi tìm kiếm trong sheet DRC.
5/ Các trường còn lại chỉ có tính chất toán tử như: TTTAP (SLTAP x DGTAP), QK (SLNC x TSC), TTNC (QK x DGNC), TCONG (TTTAP + TTNC), QKDRC (SLNC x DRC).

Kính mong các bác giúp đỡ !

Trân trọng & cảm ơn!
 
Bạn đã thử nhưng không được -> bạn có biết làm sao để chạy code không? Nếu bạn biết rồi thì code đó lỗi chỗ nào? Vì tôi chạy vẫn cho kết quả!
 
Chào bác ndu96081631 !
Em có file này dùng hàm vlookup chậm quá, em xem file thinghiem của bác hay quá, bác giúp em file này nhé

A. Hiện trạng file của em như sau:
1/ Sheet DULIEU có các trường sau: NGAYPS, MAKH, SLTAP, SLNC, TSC, ADZT, ADZN (là những trường nhập số liệu trực tiếp). HOTEN, LOAI, KHUVUC, DGTAP, TTTAP, QK, DGNC, TTNC, TCONG, DRC, QKDRC, DIACHI (là các trường dùng hàm Vlookup).
2/ Sheet DRC có các trường sau: TSC, DRC.
3/ Sheet DGIA có các trường sau: NGAYGIA, DGTAP, DGNC.
4/ Sheet KHUVUC có các trường sau: MAKV, ADZ.
5/ Sheet KH_HANG có các trường sau: MAKH, HOTEN, DIACHI, LOAI, KHUVUC.
B. Nhu cầu tìm kiếm số liệu:
1/ Các trường HOTEN, LOAI, KHUVUC, DIACHI (sheet DULIEU): tìm kiếm dữ liệu từ sheet KH_HANG với điều kiện tại trường MAKH(DULIEU) với MAKH(KH_HANG).
2/ DGTAP: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA))+ (số liệu trường ADZT (DULIEU)).
3/ DGNC: (tìm kiếm dữ liệu từ sheet DGIA, với điều kiện NGAYPS (DULIEU) so sánh với NGAYGIA (DGIA)) + (tìm kiếm dữ liệu từ sheet DGIA, với đk KHUVUC (DULIEU) với MAKV (DGIA)) + (số liệu trường ADZN (DULIEU)).
4/ DRC: tìm kiếm dữ liệu từ sheet DRC, với điều kiện TSC (DULIEU) so sánh với TSC (DRC), trường TSC là số có 2 số thập phân, vì vậy phải làm tròn trước khi tìm kiếm trong sheet DRC.
5/ Các trường còn lại chỉ có tính chất toán tử như: TTTAP (SLTAP x DGTAP), QK (SLNC x TSC), TTNC (QK x DGNC), TCONG (TTTAP + TTNC), QKDRC (SLNC x DRC).

(Flie này em làm cho 1 năm, do kích thước quá lớn em phải xoá bớt dòng)

Kính mong bác giúp đỡ !

Trân trọng & cảm ơn!
 
Dữ liệu của bạn liên hệ nhau rất nhiều. Loại quản trị kiểu này khong phải là công việc của bảng tính trải rộng như Excel (*).
Công việc này để cho Access quản lý tốt hơn. Đáng lẽ mọt công ty chuyên phần mềm như bơ lu sớp phải biết điều này.
Nếu bạn vẫn muốn dùng Excel, và muốn lookup thì bảng nên thiết kế lại. Các bảng để tra phải được sắp xếp theo thứ tự mã. Các bảng cần tra phải thêm một cột để tìm số dòng của bảng tra.
Hàm Vlookup duyệt bảng khong sắp xếp bằng cách đọc từ đầu đến cuối. Gặp bảng vài ngàn dòng thì bắt đầu chậm.
Khi duyệt bảng có sắp xếp, VLookup dùng phương pháp duyệt nhị phân, rất hiệu quả.
Tuy nhiên, cách duyệt này chỉ cho biết vùng chứ nếu mã khong tìm được thì sẽ cho ra kết qủa sai. Vì vạy, khi dùng cách này, người ta phải kèm theo cách kiểm chứng kết quả. Có 2 cách kiểm chứng, 1 là dùng 2 lần Vlookup; và 2 là dùng cột phụ để lấy số dòng. Bảng của bạn cần lấy chi tiết nhiều hơn 1 cột cho nên đặt thêm cột phụ và dùng hàm match để lấy số dòng là tối ưu nhất.

(*) Chú: Bạn đem một chiếc xe du lịch ra cắt cái đuôi, đóng cho nó mọt cái thùng ở sau và dùng làm công cụ chở rau cải. Điều này đương nhiên có thể làm được. Nhưng có xứng đáng công của hay không?
 
Gợi ý của bạn rất hay, Vì vậy mình sẽ tạo thêm cột để xử lý số liệu theo nhu cầu của mình, bạn có thể giúp mình 01 đoạn mã VBA để tìm kiếm dữ liệu từ nhiều sheet khác nhau được không ?
 
Gợi ý của bạn rất hay, Vì vậy mình sẽ tạo thêm cột để xử lý số liệu theo nhu cầu của mình, bạn có thể giúp mình 01 đoạn mã VBA để tìm kiếm dữ liệu từ nhiều sheet khác nhau được không ?
 
Trong sheet "BBNT" em có tạo 1 nút để in, 1 nút để chuyển số biên bản nghiệm thu, hàm vlookup dựa trên thứ tự thay đổi này để nhập dữ liệu cho biên bản từ sheet "DM".
Anh, chị giúp em gộp 2 nút: In biên bản và click chuyển số biên bản thành 1 nút: Khi click in biên bản xong tự chuyển sang số tiếp theo và tạo code thay cho hàm vlookup ạ. Mỗi một dự án lại thay đổi 1 form mẫu biển bản mà ngồi chỉnh sửa lại hàm vlookup thấy nản quá ạ.
Trận trong và cảm ơn sự giúp đỡ của các anh chị trong diễn đàn ạ!
 

File đính kèm

Để khỏi mất công làm hoài, bạn đưa file chuẩn nhất (mà bạn đang dùng) lên đây nhé
Tôi có file thế này xin nhờ giải quyết một số vấn đề. (Tôi đã đọc hết topic này mà do trình độ còn hạn chế nên chưa biết lắp ráp xử lý thế nào cho ổn thỏa)
1. Thay hàm Vlookup đang dùng quá nhiều tại các cột sheet "Dmuc" bằng VBA để chạy nổi 50 ngàn dòng mà không chậm
2. Khi thay đổi các vùng mã hóa bên sheet "MA" thì lập tức thay đổi bên sheet "Dmuc"
Trân trọng!
http://www.mediafire.com/file/wi9gs3cgdp997ip/Danh_muc.xlsx
 
Tôi có file thế này xin nhờ giải quyết một số vấn đề. (Tôi đã đọc hết topic này mà do trình độ còn hạn chế nên chưa biết lắp ráp xử lý thế nào cho ổn thỏa)
1. Thay hàm Vlookup đang dùng quá nhiều tại các cột sheet "Dmuc" bằng VBA để chạy nổi 50 ngàn dòng mà không chậm
2. Khi thay đổi các vùng mã hóa bên sheet "MA" thì lập tức thay đổi bên sheet "Dmuc"
Trân trọng!
http://www.mediafire.com/file/wi9gs3cgdp997ip/Danh_muc.xlsx

Phải nói là các bạn ở đây sốt sắng viết code quá nên người dùng ỷ lại, không chịu cấp tiến.

Vấn đề này tôi đã đề cập nhiều lần. Dữ liệu hàng chục ngàn dòng khong phải là lý do để dùng VBA. Đó là ý tưởng của thế kỷ trước, của các phiên bản Excel thượng cổ.

Thời buổi bây giờ, làm việc với số dữ liệu lớn thì phải CHỊU KHÓ HỌC PowerPivot. Cái mà Vlookup chập choạng chạy, PowerPivot chỉ làm cái vèo, hàng triệu dòng cũng được.

Và nếu có cơ họi thì nên học luôn PowerQuery.
 
Tôi có file thế này xin nhờ giải quyết một số vấn đề. (Tôi đã đọc hết topic này mà do trình độ còn hạn chế nên chưa biết lắp ráp xử lý thế nào cho ổn thỏa)
1. Thay hàm Vlookup đang dùng quá nhiều tại các cột sheet "Dmuc" bằng VBA để chạy nổi 50 ngàn dòng mà không chậm
2. Khi thay đổi các vùng mã hóa bên sheet "MA" thì lập tức thay đổi bên sheet "Dmuc"
Trân trọng!
http://www.mediafire.com/file/wi9gs3cgdp997ip/Danh_muc.xlsx
anh NDU mấy bữa rài hỏng có lên diễn đàn, chắc hỏng có rảnh
anh "Do" thì mắc "chảnh".........hihihihi(giỡ thôi nha anh Đô...)
Tôi đang tập tành ra giang hồ nên làm thử,
tôi nghĩ cái này là dạng cái form để bạn nhập liệu???
nên tôi làm cho bạn cái listbox để tìm, bạn cứ thoải mái xài bàn phím, khi vào form thì có thể sử dụng các mũi tên qua phải trái để di chuyển, enter hoặc nhấp double để chọn, esc,tab để thoát
nếu list dài quá thì gõ vài từ tìm kiếm vào textbox
(tôi đang xài unicode và font tahoma) phải gõ tiếng việt có dấu nếu muốn tìm tiếng việt
 

File đính kèm

anh NDU mấy bữa rài hỏng có lên diễn đàn, chắc hỏng có rảnh
anh "Do" thì mắc "chảnh".........hihihihi(giỡ thôi nha anh Đô...)
Tôi đang tập tành ra giang hồ nên làm thử,
tôi nghĩ cái này là dạng cái form để bạn nhập liệu???
nên tôi làm cho bạn cái listbox để tìm, bạn cứ thoải mái xài bàn phím, khi vào form thì có thể sử dụng các mũi tên qua phải trái để di chuyển, enter hoặc nhấp double để chọn, esc,tab để thoát
nếu list dài quá thì gõ vài từ tìm kiếm vào textbox
(tôi đang xài unicode và font tahoma) phải gõ tiếng việt có dấu nếu muốn tìm tiếng việt
Cám ơn anh đã cho giải pháp. Vấn đề của tôi vẫn xoay quanh vlookup hoặc gì đó tương tự. Bởi vì tôi có nhu cầu thay đổi lại các mã hóa tại sheet "MA" và muốn sheet DMuc thay đổi theo. Giải pháp của anh sau khi nhập liệu xong thì dữ liệu đã "chết" và không ngo ngoe được nữa. Kính mong anh giúp tiếp.
Trân trọng!
 
Cám ơn anh đã cho giải pháp. Vấn đề của tôi vẫn xoay quanh vlookup hoặc gì đó tương tự. Bởi vì tôi có nhu cầu thay đổi lại các mã hóa tại sheet "MA" và muốn sheet DMuc thay đổi theo. Giải pháp của anh sau khi nhập liệu xong thì dữ liệu đã "chết" và không ngo ngoe được nữa. Kính mong anh giúp tiếp.
Trân trọng!

nếu thích giải pháp vba thì tôi làm lại cho bạn
 

File đính kèm

Hay quá, lại thêm một kiến thức cần thiết. Thầy ndu96081631 cho em hỏi thêm: Như vậy là các sheet tương tự muốn lấy như sheet chitiet là ta đều phải chèn code vào sheet đó đúng không ạ?

Làm thử trên file của bạn nhé:
Mô tả:
- Nhập liệu tại cột C
- Cột D, E, G, H, I và N là những cột cần lookup
- Vậy, nếu nhập liệu 1 hoặc nhiều cell trên cột C thì những cột D, E, G, H, I và N với dòng tương ứng sẽ lấy dữ liệu từ sheet LLNV gán vào
- Nếu 1 hoặc nhiều cell trên 1 C bị xóa thì thì những cột D, E, G, H, I và N với dòng tương ứng cũng sẽ bị xóa theo
Mô tả đúng chứ?
Nếu là vậy thì tôi để xuất code thế này:
1> Nạp Dictionary
PHP:
Public Chk As Boolean, Dic As Object, aResult()
Sub Auto_Open()
  Dim wks As Worksheet, SrcRng As Range, sArray
  Dim lR As Long, i As Long, n As Long, tmp
  On Error Resume Next
  Set wks = Sheets("LLNV")
  Set SrcRng = wks.Range("B6:R1000")
  sArray = SrcRng.Value
  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
        aResult(lR, 1) = tmp
        aResult(lR, 2) = sArray(i, 2)
        aResult(lR, 3) = sArray(i, 3)
        aResult(lR, 5) = sArray(i, 5)
        aResult(lR, 6) = sArray(i, 6)
        aResult(lR, 14) = sArray(i, 14)
        aResult(lR, 13) = sArray(i, 13)
      End If
    End If
  Next
End Sub
2> Theo dỏi những thay đổi tại Sheet LLNV (để cập nhật lại Dictionary)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Chk = True
End Sub
PHP:
Private Sub Worksheet_Deactivate()
  If Chk Then
    Auto_Open
    Chk = False
  End If
End Sub
3> Nhập liệu và fill dữ liệu tại sheet ChiTiet
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, n As Long
  Dim Arr1(), Arr2(), Arr3(), tmp
  On Error Resume Next
  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C1000"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C1000"), 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 Arr1(1 To UBound(aTarget, 1), 1 To 2)
    ReDim Arr2(1 To UBound(aTarget, 1), 1 To 3)
    ReDim Arr3(1 To UBound(aTarget, 1), 1 To 1)
    For i = 1 To UBound(aTarget, 1)
      If aTarget(i, 1) <> "" Then
        tmp = aTarget(i, 1)
        If Dic.Exists(tmp) Then
          Arr1(i, 1) = aResult(Dic.Item(tmp), 2)
          Arr1(i, 2) = aResult(Dic.Item(tmp), 3)
          Arr2(i, 1) = aResult(Dic.Item(tmp), 5)
          Arr2(i, 2) = aResult(Dic.Item(tmp), 6)
          Arr2(i, 3) = aResult(Dic.Item(tmp), 14)
          Arr3(i, 1) = aResult(Dic.Item(tmp), 13)
        End If
      End If
    Next
    rTarget.Offset(, 1).Resize(, 2).Value = Arr1
    rTarget.Offset(, 4).Resize(, 3).Value = Arr2
    rTarget.Offset(, 11).Resize(, 1).Value = Arr3
  End If
End Sub
Xem file đính kèm và thí nghiệm nhé ---> Có gì sơ sót, ta bàn tiếp
(Nói thiệt, làm mấy bài này chán bỏ xừ... lại hại não)
 
Hay quá, lại thêm một kiến thức cần thiết. Thầy ndu96081631 cho em hỏi thêm: Như vậy là các sheet tương tự muốn lấy như sheet chitiet là ta đều phải chèn code vào sheet đó đúng không ạ?

Lâu quá quên mất tiêu rồi bạn ơi!
Muốn gì cứ việc thử nghiệm, trục trặc ở đâu ta giải quyết ở đó
 
Lâu quá quên mất tiêu rồi bạn ơi!
Muốn gì cứ việc thử nghiệm, trục trặc ở đâu ta giải quyết ở đó

Em làm thì làm thử nghiệm hết rồi, hiện tại để dùng được ở sheet nào em phải chèn code vào sheet đó. Em có đọc qua về vụ chèn vào module nhưng vẫn phải cần code phụ ở sheet cần chạy.
 
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
Thầy cho em hỏi, khi tìm được mã ở sheet chi tiết, mình muốn lưu sheet chi tiết này sang sheet mới (sheet 3), rồi mình tìm tiếp và lưu sang sheet mới (sheet 4)... thì dùng code như thế nào ạ (nếu có thể lưu sang sheet khác thì vẫn canh chuẩn trang in ở sheet chi tiết). Em xin cám ơn ạ.
 
Lâu quá quên mất tiêu rồi bạn ơi!
Muốn gì cứ việc thử nghiệm, trục trặc ở đâu ta giải quyết ở đó

À là như vầy thầy ndu96081631 ạ, không có một trục trặc nhỏ nào ngoài chuyện mỗi sheet cần chạy được code trên thì đều phải chèn code vào chính sheet đó. Có cách nào mà thay vì để code trong sheet ta để vào một chỗ khác mà dùng cho toàn bộ các sheet không thầy?
 
À là như vầy thầy ndu96081631 ạ, không có một trục trặc nhỏ nào ngoài chuyện mỗi sheet cần chạy được code trên thì đều phải chèn code vào chính sheet đó. Có cách nào mà thay vì để code trong sheet ta để vào một chỗ khác mà dùng cho toàn bộ các sheet không thầy?

Thử dùng trong This Workbook
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub
 
Xin chào anh/chị , em vừa mới tham gia diễn đàn , có viết bài chưa đúng nội quy hoặc chưa chuẩn như yêu cầu của Forum thì mong anh/chị bỏ qua giúp em ạ

Em có bảng tính gồm 3 sheet như sau :

- Sheet "Record Ticket" là sheet chính để em thao tác làm báo cáo -
- Sheet "Vlookup Data" là sheet em dùng để tham chiếu cho các colum ở sheet "Record Ticket" -
- Sheet "Phân Loại-Cập Nhật Ticket" là sheet em dùng để tìm kiếm và phân loại lỗi Ticket -

Em xin các anh/chị hỗ trợ em trường hợp sau ạ :

- Ở Sheet "Record Ticket" em đang sử dụng hàm "Vlookup" ở Colum "G"-"H"-"I" (Chú thích : khi em nhập tay "Code NPP" ở Colum 'H' thì "Mail" ở Colum 'G' và "Tên NPP" ở Colum 'I' sẽ tự hiện ra nhờ tham chiếu bằng hàm Vlookup).

-> Các anh/chị có thể hỗ trợ em thay thế hàm Vlookup bằng code VBA được không ạ ? <-
-> Các anh/chị có thể tùy biến như thế nào để em có thể nhập liệu nhanh chóng được không ạ ? <-

-----[Em có một ý tưởng là : Ở Sheet "Record Ticket" khi em nhập liệu vào Colum "L" (Nhóm Ticket) thì Colum "M" (Loại Ticket) cũng sẽ nhảy dữ liệu theo hoặc ngược lại] được không ạ ?-----

Em có hide đi 2 sheet ở chế độ bình thường , các anh/chị nào cần dữ liệu thêm thì unhide 2 sheet đó ra nhé .

Em xin cám ơn anh/chị , rất mong anh chị hỗ trợ em trường hợp này ạ
 

File đính kèm

Bạn chép code này đè lên cái cũ nhé
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 4)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))
                Next I
                    If d.exists(UCase(Target.Value)) Then
                        Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                        Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                        Target.Offset(, 5) = d.Item(UCase(Target.Value))(2)
                    End If
            End If
         End If
End Sub
Thân

Vậy mình muốn xuất 1 Msgbox " khong tim thay du lieu" nếu dữ liệu nhập không nằm trong sheet MA thì sao bạn mình mò vẫn chưa ra
 

File đính kèm

Thầy ndu96081631 cho em hỏi thêm về file thực hành 3. Bây giờ em muốn thêm 3 sheet giống như sheet LLNV thì phải làm như thế nào để lấy dữ liệu của tất cả các sheet đó? Vd: sheet A, sheet B, sheet C, sheet D... sheet chitiết thì vẫn là 1 nhưng do vi trí các cột của sheet A, sheet B, sheet C, sheet D... lại không giống như sheet LLNV. Em cám ơn nhìu ạ.
 
Làm thử trên file của bạn nhé:
Mô tả:
- Nhập liệu tại cột C
- Cột D, E, G, H, I và N là những cột cần lookup
- Vậy, nếu nhập liệu 1 hoặc nhiều cell trên cột C thì những cột D, E, G, H, I và N với dòng tương ứng sẽ lấy dữ liệu từ sheet LLNV gán vào
- Nếu 1 hoặc nhiều cell trên 1 C bị xóa thì thì những cột D, E, G, H, I và N với dòng tương ứng cũng sẽ bị xóa theo
Mô tả đúng chứ?
Nếu là vậy thì tôi để xuất code thế này:
1> Nạp Dictionary
PHP:
Public Chk As Boolean, Dic As Object, aResult()
Sub Auto_Open()
  Dim wks As Worksheet, SrcRng As Range, sArray
  Dim lR As Long, i As Long, n As Long, tmp
  On Error Resume Next
  Set wks = Sheets("LLNV")
  Set SrcRng = wks.Range("B6:R1000")
  sArray = SrcRng.Value
  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
        aResult(lR, 1) = tmp
        aResult(lR, 2) = sArray(i, 2)
        aResult(lR, 3) = sArray(i, 3)
        aResult(lR, 5) = sArray(i, 5)
        aResult(lR, 6) = sArray(i, 6)
        aResult(lR, 14) = sArray(i, 14)
        aResult(lR, 13) = sArray(i, 13)
      End If
    End If
  Next
End Sub
2> Theo dỏi những thay đổi tại Sheet LLNV (để cập nhật lại Dictionary)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Chk = True
End Sub
PHP:
Private Sub Worksheet_Deactivate()
  If Chk Then
    Auto_Open
    Chk = False
  End If
End Sub
3> Nhập liệu và fill dữ liệu tại sheet ChiTiet
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, n As Long
  Dim Arr1(), Arr2(), Arr3(), tmp
  On Error Resume Next
  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C1000"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C1000"), 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 Arr1(1 To UBound(aTarget, 1), 1 To 2)
    ReDim Arr2(1 To UBound(aTarget, 1), 1 To 3)
    ReDim Arr3(1 To UBound(aTarget, 1), 1 To 1)
    For i = 1 To UBound(aTarget, 1)
      If aTarget(i, 1) <> "" Then
        tmp = aTarget(i, 1)
        If Dic.Exists(tmp) Then
          Arr1(i, 1) = aResult(Dic.Item(tmp), 2)
          Arr1(i, 2) = aResult(Dic.Item(tmp), 3)
          Arr2(i, 1) = aResult(Dic.Item(tmp), 5)
          Arr2(i, 2) = aResult(Dic.Item(tmp), 6)
          Arr2(i, 3) = aResult(Dic.Item(tmp), 14)
          Arr3(i, 1) = aResult(Dic.Item(tmp), 13)
        End If
      End If
    Next
    rTarget.Offset(, 1).Resize(, 2).Value = Arr1
    rTarget.Offset(, 4).Resize(, 3).Value = Arr2
    rTarget.Offset(, 11).Resize(, 1).Value = Arr3
  End If
End Sub
Xem file đính kèm và thí nghiệm nhé ---> Có gì sơ sót, ta bàn tiếp
(Nói thiệt, làm mấy bài này chán bỏ xừ... lại hại não)

Chào Thầy
Em đã thử và chạy rất nhanh và hiệu quả, tuy nhiên em muốn thêm 1 điều kiện nếu không thỏa mãn điều kiện tham chiếu mặc định nó sẽ hiển thị trống ( tức trong sheet LLNV không có mã số thẻ tham chiếu của số thẻ sheet chi tiết ), thì nó hiển thị là "Khác" có được không thầy?
Mục đích nhầm trong vận hành khi nhập model mới từ nhà cung cấp các mã hàng mới chưa cập nhật trong DATA SẢN PHẨM mình dựa vào đó sẽ biết và cập nhật thêm.
Em cám ơn
 
Lâu quá quên mất tiêu rồi bạn ơi!
Muốn gì cứ việc thử nghiệm, trục trặc ở đâu ta giải quyết ở đó
Em chào các bạn GPE.
Em có file dữ liệu cần lọc với khoảng 160.000 dòng (và sẽ còn tăng ạ) muốn nhờ các anh chị làm giúp em VBA vì hiện tại em làm bằng VLOOKUP rất cực ạ.
Do file quá nặng, nên em nén còn gần 24MB và up lên mediafire ạ.
Em cảm ơn các anh chị!
Link:
http://www.mediafire.com/file/oo38c1j42eizm3a/BaoCaoHangChiTiet.rar
 
Em chào các bạn GPE.
Em có file dữ liệu cần lọc với khoảng 160.000 dòng (và sẽ còn tăng ạ) muốn nhờ các anh chị làm giúp em VBA vì hiện tại em làm bằng VLOOKUP rất cực ạ.
Do file quá nặng, nên em nén còn gần 24MB và up lên mediafire ạ.
Em cảm ơn các anh chị!
Link:
http://www.mediafire.com/file/oo38c1j42eizm3a/BaoCaoHangChiTiet.rar
@truongvu317 sao tớ không thấy nick cậu sáng nhỉ? Tớ vừa thấy cậu post bài xong.
 
@truongvu317 sao tớ không thấy nick cậu sáng nhỉ? Tớ vừa thấy cậu post bài xong.
Tớ ẩn trạng thái thì làm sao mà thấy được, mà không được đăng nhiều bài liên tục như trên, dễ bị coi là spam, rồi chặn nick cho mà xem rồi kêu khổ. Trên gpe này cứ yên tâm một điều là để bài rõ ràng thì chắc chắn những thành viên có khả năng giúp sẽ giúp.
 
Tớ ẩn trạng thái thì làm sao mà thấy được, mà không được đăng nhiều bài liên tục như trên, dễ bị coi là spam, rồi chặn nick cho mà xem rồi kêu khổ. Trên gpe này cứ yên tâm một điều là để bài rõ ràng thì chắc chắn những thành viên có khả năng giúp sẽ giúp.
Ẩn ở chỗ nào ấy cậu nhỉ? Cậu vào xem giúp tớ với. File nặng quá, mỗi lần mở ra đợi lâu, lúc chạy còn treo máy luôn.
 
Em chào các bạn GPE.
Em có file dữ liệu cần lọc với khoảng 160.000 dòng (và sẽ còn tăng ạ) muốn nhờ các anh chị làm giúp em VBA vì hiện tại em làm bằng VLOOKUP rất cực ạ.
Do file quá nặng, nên em nén còn gần 24MB và up lên mediafire ạ.
Em cảm ơn các anh chị!
Link:
http://www.mediafire.com/file/oo38c1j42eizm3a/BaoCaoHangChiTiet.rar
Anh chị có teamviewer vào giúp em với ạ.
 
Mã nó đây
RightClick vào sheet "CT" ==> View Code chép cái này vào
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3))
                Next I
                    If d.exists(UCase(Target.Value)) Then
                        Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                        Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                    End If
            End If
         End If
End Sub
Thân
Sao mình dùng code nay nếu mã hành hóa lá chữ vd như A,B,C,D.. thì ok nhưng khi mã hàng là số thì khg dc. Mong các bác chỉ giáo. Mình khg lót file đc
 
Sao mình dùng code nay nếu mã hành hóa lá chữ vd như A,B,C,D.. thì ok nhưng khi mã hàng là số thì khg dc. Mong các bác chỉ giáo. Mình khg lót file đc
Chuyển Key về dạng chuỗi, chỉnh lại tí tẹo
d.Add UCase(Vung(I, 1)), Array(Vung(I, 2), Vung(I, 3))
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    d.Add UCase(Vung(I, 1)), Array(Vung(I, 2), Vung(I, 3))
                Next I
                    If d.exists(UCase(Target.Value)) Then
                        Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                        Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                    End If
            End If
         End If
End Sub
 
Mã nó đây
RightClick vào sheet "CT" ==> View Code chép cái này vào
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3))
                Next I
                    If d.exists(UCase(Target.Value)) Then
                        Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                        Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                    End If
            End If
         End If
End Sub
Thân
Xin hỏi các anh chị nếu tên sheet có dấu thì sửa code này thế nào ạ
 
Sửa file nguồn hả anh. hay sửa trong vba ạ. xin cảm ơn

Sửa tại dòng, chỗ chữ màu đỏ kìa bạn, sửa theo tên sheet không dấu mà bạn đặt ấy:
Set Ws = Sheets("MA")

Bạn sửa thành:
Set Ws = Sheets("Ngach_So")

--------

Cũng có nhiều cách như: Lấy theo tên sheet,lấy theo thứ tự sheet, lấy theo tên của đối tượng worksheet trong VBA.
Bạn tham khảo link:
https://www.giaiphapexcel.com/diendan/threads/bài-5-workbook-worksheet.130566/

--------

khổ nỗi tên sheet của em có dấu thì viết làm sao ạ

Nếu cứ nhất thiết phải đưa tên sheet có dấu ("ngạch sớ") vào code thì bạn sửa/ bổ sung các chỗ màu đỏ như sau:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim d, I, Vung, Ws
Dim tensheet As String
tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899) 'ngạch sớ

Set d = CreateObject("scripting.dictionary")
Set Ws = Sheets(tensheet)
Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
...
End Sub
 
Tôi không biết cách nào. Thua luôn.
Dạ xin cám ơn nhiều
Bài đã được tự động gộp:

Sửa tại dòng, chỗ chữ màu đỏ kìa bạn, sửa theo tên sheet không dấu mà bạn đặt ấy:
Set Ws = Sheets("MA")

Bạn sửa thành:
Set Ws = Sheets("Ngach_So")

--------

Cũng có nhiều cách như: Lấy theo tên sheet,lấy theo thứ tự sheet, lấy theo tên của đối tượng worksheet trong VBA.
Bạn tham khảo link:
https://www.giaiphapexcel.com/diendan/threads/bài-5-workbook-worksheet.130566/

--------



Nếu cứ nhất thiết phải đưa tên sheet có dấu ("ngạch sớ") vào code thì bạn sửa/ bổ sung các chỗ màu đỏ như sau:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim d, I, Vung, Ws
Dim tensheet As String
tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899) 'ngạch sớ

Set d = CreateObject("scripting.dictionary")
Set Ws = Sheets(tensheet)
Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
...
End Sub
xin bác cho code hoàn chỉnh ạ. xin cám ơn
 
Lần chỉnh sửa cuối:
xin bác cho code hoàn chỉnh ạ. xin cám ơn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3))
            Next I
                If d.exists(UCase(Target.Value)) Then
                    Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                    Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                End If
        End If
     End If
End Sub
 
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3))
            Next I
                If d.exists(UCase(Target.Value)) Then
                    Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                    Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                End If
        End If
     End If
End Sub
Dạ xin cảm ơn nhưng nó vẫn báo lỗi ạ
 
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3))
            Next I
                If d.exists(UCase(Target.Value)) Then
                    Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                    Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                End If
        End If
     End If
End Sub
Bỏ Dic được không bạn
 
Con chào Bác Hiếu,
Con chưa viết được mảng, trừ khi sử dụng worksheetfunction thì may ra có thể.
Bác cho con thêm một cách tham khảo với ạ.
Cảm ơn Bác.
Viết thử xem sao, tương tự code cũ chỉ bỏ Dic là ổn
Dic dùng khi tìm nhiều kết quả, 1 kết quả thì hơi lãng phí
 
Viết thử xem sao, tương tự code cũ chỉ bỏ Dic là ổn
Dic dùng khi tìm nhiều kết quả, 1 kết quả thì hơi lãng phí
Nhờ Bác Hiếu góp ý thêm ạ!
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                If Target.Value = Vung(I, 1) Then
                  Target.Offset(, 1) = Vung(I, 2)
                  Target.Offset(, 2) = Vung(I, 3)
                End If
            Next I
        End If
     End If
End Sub
 
Lần chỉnh sửa cuối:
Nhờ Bác Hiếu góp ý thêm ạ!
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                If Target.Value = Vung(I, 1) Then
                  Target.Offset(, 1) = Vung(I, 2)
                  Target.Offset(, 2) = Vung(I, 3)
                End If
            Next I
        End If
     End If
End Sub
áp dụng sheet có dấu đi bạn ơi
 
áp dụng sheet có dấu đi bạn ơi
Không sử dụng code của OT được đâu bạn vì nó rất dở, chỉ là OT cố viết theo gợi ý của Bác Hiếu để đưowjc Bác ấy chỉ dẫn thêm thôi :D
Trong trường hợp nếu nhập từ khóa không có trong danh mục từ khóa tìm kiếm thì OT chưa khắc phục được lỗi này.
Nếu bạn muốn thử trên sheet "Ngạch sớ" có dấu thì đây ạ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet, Key As String
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            Key = Target.Value
            For I = 1 To UBound(Vung)
                If Key = Vung(I, 1) Then
                    Target.Offset(, 1) = Vung(I, 2)
                    Target.Offset(, 2) = Vung(I, 3)
                    Exit Sub
                End If
            Next I
        End If
     End If
End Sub

Sửa: bổ thêm Exit Sub để tăng tốc :D
 
Nhờ Bác Hiếu góp ý thêm ạ!
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                If Target.Value = Vung(I, 1) Then
                  Target.Offset(, 1) = Vung(I, 2)
                  Target.Offset(, 2) = Vung(I, 3)
                End If
            Next I
        End If
     End If
End Sub
Chuẩn rồi :) Thêm lệnh Exit Sub sau khi gán kết quả để tăng tốc code
 
Không sử dụng code của OT được đâu bạn vì nó rất dở, chỉ là OT cố viết theo gợi ý của Bác Hiếu để đưowjc Bác ấy chỉ dẫn thêm thôi :D
Trong trường hợp nếu nhập từ khóa không có trong danh mục từ khóa tìm kiếm thì OT chưa khắc phục được lỗi này.
Nếu bạn muốn thử trên sheet "Ngạch sớ" có dấu thì đây ạ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet, Key As String
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            Key = Target.Value
            For I = 1 To UBound(Vung)
                If Key = Vung(I, 1) Then
                    Target.Offset(, 1) = Vung(I, 2)
                    Target.Offset(, 2) = Vung(I, 3)
                    Exit Sub
                End If
            Next I
        End If
     End If
End Sub

Sửa: bổ thêm Exit Sub để tăng tốc :D
áp dụng sao không được nhỉ bạn ợi
 
dạ xin cảm ơn thật tuyệt. Xin hỏi có cách nào làm trên Module không ạ
Copy code vào sheet CT
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            Application.EnableEvents = False
            Application.ScreenUpdating = False
            
            Target.Offset(0, 1).Resize(, 2) = Empty
            Call VlookupVBA(Target)
            
            Application.ScreenUpdating = True
            Application.EnableEvents = True
        End If
     End If
End Sub
Tạo 1 Module và dán code
Mã:
Sub VlookupVBA(ByVal Target As Range)
    Dim i As Long, sRow As Long
    Dim sArr(), iKey As String, TenSheet As String
    
    TenSheet = "Ng" & ChrW(7841) & "ch s" & ChrW(7899)
    With Sheets(TenSheet)
      i = .Range("B" & Rows.Count).End(xlUp).Row
      If i < 3 Then Exit Sub
      sArr = .Range("B3:D" & i).Value
    End With
    
    iKey = UCase(Target.Value)
    sRow = UBound(sArr)
    For i = 1 To sRow
      If UCase(sArr(i, 1)) = iKey Then
        Target.Offset(, 1) = sArr(i, 2)
        Target.Offset(, 2) = sArr(i, 3)
        Exit Sub
      End If
    Next i
End Sub
Code chỉ xử lý 1 kết quả
 
Chuẩn rồi :) Thêm lệnh Exit Sub sau khi gán kết quả để tăng tốc code

Dạ, cảm ơn Bác Hiếu!
Nếu không sử dụng Dic thì con chưa biết khắc phục trường hợp này:
Trong trường hợp nếu nhập từ khóa không có trong danh mục từ khóa tìm kiếm thì OT chưa khắc phục được lỗi này.
Con đang tính thêm 1 vòng lặp nữa để làm việc này nhưng con chưa thử :D
Bác chỉ thêm cho con ạ.
 
Nói cụ thể hơn mới rỏ lỗi gì
Ý bạn OT đang nói đến việc tìm kiếm trong vùng đó mà không có sẽ xảy ra lỗi #NA đó Anh, Bạn đó chắc muốn khử lỗi #NA này, Em đoán vậy, không biết đúng không nữa,
 
Nói cụ thể hơn mới rỏ lỗi gì
Dạ,ví dụ trong trường hợp nhập từ khóa là "AB" vào sheet "CT" mà trong sheet "Ngạch sớ" tại cột B không có từ khóa này Bác ạ.
Thông thường nếu nhập từ khóa "AB" nếu mà dữ liệu 2 cột liền kề không có dữ liệu thì không sao nhưng nếu có dữ liệu rồi thì nó sẽ để nguyên dữ liệu cũ.

Con khắc phục như thế này, thêm dòng:
Target.Offset(, 1).Resize(, 2).ClearContents
hình như có vẻ ổn :D
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long, Vung As Variant, Ws As Worksheet, Key As String
    Dim tensheet As String
    tensheet = "ng" & ChrW(7841) & "ch s" & ChrW(7899)
    Set Ws = Sheets(tensheet)
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 3)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            Target.Offset(, 1).Resize(, 2).ClearContents
            Key = Target.Value
            For I = 1 To UBound(Vung)
                If Key = Vung(I, 1) Then
                    Target.Offset(, 1) = Vung(I, 2)
                    Target.Offset(, 2) = Vung(I, 3)
                    Exit Sub
                End If
            Next I
        End If
     End If
End Sub
 
Con chưa viết được mảng, trừ khi sử dụng worksheetfunction thì may ra có thể.
Xài mảng đây:
Muốn bẫy lỗi gì thêm thì thêm vào.
PHP:
Option Explicit
Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Vung(), I As Long, R As Long, DK As Boolean
If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
    If Target.Count = 1 Then
        Vung = Sheets("MA").Range("B3", Sheets("MA").Range("B10000").End(xlUp)).Resize(, 3).Value
        R = UBound(Vung)
        With Target
            .Offset(, 1).Resize(, 2).ClearContents
            For I = 1 To R
                If .Value = Vung(I, 1) Then
                    .Offset(, 1) = Vung(I, 2)
                    .Offset(, 2) = Vung(I, 3)
                    DK = True
                    Exit Sub
                End If
            Next I
        End With
        If DK = False Then MsgBox "Khong tim thay Coi Ta Ba", , "GPE"
    End If
End If
End Sub
 
Lần chỉnh sửa cuối:
Xài mảng đây:
Muốn bẫy lỗi gì thêm thì thêm vào.
PHP:
Option Explicit
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Vung(), I As Long, R As Long, DK As Boolean
If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
    If Target.Count = 1 Then
        Vung = Sheets("MA").Range("B3", Sheets("MA").Range("B10000").End(xlUp)).Resize(, 3).Value
        R = UBound(Vung)
        For I = 1 To R
            If Target.Value = Vung(I, 1) Then
                  Target.Offset(, 1) = Vung(I, 2)
                  Target.Offset(, 2) = Vung(I, 3)
                DK = True
                Exit Sub
            End If
        Next I
        If DK = False Then MsgBox "Khong tim thay Coi Ta Ba", , "GPE"
    End If
End If
End Sub
Dạ con cảm ơn Thầy nhiều.
Cái MsgBox của Thầy vui vẻ quá ạ :D
Bài đã được tự động gộp:

áp dụng sao không được nhỉ bạn ợi
Bạn có thể nói rõ hơn được không ạ?
 
Bạn chép code này đè lên cái cũ nhé
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, I, Vung, Ws
    Set d = CreateObject("scripting.dictionary")
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 4)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))
                Next I
                    If d.exists(UCase(Target.Value)) Then
                        Target.Offset(, 1) = d.Item(UCase(Target.Value))(0)
                        Target.Offset(, 2) = d.Item(UCase(Target.Value))(1)
                        Target.Offset(, 5) = d.Item(UCase(Target.Value))(2)
                    End If
            End If
         End If
End Sub
Thân
Tiện quá bác ạ. Nếu rảnh bác có thể thêm chú thích các dòng được không ạ, em gà quá nên không hiểu, nhưng lại muốm áp dụng qua các bảng có cấu tạo khác. Cảm ơn bác
 
(1) Nếu rảnh bác có thể thêm chú thích các dòng được không ạ, (2) em gà quá nên không hiểu, nhưng lại muốm áp dụng qua các bảng có cấu tạo khác.
(1) Ông này hay nhậu nên ít rảnh;
(2) Bạn không hiểu toàn bộ hay vài dòng trong toàn bộ? Nếu là toàn bộ thì dịch tất tần tật mọi câu lệnh bạn cũng chả xài được.
. . . . .
 
Xài mảng đây:
Muốn bẫy lỗi gì thêm thì thêm vào.
PHP:
Option Explicit
Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Vung(), I As Long, R As Long, DK As Boolean
If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
    If Target.Count = 1 Then
        Vung = Sheets("MA").Range("B3", Sheets("MA").Range("B10000").End(xlUp)).Resize(, 3).Value
        R = UBound(Vung)
        With Target
            .Offset(, 1).Resize(, 2).ClearContents
            For I = 1 To R
                If .Value = Vung(I, 1) Then
                    .Offset(, 1) = Vung(I, 2)
                    .Offset(, 2) = Vung(I, 3)
                    DK = True
                    Exit Sub
                End If
            Next I
        End With
        If DK = False Then MsgBox "Khong tim thay Coi Ta Ba", , "GPE"
    End If
End If
End Sub
Vâng thưa anh, khi em muốn điều chỉnh lấy dữ liệu ở sheet "MA" là cột 2, giá trị tìm kiếm thay sang ở cột 5, 6... ở sheet "CT" thì chỉnh như thế nào ạ? và khi quét vùng nhập dữ liệu ở cột B sheet "CT" xóa thì dữ liệu tìm kiếm không xóa theo. Như vậy phải khắc phục như thế nào ạ? Em chân thành cảm ơn!
 
Vâng thưa anh, khi em muốn điều chỉnh lấy dữ liệu ở sheet "MA" là cột 2, giá trị tìm kiếm thay sang ở cột 5, 6... ở sheet "CT" thì chỉnh như thế nào ạ? và khi quét vùng nhập dữ liệu ở cột B sheet "CT" xóa thì dữ liệu tìm kiếm không xóa theo. Như vậy phải khắc phục như thế nào ạ? Em chân thành cảm ơn!
Bạn gởi file cụ thể lên đi, tưởng tượng ra ý bạn muốn thì khó quá.
 
Bạn gởi file cụ thể lên đi, tưởng tượng ra ý bạn muốn thì khó quá.
Vâng, vẫn là file cũ ah!
Bài đã được tự động gộp:

Bạn gởi file cụ thể lên đi, tưởng tượng ra ý bạn muốn thì khó quá.
Ý em là ở Sheet "MA" thứ tự các cột là "mã, tên, đơn vị, đơn giá" khi giá trị tìm kiếm ở sheet "CT" thì thứ tự các cột có thể thay đổi "mã, xx,xx tên, đơn giá, đơn vị..." chẳng hạn. Không theo thứ tự cột thì phải làm thế nào ah?
 

File đính kèm

Lần chỉnh sửa cuối:
Vâng, vẫn là file cũ ah!
Bài đã được tự động gộp:


Ý em là ở Sheet "MA" thứ tự các cột là "mã, tên, đơn vị, đơn giá" khi giá trị tìm kiếm ở sheet "CT" thì thứ tự các cột có thể thay đổi "mã, xx,xx tên, đơn giá, đơn vị..." chẳng hạn. Không theo thứ tự cột thì phải làm thế nào ah?
Thử cái này.
 

File đính kèm

Em cảm ơn anh rất nhiều, tuy ở đây có 1 cái lỗi là khi quét giá trị ở cột "MA" của sheet "CT" thì giá trị tìm kiếm không tự xóa theo mà phải xóa từng mã một. Có cách nào khắc phục không ah.
Không hiểu ý của bạn lắm.Nói rõ xem nào.
 
Không hiểu ý của bạn lắm.Nói rõ xem nào.
Quét xóa giá trị ở cột "MA" của sheet "CT" thì các giá trị tìm kiếm không xóa theo, mà chỉ xóa được từng mã một. Anh cứ xóa giá trị ở cột "MA" sẽ thấy ah.
Bài đã được tự động gộp:

Không hiểu ý của bạn lắm.Nói rõ xem nào.
Quét vùng đó và xóa thì giá trị tìm kiếm không tự xóa ah, chỉ xóa từng mã một thì mới được. Và còn 1 cái chưa hoàn thiện nữa nhờ anh giúp em là khi copy mã paste vào cột "MA" thì các giá trị tìm kiếm không nhận được mà chỉ nhập từng mã một mới nhận giá trị tìm kiếm ah. Anh giúp em khắc phục được điểm này nữa thì sẽ hoàn thiện hơn ạ. Em xin chân thành cảm ơn!
 

File đính kèm

  • 1.jpg
    1.jpg
    115.1 KB · Đọc: 23
Lần chỉnh sửa cuối:
Vâng, vẫn là file cũ ah!
Bài đã được tự động gộp:


Ý em là ở Sheet "MA" thứ tự các cột là "mã, tên, đơn vị, đơn giá" khi giá trị tìm kiếm ở sheet "CT" thì thứ tự các cột có thể thay đổi "mã, xx,xx tên, đơn giá, đơn vị..." chẳng hạn. Không theo thứ tự cột thì phải làm thế nào ah?
Bạn xem thử file này.
 

File đính kèm

Thật tuyệt, cảm ơn anh rất nhiều.
Em còn một điểm mong các anh giúp em nữa. Đó là Khi em tạo một Spinner như trong file, khi biến chạy tăng thì bảng dữ liệu tự cập nhật. Các anh giúp em một lần nữa, nếu được như vậy em xin chân thành cảm ơn ạ!
 

File đính kèm

Thật tuyệt, cảm ơn anh rất nhiều.
Em còn một điểm mong các anh giúp em nữa. Đó là Khi em tạo một Spinner như trong file, khi biến chạy tăng thì bảng dữ liệu tự cập nhật. Các anh giúp em một lần nữa, nếu được như vậy em xin chân thành cảm ơn ạ!
Mong các anh giúp em với ạ? có như vậy mới thay thế được Vlookup khi có dùng công cụ Spinner. Em xin chân thành cảm ơn!
 
Lần chỉnh sửa cuối:
Thật tuyệt, cảm ơn anh rất nhiều.
Em còn một điểm mong các anh giúp em nữa. Đó là Khi em tạo một Spinner như trong file, khi biến chạy tăng thì bảng dữ liệu tự cập nhật. Các anh giúp em một lần nữa, nếu được như vậy em xin chân thành cảm ơn ạ!
Bạn xem.
 

File đính kèm

Mã:
Dim i As Long
                For i = 1 To Range("K10000").End(xlUp).Row - 5
                    Range("D" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 2, 0)
                    Range("E" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 3, 0)
                    Range("F" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 4, 0)
                    Range("L" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 6, 0)
                    Range("O" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 5, 0)
                    Range("J" & i + 5).Value = WorksheetFunction.VLookup(Range("P" & i + 5).Value, Sheet7.Range("H3:I400"), 2, 0)
                Next
Ai có thể giúp em viết code dùng mảng để thay thế đoạn code này của em với ạ. Code này chạy hơi chậm do phải load lại tất cả các dòng.nếu sau này Data có vài nghìn dòng thì đơ luôn quá. Em mày mò viết, không học cơ bản nên có gì các anh chị thông cảm.

Em muốn là khi ấn nhập dữ liệu hoặc sửa dữ liệu thì các cột D, E, F, L, O, J sẽ tự điền luôn ạ.
Em xin chân thành cám ơn ạ.
 

File đính kèm

Tôi thấy có vẻ nhiều người hơi lạm dụng Dictionary. Dictionary mạnh và không dễ thay thế được trong một vài trường hợp không có nghĩa là nó tốt cho mọi trường hợp. Tỏi nếu nấu với món "này" thì tuyệt nhưng không có nghĩa là nấu món nào cũng cho tỏi. Không phải mổ trâu, lợn, gà, bóc tỏi, gọt táo đều dùng dao mổ trâu. Lợi thì chắc không mà hại thì nhiều.
Sửa một chút code trên thành

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I, Vung, Ws
    Set Ws = Sheets("MA")
    Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 4)
    If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
        If Target.Count = 1 Then
            For I = 1 To UBound(Vung)
                If Vung(I, 1) = Ucase(Target.Value) Then
                    Target.Offset(, 1) = Vung(I, 2)
                    Target.Offset(, 2) = Vung(I, 3)
                    Target.Offset(, 5) = Vung(I, 4)
                    Exit For
                End If
            Next I
        End If
    End If
End Sub

nếu tôi không lầm thì code tốt hơn. Trong trường hợp xấu nhất thì cũng chỉ phải duyệt (FOR) tất cả các dòng của Vung, còn trong trường hợp tốt nhất thì chỉ duyệt có 1 dòng. Dùng Dictionary như trên luôn phải duyệt tất cả các dòng, rồi với mỗi dòng đó làm "động tác" d.Add ... (thừa)
Nếu số dòng không phải là "vài" mà là "mấy trăm" (mã không phải là A --> Z mà là vd. wxyz) thì chắc chắn code dùng Dictionary như trên sẽ làm nhiều việc hơn, lâu hơn.
MỌI NGƯỜI CHO EM HỎI, EM DÙNG CODE NÀY NHƯNG KHI E THAY MÃ ABCD THÀNH SỐ 1234 THÌ LẠI KHÔNG ĐƯỢC NHỈ?
 

File đính kèm

chào cả nhà, e có file như ở dưới nhờ mọi người sửa lại mã code để khi e sửa dữ liệu nguồn ở sheet11111 thì dữ liệu ở sheet22222 sẽ tự động cập nhật theo giống như hàm vlookup đó. Trong sheet22222 thì cột S dùng để nhập mã tham chiếu, các cột còn lại là kết quả cần hiện. E xin cám ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Xin chào các anh chị ạ
Em xin hỏi câu hỏi như chủ top nhưng sheet MA lại là 1 file khác không cùng trên worksheet này thì làm như thế nào ạ
em muốn dán đường dẫn file MA đó vào ô nào đâý ở sheet CT, để khi thay đổi thì chỉ cần paste đường dẫn mới của MA vào đó là ok ạ
cảm ơn các anh chị
 
1595218677683.png

Nhờ cả nhà giúp đỡ với ah.
Em chạy công thức này trên file của e nó cứ báo Micro name. Vậy nghĩa là sao vậy ah.
1595219359803.png
Em gửi file của e nhờ các bác chỉ dạy. Em ko có hiểu gì về VBA hết nên chỉ biết copy, paste vô thôi ah.
 

File đính kèm

  • 01.06.xlsx
    01.06.xlsx
    2.3 MB · Đọc: 6
  • 1595219308633.png
    1595219308633.png
    40 KB · Đọc: 6
Lần chỉnh sửa cuối:
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!
 
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!
Thì ít ra bạn cũng lôi cái code đó lên đây.Và xem nó lỗi ở đâu.Tốt nhất gửi file lỗi lên.
 

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

Back
Top Bottom