Dò tìm dữ liệu bằng Code VBA thay cho Vlookup

Trạng thái
Không mở trả lời sau này.

hocmoi

Yêu THVBA
Xin chào các thành viên diễn đàn.
Hôm nay mình xin quay lại diễn đàn lần nữa, nhờ các thành viên có code vba hay giúp dùm.
- Mình có 2 file " KH", " "DL", đường Link bên dưới. Mình muốn lấy data từ File " DL" gán vô File "KH" theo điều kiện giống như là mình dùng công thức hàm dò tìm Vloookup, do nếu làm nhiều dòng bằng Vlookup thì máy chạy nặng quá.
- Mình có trình bày theo hình minh họa, không biết là vậy được chưa, nhờ các thành viên xem dùm.


Xin cám ơn diễn đàn.
 
D

Deleted member 208

Guest
Mình khái quát lại yêu cầu nhé:
File input: DL
File output: KH

Cả hai file trên đều có tên sheet giống nhau.
Yêu cầu lấy dữ liệu của sheet T4 (tương tự với các sheet khác) file DL điền vào sheet T4 của file KH.
Bạn cần đăng nhập để thấy hình ảnh


Cấu trúc file DL: Dữ liệu luôn luôn bắt đầu từ dòng 6.
Tên mặt hàng (BB,C,...) luôn ghi trên cột A, từ khóa này không bao giờ trùng nhau.
Ví dụ không có chuyện dòng 8 là BB mà dòng 10 lại cũng là BB.
Bạn cần đăng nhập để thấy hình ảnh


Cấu trúc file KH: Dòng tiêu đề luôn luôn là dòng 13. Cột ghi từ khóa BB,C,... luôn được ghi ở cột Q
Bạn cần đăng nhập để thấy hình ảnh


Bạn xác nhận xem mình hiểu đúng hay không nhé. Nếu đúng, và không có ai giúp, thì tối mai mình code cho.
 

hocmoi

Yêu THVBA
Mình khái quát lại yêu cầu nhé:
File input: DL
File output: KH

Cả hai file trên đều có tên sheet giống nhau.
Yêu cầu lấy dữ liệu của sheet T4 (tương tự với các sheet khác) file DL điền vào sheet T4 của file KH.
Bạn cần đăng nhập để thấy hình ảnh


Cấu trúc file DL: Dữ liệu luôn luôn bắt đầu từ dòng 6.
Tên mặt hàng (BB,C,...) luôn ghi trên cột A, từ khóa này không bao giờ trùng nhau.
Ví dụ không có chuyện dòng 8 là BB mà dòng 10 lại cũng là BB.
Bạn cần đăng nhập để thấy hình ảnh


Cấu trúc file KH: Dòng tiêu đề luôn luôn là dòng 13. Cột ghi từ khóa BB,C,... luôn được ghi ở cột Q
Bạn cần đăng nhập để thấy hình ảnh


Bạn xác nhận xem mình hiểu đúng hay không nhé. Nếu đúng, và không có ai giúp, thì tối mai mình code cho.
Chào bạn, đúng rồi đó bạn.
Cám ơn bạn giúp.
 
B

bvtvba

Guest
Phải xử lý 2 file là làm Tool rồi. Thời gian đầu tư công sức sẽ rất nhiều.
Tôi code sơ sơ đã mất 3h.
Bạn tạo file có sheet name là: tuhocvba.
Giao diện như sau:
Bạn cần đăng nhập để thấy hình ảnh


Code cho các nút bấm như sau:
Mã:
Private Sub SelectFileDL_Click()
    Dim lk As String
    lk = selectfile("Chon File DL")
    If UCase(lk) <> "FALSE" Then
        ThisWorkbook.Sheets("tuhocvba").Cells(2, 2) = lk
    Else
        ThisWorkbook.Sheets("tuhocvba").Cells(2, 2) = ""
    End If
   
End Sub
Private Sub SelectFileKH_Click()
    Dim lk As String
    lk = selectfile("Chon File KH")
    If UCase(lk) <> "FALSE" Then
        ThisWorkbook.Sheets("tuhocvba").Cells(3, 2) = lk
    Else
        ThisWorkbook.Sheets("tuhocvba").Cells(3, 2) = ""
    End If
   
End Sub
Private Sub CommandButton1_Click()
    Call main
