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

Liên hệ QC
Anh tính thời gian thế này thì sai rồi, anh phải tính cả thời gian mà load cho diction ary ban đầu nữa,.
Thì bạn cứ thử đi
Đoạn:
If Dic Is Nothing Then Auto_Open
Hãy sửa thành
Auto_Open
rồi thí nghiệm lại sẽ biết liền chứ gì
Chấp luôn việc lúc nào cũng load Dictionary đấy, cùng lắm thêm 0.5 giây
Trước khi kết luận, tôi đã thí nghiệm không biết bao nhiêu lần rồi mới dám nói
Thật ra tôi nói nhanh gấp 100 lần so với VLOOKUP là đã hơi.. khiêm tốn rồi đấy
Nếu bạn có ý kiến phản bác gì khác, chúng ta cùng tiếp tục
Ẹc... Ẹc...
----------------------
Tôi đã viết là với hàm lập VBA so sánh cùng hàm chuẩn Vlookup trong excel thì sẽ chậm hơn là cái chắc chắn, NÊN tôi mới nói chủ topic xem lại tiêu đề cho hợp lý,
.
Bạn cứ hay lòng vòng không đi thằng vào vấn đề
Từ đầu topic này, có ai bảo sẽ VIẾT 1 HÀM ĐỂ THAY THẾ CHO VLOOKUP CỦA BÁC BILL đâu chứ... Cả tiêu đề cũng ghi rằng "Mã VBA để thay hàm VLOOKUP" ... Hiện tai người ta đang cần biện pháp dùng VBA để thay thế cho việc nhập VLOOKUP vào Excel
Thế thôi! Còn bạn lại thích chơi chữ
Vấn đề là người dùng áp dụng được và họ hài lòng là đủ
 
Lần chỉnh sửa cuối:
Thì bạn cứ thử đi
Đoạn:
If Dic Is Nothing Then Auto_Open
Hãy sửa thành
Auto_Open
rồi thí nghiệm lại sẽ biết liền chứ gì
Ẹc... Ẹc...

Oh, anh vẫn ngoan cố hiểu sai hướng (hay cố tình nhỉ), hihihiiiii
Ý của tôi ở đây là không phải bài cụ thể này (vì đó không phải là chuẩn).

Anh cứ viết 1 hàm bằng VBA đầy đủ chức năng như của VLookup rồi đem so sánh nhé, chứ nói đi nói lại, anh cũng mãi không hiểu, ĐIều gì đúng chúng ta phải công nhận là đúng thì phải đúng: VBA chỉ là công cụ trợ giúp thôi - cái nào có sẵn thì nên sử dụng vẫn hơn.


Đó là lý do tôi ý kiến về tiêu đề topic, song vẫn khuyên chủ topic theo hướng giải quyết đó -- (anh đọc lại bài tôi viết trả lời chủ topic là hiểu ngay)
Thanks
 
Oh, anh vẫn ngoan cố hiểu sai hướng (hay cố tình nhỉ), hihihiiiii
Ý của tôi ở đây là không phải bài cụ thể này (vì đó không phải là chuẩn).

Anh cứ viết 1 hàm bằng VBA đầy đủ chức năng như của VLookup rồi đem so sánh nhé, chứ nói đi nói lại, anh cũng mãi không hiểu, ĐIều gì đúng chúng ta phải công nhận là đúng thì phải đúng: VBA chỉ là công cụ trợ giúp thôi - cái nào có sẵn thì nên sử dụng vẫn hơn.


Đó là lý do tôi ý kiến về tiêu đề topic, song vẫn khuyên chủ topic theo hướng giải quyết đó -- (anh đọc lại bài tôi viết trả lời chủ topic là hiểu ngay)
Thanks
Có vẻ như tranh luận chẳng đi đến đâu (ông nói gà bà nói vịt)
Và ý kiến của bạn thật ra cũng chẳng liên quan gì đến chủ đề của topic
Mục đích của người ta là làm cách nào đó để khỏi phải gõ VLOOKUP trên bảng tính, vậy thôi! Chẳng ai có ý đồ xây dựng bất kỳ hàm nào thay thế hàm Excel cả (mà nếu có ý đó cũng e rằng không ai có khả năng)
Vậy đi nha! Nếu ai đó có ý kiến tôi ưu hóa những code trong topic này thì mời tiếp tục, còn không thì bàn ở chổ khác vậy!
 
Có vẻ như tranh luận chẳng đi đến đâu (ông nói gà bà nói vịt)
Và ý kiến của bạn thật ra cũng chẳng liên quan gì đến chủ đề của topic

Thế mới nói là anh hiểu sai, cứ lo nhanh chậm hơn làm gì

Có liên quan chủ topic, những người mới vào tưởng có gì ghê ghớm thay VLookup - dễ gây hiểu nhầm chứ,

tóm lại, chúc anh tiếp tục có bài nhiều để code hơn nữa, ...
 
Cho em hỏi mở rộng ra ngoài bài hiện tại của em một chút: trường hợp như sau:
  1. Nếu ở Sheet LLNV phần SỐ THẺ (hay còn gọi là mã số Nhân Viên) nằm ở cột F chẳng hạn, và ở các cột A, B, C, D, E vẫn có dữ liệu liên quan.
