Trang 2/13 đầuđầu 1 2 3 4 5 6 12 ... cuốicuối
Hiển thị kết quả tìm kiếm từ 11 đến 20 trên tổng số: 126

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

  1. Trích Nguyên văn bởi khongphai02 View Post
    Chào bác concogia và các cao thủ.
    EM đang cần làm 1 cái phiếu xuất kho cũng thay thế hàm vlookup bằng mã VBA, copy mã của bác concogia về chạy thử thì rất ok. Chỉ có điều em muốn link thêm giá trị từ Sheet 'MA' sang sheet 'CT', mà ko biết sửa thế nào nhờ bác concogia và các cao thủ sử giúp. Em xin cảm ơn các bác.
    Bạn chép code này đè lên cái cũ nhé
    Code:
    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

  2. Trích Nguyên văn bởi khongphai02 View Post
    Chào bác concogia và các cao thủ.
    EM đang cần làm 1 cái phiếu xuất kho cũng thay thế hàm vlookup bằng mã VBA, copy mã của bác concogia về chạy thử thì rất ok. Chỉ có điều em muốn link thêm giá trị từ Sheet 'MA' sang sheet 'CT', mà ko biết sửa thế nào nhờ bác concogia và các cao thủ sử giúp. Em xin cảm ơn các bác.
    m mò ra rồi, Cảm ơn các bác nhiều...
    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
    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 If
    End Sub
    Các bác chỉ giúp em với xem có sai ko/ thanks

  3. #13
    Trích Nguyên văn bởi concogia View Post
    Bạn chép code này đè lên cái cũ nhé
    Code:
    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
    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

    Code:
    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.

  4. Trích Nguyên văn bởi siwtom View Post
    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

    Code:
    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ặc dừ tôi chưa biết sử dụng các code lệnh xong tôi xin có vài ý kiến để các bác xem xét:
    tôi thấy code của siwtom và code của concogia đều ngắn gọn và đã đáp ứng được việc hiển thị thông tin trong các cột Sản phẩm, đơn vị, đơn giá khi nhập mã vào cột MA ở Sheet CT.
    Xong khi ta xóa các mã ở một dòng bất kỳ thì trên cột MA thì những thông tin ở các cột bên vẫn còn nguyên không bị mất.
    Các Pro có thể bổ sung thêm để đáp ứng yêu cầu khi xóa trên cột MA thì các thông tin về tên sản phẩm, đơn vị, đơn giá cùng biến mất.

    Các Pro thông thạo về VBA bớt chút thời gian giúp em Topic Trợ giúp CODE VBA để thay thế cho hàm Vlookup
    thay đổi nội dung bởi: tiendo1988, 14-04-12 lúc 06:04 AM

  5. Trích Nguyên văn bởi tiendo1988 View Post
    ....
    Xong khi ta xóa các mã ở một dòng bất kỳ thì trên cột MA thì những thông tin ở các cột bên vẫn còn nguyên không bị mất.
    Các Pro có thể bổ sung thêm để đáp ứng yêu cầu khi xóa trên cột MA thì các thông tin về tên sản phẩm, đơn vị, đơn giá cùng biến mất.
    Bạn có thể thêm đoạn code màu đỏ này vào code của bạn Concogia, cách làm tương tự nếu bạn muốn xóa thêm phần nào đó cho mã đó.
    ....
    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)
    ElseIf IsEmpty(Target) Then
    Target.Offset(, 1) = ""
    Target.Offset(, 2) = ""

    End If
    ...

  6. Em đã thử thêm Code của Ban qtm1987 vào đoạn code của concogia theo hướng dẫn. Kết quả rất tốt.
    Em mới tiếp cận đến code nên chưa hiểu gì nhiều về các code sử dụng.
    Làm phiền các bác giải thích giúp em ý nghĩa của những code mà anh qtm1987 concogia đã sử dụng để em hiểu hơn về code và có thể tùy biến vào bài của mình.
    Xin cảm ơn!

  7. Trích Nguyên văn bởi concogia View Post
    Bạn chép code này đè lên cái cũ nhé
    Code:
    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
    Chào bác 'concogia', em đã làm theo cách của bác, file excel của em chạy rất ổn, dung lượng file giảm từ 150MB xuống còn 24MB, quá tuyệt luôn. File nhanh, tuy nhiên em gặp một số vấn đề cần bác phát triển thêm giúp em.
    - Thứ nhất: Khi xóa mã ở Shet ‘CT’ thì các giá trị ‘Tên sp’; ‘ĐVT’, ‘Đơn giá’ vẫn giữ nguyên. (như bác ‘tiendo1988’ đã thắc mắc – bác ‘qtm1987’ đã bổ sung)
    - Thứ hai: Làm thế nào để khi thay đổi giá trị đơn giá ở Sheet ‘MA’ thì bên sheet CT sẽ tự động cập nhập đơn giá mới?
    Mong bác 'concogia', bác ‘qtm1987’ và các bác cao thủ giải quyết vấn đề này giúp em với.
    Thank các bác nhiều!
    thay đổi nội dung bởi: khongphai02, 14-04-12 lúc 10:39 AM

  8. Trích Nguyên văn bởi qtm1987 View Post
    Bạn có thể thêm đoạn code màu đỏ này vào code của bạn Concogia, cách làm tương tự nếu bạn muốn xóa thêm phần nào đó cho mã đó.
    ....
    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)
    ElseIf IsEmpty(Target) Then
    Target.Offset(, 1) = ""
    Target.Offset(, 2) = ""

    End If
    ...
    Em đã thử cách của bác nhưng khi thao tác xóa từng ô thì các giá trị ở cột sản phẩm, đơn vị, đơn giá cũng mất. nhưng nếu quét nhiều ô để xóa thì các giá trị khác vẫn giữ nguyên. làm thế nào để khi quét nhiều ô để xóa thì các giá trị khác cũng bị xóa hả bác 'qtm1987'

  9. Trích Nguyên văn bởi khongphai02 View Post
    Em đã thử cách của bác nhưng khi thao tác xóa từng ô thì các giá trị ở cột sản phẩm, đơn vị, đơn giá cũng mất. nhưng nếu quét nhiều ô để xóa thì các giá trị khác vẫn giữ nguyên. làm thế nào để khi quét nhiều ô để xóa thì các giá trị khác cũng bị xóa hả bác 'qtm1987'
    Đâ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)
    --------------------------------------
    Trích Nguyên văn bởi siwtom View Post
    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
    .
    Đâ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
    thay đổi nội dung bởi: ndu96081631, 14-04-12 lúc 11:15 AM

  10. Trích Nguyên văn bởi ndu96081631 View Post
    Đâ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
    BÁc ndu96081631 Hướng dẫn cụ thể cách thêm For Each Clls in Target như thế nào?
    “...có thể dùng Array để tăng tốc bảng tính” : bác gúp em và mọi người đoạn code để học hỏi thêm.
    Nhờ bác cùng các Pro tùy biến giúp bài của em bên Topic Cần hướng dẫn và trợ giúp về sử dụng Vlookup trong VBA excel!

    Xin cảm ơn!

Trang 2/13 đầuđầu 1 2 3 4 5 6 12 ... cuốicuối

Thông tin về chủ đề này

Users Browsing this Thread

Hiện có 1 người đang xem đề tài này. (0 thành viên và 1 khách)

Bookmarks

Bookmarks

Quyền Sử Dụng Ở Diễn Ðàn

  • Bạn không thể đăng đề tài mới
  • Bạn không thể đăng trả lời
  • Bạn không thể đăng file đính kèm.
  • Bạn không thể sửa bài viết.
  •