End Sub
Tạo Module1, code trên Module như sau:
Mã:
Option Explicit
Sub main()
    Dim i   As Long, i1 As Long, rend  As Long
    Dim c   As Integer, cend As Integer
    Dim shn As String, lk  As String, wbdl As String, wbkh As String, skey As String
    Dim arr
    Dim myDic As Object
    'File DL
    Const r1    As Long = 6    'Dong tieu de: 1,2,3,4,...
    Const c1    As Integer = 1 'Cot A: BB,C,DD,E1,C1
    'File KH
    Const cQ    As Integer = 17 'Cot Q
    Const r2    As Long = 13 'Dong tieu de: 1,2,3,...
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Lam viec voi file DL
    lk = ThisWorkbook.Sheets("tuhocvba").Cells(2, 2)
    Workbooks.Open lk
    wbdl = ActiveWorkbook.Name
    
    For i = 1 To Workbooks(wbdl).Sheets.Count Step 1
        Workbooks(wbdl).Sheets(i).Activate
        shn = Workbooks(wbdl).Sheets(i).Name
        'Don cuoi cung tren cot A- File DL
        rend = Workbooks(wbdl).Sheets(i).Cells(Rows.Count, c1).End(xlUp).Row
        cend = Workbooks(wbdl).Sheets(i).Cells(r1, Columns.Count).End(xlToLeft).Column
        
        If ((rend > r1) And (cend > c1)) Then
            arr = Workbooks(wbdl).Sheets(i).Range(Cells(r1, c1), Cells(rend, cend)).Value
            'Chay tu dong dau + 1 toi dong cuoi, chay tu cot dau + 1 toi cot cuoi
            For i1 = LBound(arr, 1) + 1 To UBound(arr, 1) Step 1
                If CStr(arr(i1, 1)) <> "" Then 'BB, C,DD,E1
                    For c = LBound(arr, 2) + 1 To UBound(arr, 2) Step 1
                        If CStr(arr(i1, c)) <> "" Then
                            'Nap du lieu vao Dic: skey = tensheet_tuhocvba_BB_congdongvbavn_1
                            skey = shn & "_tuhocvba_" & CStr(arr(i1, 1)) & "_congdongvbavn_" & CStr(arr(1, c))
                            If Not myDic.Exists(skey) Then myDic.Add skey, arr(i1, c)
                        End If
                    Next c
                End If
            Next i1
        End If
    Next i
    Workbooks(wbdl).Close
    
    'Lam viec voi file KH
    lk = ThisWorkbook.Sheets("tuhocvba").Cells(3, 2)
    Workbooks.Open lk
    wbkh = ActiveWorkbook.Name
    'Ghi du lieu vao file KH
     For i = 1 To Workbooks(wbkh).Sheets.Count Step 1
         Workbooks(wbkh).Sheets(i).Activate
         shn = Workbooks(wbkh).Sheets(i).Name
         'Don cuoi cung tren cot Q- File KH
        rend = Workbooks(wbkh).Sheets(i).Cells(Rows.Count, cQ).End(xlUp).Row
        cend = Workbooks(wbkh).Sheets(i).Cells(r2, Columns.Count).End(xlToLeft).Column
        If ((rend > r2) And (cend > cQ)) Then
            With Workbooks(wbkh).Sheets(i)
                For i1 = r2 + 1 To rend Step 1
                    If .Cells(i1, cQ) <> "" Then
                        For c = cQ + 1 To cend Step 1
                            skey = shn & "_tuhocvba_" & .Cells(i1, cQ) & "_congdongvbavn_" & .Cells(r2, c)
                            If myDic.Exists(skey) Then .Cells(i1, c) = myDic.Item(skey)
                        Next c
                    End If
                Next i1
            End With
        End If
     Next i
    MsgBox "Hoan thanh"
    Workbooks(wbkh).Save
    Workbooks(wbkh).Activate
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Function selectfile(ByVal sTitle As String) As String
    Dim strFilePath As String
    selectfile = Application.GetOpenFilename(Filefilter:="ExcelFile,*.xls?", Title:=sTitle)
End Function
 
Sửa lần cuối bởi điều hành viên:
D

Deleted member 208

Guest
Đang định comment thì thấy bạn sửa code rồi.
Sai:
Mã:
arr = Workbooks(wbdl).Sheets(i).Range(Cells(1, 1), Cells(2, 2)).Value
Đúng:
Mã:
arr = Workbooks(wbdl).Sheets(i).Range(Cells(r1, c1), Cells(rend, cend)).Value
Mình chạy đúng rồi, bạn @hocmoi tự làm file và dán code vào chạy xem sao, rồi báo lại kết quả cho tác giả code nhé.
 
