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
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 !
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).
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).
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)
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 ạ!
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.
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
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!
Hay quá, lại thêm một kiến thức cần thiết. Thầy ndu96081631cho 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 ndu96081631cho 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 ạ?
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à 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?
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 ạ
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ầy ndu96081631cho 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
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
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
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
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.
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
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
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
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
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
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
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ạn có thể gửi file kèm của bạn lên đây được không ạ?
OT thấy bạn có vẻ chưa biết một chút nào về code nên cũng thấy khó có thể giải thích để bạn hiểu quá.
Bạn có thể gửi file kèm của bạn lên đây được không ạ?
OT thấy bạn có vẻ chưa biết một chút nào về code nên cũng thấy khó có thể giải thích để bạn hiểu quá.
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
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.
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.
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
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
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
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
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
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
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
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
Ý 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,
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
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
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
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
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) Ô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.
. . . . .
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!
Ý 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?
Ý 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?
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.
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.
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.
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!
Ý 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ậ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 ạ!
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 ạ!
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 ạ!
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 ạ.
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.
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!
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ị
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.
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.