- Đặt ra trường hợp: trên Sheet ChiTiet nếu cần lookup những giá trị trên một trong các cột A, B, C, D, E của LLNV theo SỐ THẺ thì có thể Lookup được không bác? Nếu được thì code sẽ thay đổi như thế nào?
  1. Nếu cột cần lookup ở Sheet Chitiet nằm ở bên trái của cột SỐ THẺ thì cần thay đổi code thế nào cho phù hợp ạ?
Trong file đính kèm em có thay đổi thứ tự một số cột để phù hợp với nội dung em hỏi thêm. Sheet LLNV vẫn là DATA gốc.

Cám ơn Bác ndu96081631 cùng các AE GPE đã quan tâm, giúp đỡ và chia sẻ.

Mong bác cùng mọi người dành thêm chút thời gian cho phần em hỏi thêm.
Rảnh rỗi làm lại cho bạn theo sự bố trí của dữ liệu mới đây
Xem và kiểm tra lại nhé
 

File đính kèm

  • Thuc Hanh.2.rar
    19.5 KB · Đọc: 533
cám ơn bác ndu96081631, thiệt là hay.
Có lẽ khi nào em xây dựng xong mô hình quản lý công việc( các bảng biểu trong công việc của em phải làm) sẽ nhờ bác cùng các AE viết code xử lý dữ liệu giúp em để cho file chạy nhẹ và nhanh hơn, công việc được giải quyết nhanh hơn.
Hy vọng khi đó sẽ nhận được sự giúp đỡ của mọi người.

Em xin gửi lời cảm ơn tới bác ndu96081631 nói riêng và các AE GPE nói chung.
Chúc mọi người sức khỏe và diễn đàn ngày một lớn mạnh.
 
Đây là thiếu sót của tất cả các code từ đầu topic đến giờ
Dùng sự kiện Worksheet_Change phải biết rằng Target không phải luôn là 1 cell ---> Đôi khi ngươi ta copy/paste( hoặc quét chọn khối cell rồi Delete như bạn làm) thì sao?
Chính vì thế phải cho thêm công đoạn quét toàn bộ các cell thuộc Target (For Each Clls in Target chẳng hạn)
Nói chung dạng bài này cũng đã từng post trên diễn đàn rồi... nếu khéo léo, có thể dùng Array để tăng tốc bảng tính
Các bạn khác đang nghiên cứu về VBA code thừ cải tiến lại xem
(tôi làm hoài dạng này đâm chán luôn)
--------------------------------------

Đây chính là lúc dùng đến Dictionary nè!
Tuy nhiên, nếu khéo hơn thì ta chỉ tạo và nạp Dictionary 1 lần duy nhất (nếu Dictionary chưa được tạo) ---> Những lần sau đó của sự kiện Change, chỉ việc "vào" Dic "moi" ra xài thôi
Em cảm ơn bác ndu96081631 Quả thực em chẳng biết gì về VBA, em đã nghiên cứu bài viết của bác, đã ứng dụng vào bài của em nhưng không được. Rất mong bác bỏ chút thời gian giúp em bài toán này. Em gửi file đính kèm, bác giúp em nhé. Em cảm ơn bác nhiều.
 

File đính kèm

  • vlookup (2).xls
    42.5 KB · Đọc: 88
Em cảm ơn bác ndu96081631 Quả thực em chẳng biết gì về VBA, em đã nghiên cứu bài viết của bác, đã ứng dụng vào bài của em nhưng không được. Rất mong bác bỏ chút thời gian giúp em bài toán này. Em gửi file đính kèm, bác giúp em nhé. Em cảm ơn bác nhiều.
Sửa code bài 45 lại tí thôi mà (sửa tham chiếu cho phù hợp dữ liệu của bạn)
Xem file
 

File đính kèm

  • vlookup (2).xls
    39 KB · Đọc: 401
Sửa code bài 45 lại tí thôi mà (sửa tham chiếu cho phù hợp dữ liệu của bạn)
Xem file
Em cảm ơn bác, vậy mà em mò mẫm mãi không được. Có một vấn đề nữa nhờ bác chỉ giúp. Giả sử file trên có nhiều sheet CT, CT1, CT2,....CTn. Sửa code trong sheet 'MA' như thế nào để khi thay đổi giá trị trong sheet 'MA' thì các giá trị tương ứng trong Sheet CT, CT1, CT2,...,CTn cũng thay đôi theo. Thank bác nhiều.
 
Em cảm ơn bác, vậy mà em mò mẫm mãi không được. Có một vấn đề nữa nhờ bác chỉ giúp. Giả sử file trên có nhiều sheet CT, CT1, CT2,....CTn. Sửa code trong sheet 'MA' như thế nào để khi thay đổi giá trị trong sheet 'MA' thì các giá trị tương ứng trong Sheet CT, CT1, CT2,...,CTn cũng thay đôi theo. Thank bác nhiều.
Để 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é
 