T

thanhphong

Guest
VLOOKUP thì tôi thấy có chủ đề này:
Nhưng topic của bạn @hocmoi thì sẽ phức tạp hơn do dữ liệu có 2 file. Xử lý trên cùng một file thì thuận lợi hơn nhiều. Tuy nhiên ưu điểm là tên sheet của 2 file giống nhau, nên cũng thuận lợi cho người code.
Nhờ đó mà bvtvba đã rất khéo léo khi xây dựng keyword kết hợp tên sheet vào. Tôi đọc đâu đó, hình như bạn @Nguyen Kha Nam quan tâm tới việc sử dụng Dictionary trong code. Nếu vậy, thì topic này rất cơ bản và đáng học hỏi đấy ạ.
 

hocmoi

Yêu THVBA
File Tool mình upload ở đây nhé:
Có vấn đề gì thì bạn @hocmoi báo lại nhé.
Chào bạn bvtvba, mình đang Test lên File chính thức của mình, mình không ngờ Topic này nghĩ đơn giản nhưng thật ra thấy khó quá, mình test nãy giờ mà chạy chưa xong hay là đơ luôn hay ấy, thấy quay vòng vòng....., để mình kiểm tra có gì phản hồi lại nhé. File mình dài tầm 3000 dòng khoảng gần 200 SP, và một mớ công thức râu ria, hichic 30 phút rồi sao chưa xong nữa bạn ơi.
Có gì mình báo nhé.
Cám ơn bạn cho Code trước.
 
B

bvtvba

Guest
Anh/Chị ạ. Em đã dùng tới mảng, tới Dictionary rồi. Nếu mà chậm thì cũng không biết sao nữa. Anh/Chị cho file demo thì em chạy cái roẹt là xong.
File thực tế của anh/chị như thế nào thì chỉ có mỗi anh/chị biết, vậy anh/chị tiếp tục test nhé. Có gì báo lại em ạ.
 

hocmoi

Yêu THVBA
@hocmoi bạn thử tool này xem sao, tôi tăng cường tốc độ vào file của thanhphong & bvtvba:
Ver 2.1:
Cám ơn các bạn hỗ trợ, mình đã Test xong với Tool của bạn bvtvba, hichic giờ mới chạy xong, nhưng có những điểm này mình xin nói các bạn xem thử phải không?
-Là khi muốn lấy File Output ( KH) thì mỗi lần cần là phải mở Tool lên, chọn lại File và Run --> sẽ chạy ra 1 File Excel mới , đúng không? ==> Ý mình là do luôn mở và làm việc trực tiếp trên File KH nên mong muốn là khi cần nạp data mới vào là chỉ cần chạy lệnh Run là (tự chọn mở File DL ra hoặc nếu File DL đang mở thì cho phép chọn luôn) và update lại data mới ( giống như gắn Module cho file KH luôn, để khi cần là chạy), và sẽ không phải chạy ra 1 file Excel khác.
- Workbook phải luôn luôn là tên KH va DL phải không? Nếu đổi tên cho đúng tên file mình đang sử dụng thì chỗ nào Code có tên "wbdl", "wbkh" mình sửa lại là được phải không?
-Có thể File do có nhiều vùng có công thức nên xử lý lâu không các bạn? Mình test file Demo thì đúng là nhanh tic tắc, có gì mai mình chụp hình lại File gốc gửi các bạn xem thử nhé.
Cám ơn tất cả các bạn. Chúc các bạn buổi tối vui vẻ.
 
D

Deleted member 208

Guest
-Là khi muốn lấy File Output ( KH) thì mỗi lần cần là phải mở Tool lên, chọn lại File và Run --> sẽ chạy ra 1 File Excel mới , đúng không? ==> Ý mình
Không chạy ra file excel mới.
Bạn select chọn file DL.
Bạn select chọn file KH.
Rồi ấn nút RUN. Nó sẽ update dữ liệu vào file KH.
- Workbook phải luôn luôn là tên KH va DL phải không?
Không. Workbook tên là gì cũng được.
Thao tác của người dùng là:
Bạn cần đăng nhập để thấy hình ảnh

