Xin viết dùng mã vba thay thế cho hàm vlookup

Liên hệ QC
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

  • DATA2016(VLOOKUP VBA).rar
    922.2 KB · Đọc: 121
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

  • BBNT 1.1.8.7.10.5.xlsx
    149.1 KB · Đọc: 23
Để 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

  • ListBox_ADO.xlsb
    97.3 KB · Đọc: 71
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

  • ListBox_ADO.xlsb
    81.7 KB · Đọc: 130
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)
 
Web KT
Back
Top Bottom