Ái chà... File của bạn rối như tơ vò... nhìn vào tôi chẳng biết phải dùng sự kiện Change như thế nào, tại các cell nào nữa đây
Hì, cảm ơn bác. Vậy bác xử lý cái cũ giúp em vậy nhé.
làm thế nào khi thay đổi giá trị ở shet 'MA' Thì giá trị ở các sheet khác cũng thay đổi?
 

File đính kèm

  • vlookup (2).xls
    55.5 KB · Đọc: 113
em rất cảm ơn sự chân thành của các bạn trên GPE
 
Lần chỉnh sửa cuối:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B4:B99")) Is Nothing Then
    Dim Rng As Range, sRng As Range, Sh As Worksheet
    
    Set Sh = ThisWorkbook.Worksheets("MA")
    Set Rng = Sh.Range(Sh.[b2], Sh.[b2].End(xlDown))
    Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Nothing"
    Else
        Target.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
    End If
 End If
End Sub
Chào các bạn
Vẫn File ở bài 1 và code trên
Bây giờ mình kg muốn sử dụng sự kiện Sub Worksheet_Change mà muốn sửa code để ở module, để khi muốn chạy code thì chọn nó để run, mong các bạn chỉ giúp
Cảm ơn cả nhà
 
[Thongbao]Vẫn File ở bài 1 và code trên
Bây giờ mình kg muốn sử dụng sự kiện Sub Worksheet_Change mà muốn sửa code để ở module, để khi muốn chạy code thì chọn nó để run, mong các bạn chỉ giúp; Cảm ơn cả nhà[/Thongbao]

Bạn kích hoạt ô chứa mã NV & chạy cái ni:

PHP:
Option Explicit
Sub GPE()
    Dim Rng As Range, sRng As Range, Sh As Worksheet
    
    Set Sh = ThisWorkbook.Worksheets("MA")
    Set Rng = Sh.Range(Sh.[b2], Sh.[b2].End(xlDown))
    Set sRng = Rng.Find(Selection.Value, , xlFormulas, xlWhole)  '<=|'
    If sRng Is Nothing Then
        Target.Offset(, 1).Value = "Nothing"
    Else
        Target.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
    End If
End Sub
 
[Thongbao]Vẫn File ở bài 1 và code trên
Bây giờ mình kg muốn sử dụng sự kiện Sub Worksheet_Change mà muốn sửa code để ở module, để khi muốn chạy code thì chọn nó để run, mong các bạn chỉ giúp; Cảm ơn cả nhà[/Thongbao]

Bạn kích hoạt ô chứa mã NV & chạy cái ni:

PHP:
Option Explicit
Sub GPE()
    Dim Rng As Range, sRng As Range, Sh As Worksheet
    
    Set Sh = ThisWorkbook.Worksheets("MA")
    Set Rng = Sh.Range(Sh.[b2], Sh.[b2].End(xlDown))
    Set sRng = Rng.Find(Selection.Value, , xlFormulas, xlWhole)  '<=|'
    If sRng Is Nothing Then
        Target.Offset(, 1).Value = "Nothing"
    Else
        Target.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
    End If
End Sub
Em đã chép code trên vào module, nhập thử số liệu vào cột Mã của trang "Chitiet", nhấn Alt+F8 để run GEP thì bị báo lỗi chỗ Target
Anh xem lại giúp!Tks
 
Chào các bạn
Vẫn File ở bài 1 và code trên
Bây giờ mình kg muốn sử dụng sự kiện Sub Worksheet_Change mà muốn sửa code để ở module, để khi muốn chạy code thì chọn nó để run, mong các bạn chỉ giúp
Cảm ơn cả nhà

Thì bạn xóa code sự kiện Change ở Sheet CT đi, xong viết thêm 1 code ngắn thế này:
Mã:
Sub Main()
  Update Sheets("CT").Range("B4:B1000")
End Sub
Lưu ý:
- Nếu bạn đang Test code trực tiếp thì phải Alt + F8, chạy Sub Auto_Open trước, xong mới chạy Sub Main nhé
- Chỉ cần chạy Auto_Open 1 lần là đủ
- Nếu đã Save và Close file rồi, lần sau mở file lên, không cần phải chạy Auto_Open
 
xin được xía vdzô chút nha,
bạn thử thay target bằng activecell xem
vì thông thường tôi thấy người ta hay sử dụng target ở trong mấy cái event vì nó đã được khai báo rồi, còn trong module thì chưa khai báo,
 
chào cả nhà, e mới bắt đầu tập toẹ dùng vba nên muốn hỏi một chút ạ, giống như ở bài 1 của bác hoangvinh_tb nhưng giả sử như trong file đó ở sheet "MA" có cột ma&ten giống nhau còn địa chỉ thì khác nhau(tức là có nhiều địa chỉ với cùng một mã và tên) giờ ở sheet"CT" em muốn gõ mã thì nó sẽ hiển thị ra được tên và địa chỉ(toàn bộ địa chỉ của mã đó) thì phải làm thế nào ạ? e cảm ơn các bác nhiều. do mới chập chững bước vào nên có gì mong được các bác chỉ giáo hộ, đừng ném gạch e ạ.
 
Web KT
Back
Top Bottom