Lưu ý: File KH, DL nên close trước khi chạy chương trình.

Nếu đổi tên cho đúng tên file mình đang sử dụng thì chỗ nào Code có tên "wbdl", "wbkh" mình sửa lại là được phải không?
Bạn không sửa code. Như ở trên đã nói, file có tên tùy ý vẫn được.
 

hocmoi

Yêu THVBA
Phải xử lý 2 file là làm Tool rồi. Thời gian đầu tư công sức sẽ rất nhiều.
Tôi code sơ sơ đã mất 3h.
Bạn tạo file có sheet name là: tuhocvba.
Giao diện như sau:
Bạn cần đăng nhập để thấy hình ảnh


Code cho các nút bấm như sau:
Mã:
Private Sub SelectFileDL_Click()
    Dim lk As String
    lk = selectfile("Chon File DL")
    If UCase(lk) <> "FALSE" Then
        ThisWorkbook.Sheets("tuhocvba").Cells(2, 2) = lk
    Else
        ThisWorkbook.Sheets("tuhocvba").Cells(2, 2) = ""
    End If
  
End Sub
Private Sub SelectFileKH_Click()
    Dim lk As String
    lk = selectfile("Chon File KH")
    If UCase(lk) <> "FALSE" Then
        ThisWorkbook.Sheets("tuhocvba").Cells(3, 2) = lk
    Else
        ThisWorkbook.Sheets("tuhocvba").Cells(3, 2) = ""
    End If
  
End Sub
Private Sub CommandButton1_Click()
    Call main
End Sub
Tạo Module1, code trên Module như sau:
Mã:
Option Explicit
Sub main()
    Dim i   As Long, i1 As Long, rend  As Long
    Dim c   As Integer, cend As Integer
    Dim shn As String, lk  As String, wbdl As String, wbkh As String, skey As String
    Dim arr
    Dim myDic As Object
    'File DL
    Const r1    As Long = 6    'Dong tieu de: 1,2,3,4,...
    Const c1    As Integer = 1 'Cot A: BB,C,DD,E1,C1
    'File KH
    Const cQ    As Integer = 17 'Cot Q
    Const r2    As Long = 13 'Dong tieu de: 1,2,3,...
   
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
   
    Set myDic = CreateObject("Scripting.Dictionary")
   
    'Lam viec voi file DL
    lk = ThisWorkbook.Sheets("tuhocvba").Cells(2, 2)
    Workbooks.Open lk
    wbdl = ActiveWorkbook.Name
   
    For i = 1 To Workbooks(wbdl).Sheets.Count Step 1
        Workbooks(wbdl).Sheets(i).Activate
        shn = Workbooks(wbdl).Sheets(i).Name
        'Don cuoi cung tren cot A- File DL
        rend = Workbooks(wbdl).Sheets(i).Cells(Rows.Count, c1).End(xlUp).Row
        cend = Workbooks(wbdl).Sheets(i).Cells(r1, Columns.Count).End(xlToLeft).Column
       
        If ((rend > r1) And (cend > c1)) Then
            arr = Workbooks(wbdl).Sheets(i).Range(Cells(r1, c1), Cells(rend, cend)).Value
            'Chay tu dong dau + 1 toi dong cuoi, chay tu cot dau + 1 toi cot cuoi
            For i1 = LBound(arr, 1) + 1 To UBound(arr, 1) Step 1
                If CStr(arr(i1, 1)) <> "" Then 'BB, C,DD,E1
                    For c = LBound(arr, 2) + 1 To UBound(arr, 2) Step 1
                        If CStr(arr(i1, c)) <> "" Then
                            'Nap du lieu vao Dic: skey = tensheet_tuhocvba_BB_congdongvbavn_1
                            skey = shn & "_tuhocvba_" & CStr(arr(i1, 1)) & "_congdongvbavn_" & CStr(arr(1, c))
                            If Not myDic.Exists(skey) Then myDic.Add skey, arr(i1, c)
                        End If
                    Next c
                End If
            Next i1
        End If
    Next i
    Workbooks(wbdl).Close
   
    'Lam viec voi file KH
    lk = ThisWorkbook.Sheets("tuhocvba").Cells(3, 2)
    Workbooks.Open lk
    wbkh = ActiveWorkbook.Name
    'Ghi du lieu vao file KH
     For i = 1 To Workbooks(wbkh).Sheets.Count Step 1
         Workbooks(wbkh).Sheets(i).Activate
         shn = Workbooks(wbkh).Sheets(i).Name
         'Don cuoi cung tren cot Q- File KH
        rend = Workbooks(wbkh).Sheets(i).Cells(Rows.Count, cQ).End(xlUp).Row
        cend = Workbooks(wbkh).Sheets(i).Cells(r2, Columns.Count).End(xlToLeft).Column
        If ((rend > r2) And (cend > cQ)) Then
            With Workbooks(wbkh).Sheets(i)
                For i1 = r2 + 1 To rend Step 1
                    If .Cells(i1, cQ) <> "" Then
                        For c = cQ + 1 To cend Step 1
                            skey = shn & "_tuhocvba_" & .Cells(i1, cQ) & "_congdongvbavn_" & .Cells(r2, c)
                            If myDic.Exists(skey) Then .Cells(i1, c) = myDic.Item(skey)
                        Next c
                    End If
                Next i1
            End With
        End If
     Next i
    MsgBox "Hoan thanh"
    Workbooks(wbkh).Save
    Workbooks(wbkh).Activate
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Function selectfile(ByVal sTitle As String) As String
    Dim strFilePath As String
    selectfile = Application.GetOpenFilename(Filefilter:="ExcelFile,*.xls?", Title:=sTitle)
End Function
Xin chào bạn bvtvba, thật cám ơn code của bạn, nhưng mình Test lại thì thấy có những điểm này, mình nhờ bạn khắc phục được không?


Xin cám ơn bạn.
 

hocmoi

Yêu THVBA
Không chạy ra file excel mới.
Bạn select chọn file DL.
Bạn select chọn file KH.
Rồi ấn nút RUN. Nó sẽ update dữ liệu vào file KH.

Không. Workbook tên là gì cũng được.
Thao tác của người dùng là:
Bạn cần đăng nhập để thấy hình ảnh

Lưu ý: File KH, DL nên close trước khi chạy chương trình.


Bạn không sửa code. Như ở trên đã nói, file có tên tùy ý vẫn được.
Chào bạn sieutocviet3, cám ơn bạn nhiệt tình hỗ trợ. Mình cũng có Test Tool bạn gửi, nhưng khi chèn thêm SP vào bên sheet KH thì chạy bị lỗi như hình, bạn xem giúp nhé.
Cám ơn.
 
D

Deleted member 208

Guest
1. Bạn gửi mình data input mà bạn chạy bị lỗi, để mình chạy thử xem lỗi như thế nào nhé.
2. các vấn đề của bạn, mình tổng hợp lại ở đây:
Hình như bạn chưa biết cách upload ảnh lên diễn đàn.
Nếu bạn không biết cách upload ảnh lên diễn đàn, bạn vui lòng tham khảo topic sau: .
Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh
 
T

thanhphong

Guest
Link download ver 2.2:
Code của sieutocviet3 sai chỗ này:
Mã:
For c = LBound(arr, 2) + 1 To UBound(arr, 1) Step 1
Đúng là:
Mã:
For c = LBound(arr, 2) + 1 To UBound(arr, 2) Step 1
Dựa trên yêu cầu của bạn @hocmoi tôi update lại code cho bạn dựa vào file của sieutocviet3 :
Bạn chạy thử xem sao nhé:
Mã:
If myDic.Exists(skey) Then
      .Cells(i1 + r2 - 1, c + cQ - 1) = myDic.Item(skey)
   Else
      .Cells(i1 + r2 - 1, c + cQ - 1) = "" 'Update: Khong tim thay san pham thi xoa du lieu cu
End If
 

Euler

Administrator
Thành viên BQT
Bạn @hocmoi thân mến, bạn có 7 ngày để phản hồi đã đáp ứng yêu cầu của bạn hay chưa?
Cảm ơn các bạn thanhphong, sieutocviet3, bvtvba đã hỗ trợ topic này.
 

hocmoi

Yêu THVBA
Bạn @hocmoi thân mến, bạn có 7 ngày để phản hồi đã đáp ứng yêu cầu của bạn hay chưa?
Cảm ơn các bạn thanhphong, sieutocviet3, bvtvba đã hỗ trợ topic này.
Xin chào các bạn đã hỗ trợ mình Topic này. Mình xin cám ơn. Admin đóng dùm topic này được rồi. (y)
 
Trạng thái
Không mở trả lời sau này.
Top