Xin chỉ cách dùng drop down list lấy dữ liệu từ sheet khác

Liên hệ QC

phuonganhdp

Thành viên mới
Tham gia
28/11/09
Bài viết
6
Được thích
0
Trước hết em xin phép mở topic này để nhờ chỉ giúp vấn đề này vì em gg mãi mà chưa tìm được giải pháp, nay đanh mở topic này xin phiền các bác ít phút ạ. Nếu đã có topic nào giống như này mà em chưa tìm ra mong các bác cho em cái link học tập.
Vấn đề của em là như này ạ

em có sheet1 như sau:(đây là sheet dữ liệu gốc)

ScreenHunter_062.jpg

Và em phải làm sheet2 như sau
ScreenHunter_063.jpg
ở ô khoanh đỏ là em phải làm 1 cái drop down list, cái này khi sổ ra sẽ lấy giá trị Mã KH của sheet1

và ví dụ, khi em chọn mã KH là ctA thì toàn bộ dữ liệu của ctA sẽ được fill xuống dưới
ScreenHunter_066.jpg

Hiện em chưa tìm được cách làm, đa tìm trên gg nhưng tìm không ra cách lấy Mã KH từ sheet1
và cách khi em chọn Mã KH là ctA thì em chưa lấy dữ liệu của ctA từ sheet1 sang

Rất mong các anh/chị hỗ trợ em, Em xin cảm ơn rất nhiều ạ :)
 

File đính kèm

  • Book1.xlsx
    9.5 KB · Đọc: 42
Dùng Drop down list

Mình làm như vậy ko biết có đúng ý bạn ko??, bạn xem thử file
 

File đính kèm

  • Book1.xlsx
    43.1 KB · Đọc: 76
Vậy như thế này có được không ạ?
 

File đính kèm

  • Book1 (1).xls
    39.5 KB · Đọc: 87
Vậy như thế này có được không ạ?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim rng As Range
Dim rw, col As Integer
i = 5

Set Target = Application.Intersect(Target, [c2])
Set rng = Sheet1.Range(Sheet1.[b3], Sheet1.[b65500].End(xlUp))

If Not Target Is Nothing Then
    For Each rng In rng
        If UCase(rng) = UCase(Target) Then
        rw = rng.Row
        col = rng.Column
        Cells(i, 2) = Target
        Cells(i, 3) = Sheet1.Cells(rw, col + 1)
        Cells(i, 4) = Sheet1.Cells(rw, col + 2)
        i = i + 1
    End If
Next
End If
End Sub

1. Code của bạn chạy đúng, nhưng có 2 vấn đề không nên làm:
- Không nên đặt biến trùng tên : For Each rng in rng, vì sẽ gây đảo lộn logic hoạt động của code, thậm chí chính bạn cũng sẽ không nhớ rng nào là con rng nào.
- Không nên thay đổi biến Target: Set Target = Intersect(Target, [C2]), vì sẽ có lúc bạn cần dùng đế giá trị ban đầu của Target.

2. Dùng vòng lặp For trong trường hợp này không nhanh bằng Filter hoặc Advanced filter.
 
em cảm ơn anh đã chỉ giáo. Anh cho e hỏi thêm: các quy tắc đặt tên biến thế nào cho nó logic. (vd: với form thì là Frm...)
Em mới mò mẫm VBA nên chưa biết nhiều!
 
Không có nguyên tắc đặt tên biến cho logic. Chỉ có các nguyên tắc đặt tên biến:
- Không trùng với nhau
- Không trùng với từ khoá như Cells, Range, Row, Column, Case, ...
- Không chứa ký tự đặc biệt
- Không bắt đầu bằng 1 ký số
- ...

Với form, bạn có thể đặt Frm, Fm, ...
Với Range, bạn có thể đặt vung, Rng, ...
Với 1 thành phần con của biến Range, thì nó là 1 cell, vậy bạn đặt là Cll, Clls, Cel, O1, ...
Với thứ tự dòng, bạn có thể đặt dong, iRow, Rw, ...
Với tổng số dòng bạn có thể đặt iRows, RwCount, ...
Với số thứ tự dòng cuối, bạn có thể đặt dongcuoi, EndR, ERw, ...

Nghĩa là, bạn đặt tên biến sao cho phù hợp với cái mà nó thay thế, và quan trọng là: 5 năm sau khi bạn đọc lại code của chính mình, bạn biết nó đang thay thế cho cái gì.
 
Lần chỉnh sửa cuối:
em cảm ơn anh đã chỉ giáo. Anh cho e hỏi thêm: các quy tắc đặt tên biến thế nào cho nó logic. (vd: với form thì là Frm...)
Em mới mò mẫm VBA nên chưa biết nhiều!
Có 1 sự quy ước ngầm về cách đặt tên biến của các nhà lập trình như thế này:

untitled.JPG
 
Không có nguyên tắc đặt tên biến cho logic. Chỉ có các nguyên tắc đặt tên biến:
- Không trùng với nhau
- Không trùng với từ khoá như Cells, Range, Row, Column, Case, ...
- Không chứa ký tự đặc biệt
- Không bắt đầu bằng 1 ký số
- ...

Với form, bạn có thể đặt Frm, Fm, ...
Với Range, bạn có thể đặt vung, Rng, ...
Với 1 thành phần con của biến Range, thì nó là 1 cell, vậy bạn đặt là Cll, Clls, Cel, O1, ...
Với thứ tự dòng, bạn có thể đặt dong, iRow, Rw, ...
Với tổng số dòng bạn có thể đặt iRows, RwCount, ...
Với số thứ tự dòng cuối, bạn có thể đặt dongcuoi, EndR, ERw, ...

Nghĩa là, bạn đặt tên biến sao cho phù hợp với cái mà nó thay thế, và quan trọng là: 5 năm sau khi bạn đọc lại code của chính mình, bạn biết nó đang thay thế cho cái gì.
---
Đọc bài của anh thấy đơn giản và nhẹ nhàng quá! Để đúc kết việc tưởng chừng đơn giản này thì lại là 1 quá trình không giản đơn, lúc trước em cũng loay hoay mãi với việc này, thậm chí còn thắc mắc với việc khi viết code cú thụt ra, thụt vào đầu dòng để làm gì nữa chứ /-*+/.
 
---
Đọc bài của anh thấy đơn giản và nhẹ nhàng quá! Để đúc kết việc tưởng chừng đơn giản này thì lại là 1 quá trình không giản đơn, lúc trước em cũng loay hoay mãi với việc này, thậm chí còn thắc mắc với việc khi viết code cú thụt ra, thụt vào đầu dòng để làm gì nữa chứ /-*+/.

Một vài người đặt tên biến chỉ chú trọng nguyên tắc không trùng nhau, không trùng từ khoá, ... Còn trong việc hình tượng hoá cái tên biến thì không làm. Điển hình là Bác Sa_DQ. Bác Sa chỉ chú trọng việc đặt tên biến sao cho trong tên bao gồm cả chữ hoa và chữ thường, thí dụ như iI, jJ, xX, lL, ... chẳng biết cái nào đang chạy theo dòng và cái nào đang chạy theo cột.
Không biết bản thân bác ấy đọc lại code của chính mình có hiểu không, chứ tôi đọc thấy rất khó hiểu (vì không hình tượng). Khi cho 2 biến, 1 chạy theo dòng và 1 chạy theo cột, tôi sẽ dùng iRow và jCol ... Giả sử muốn tính toán cái gì đó dựa trên biến dòng chẳng hạn, tôi lụm iRow và xử. Còn jJ và kK thì lại phải quay lại đọc bên trên theo cái nào đang chạy theo dòng.
Và nếu
PHP:
For iI = 1 to kK
   For jJ = 1 to lL
thì lại phải đọc tiếp lên phía trên xem kK và lL cái nào đã dùng để đếm số dòng!

Còn nếu viết như vầy:
PHP:
For iRw = 1 to RwCount
   For jCol = 1 to ColCount

thì có cần xem lại ở trên không?
 
Lần chỉnh sửa cuối:
Không có nguyên tắc đặt tên biến cho logic. Chỉ có các nguyên tắc đặt tên biến:
- Không trùng với nhau
- Không trùng với từ khoá như Cells, Range, Row, Column, Case, ...
- Không chứa ký tự đặc biệt
- Không bắt đầu bằng 1 ký số
- ...

Với form, bạn có thể đặt Frm, Fm, ...
Với Range, bạn có thể đặt vung, Rng, ...
Với 1 thành phần con của biến Range, thì nó là 1 cell, vậy bạn đặt là Cll, Clls, Cel, O1, ...
Với thứ tự dòng, bạn có thể đặt dong, iRow, Rw, ...
Với tổng số dòng bạn có thể đặt iRows, RwCount, ...
Với số thứ tự dòng cuối, bạn có thể đặt dongcuoi, EndR, ERw, ...

Nghĩa là, bạn đặt tên biến sao cho phù hợp với cái mà nó thay thế, và quan trọng là: 5 năm sau khi bạn đọc lại code của chính mình, bạn biết nó đang thay thế cho cái gì.
---> Phiền anh cho em hỏi, có topic nào hướng dẫn cách làm cái filter tương tự như em không ạ, em có search rồi mà không thấy ạ, Xin cảm ơn bác trước...
 
Cách của mình là dùng VBA. Nếu bạn biết 1 chút về VBA thì chắc bạn sẽ làm được thôi. Mọi bí mật được nằm trong code lệnh. bạn bấm ALT + f11 sau đó chon sheet2 là có code đó bạn
Thân!
 
Không có nguyên tắc đặt tên biến cho logic. Chỉ có các nguyên tắc đặt tên biến:
- Không trùng với nhau
- Không trùng với từ khoá như Cells, Range, Row, Column, Case, ...
- Không chứa ký tự đặc biệt
- Không bắt đầu bằng 1 ký số
- ...

Với form, bạn có thể đặt Frm, Fm, ...
Với Range, bạn có thể đặt vung, Rng, ...
Với 1 thành phần con của biến Range, thì nó là 1 cell, vậy bạn đặt là Cll, Clls, Cel, O1, ...
Với thứ tự dòng, bạn có thể đặt dong, iRow, Rw, ...
Với tổng số dòng bạn có thể đặt iRows, RwCount, ...
Với số thứ tự dòng cuối, bạn có thể đặt dongcuoi, EndR, ERw, ...

Nghĩa là, bạn đặt tên biến sao cho phù hợp với cái mà nó thay thế, và quan trọng là: 5 năm sau khi bạn đọc lại code của chính mình, bạn biết nó đang thay thế cho cái gì.
Ý kiến của sư phụ em đều đồng tình, chỉ xin góp thêm 1 vài ý khác:
- Nếu như ta xác định viết code chỉ để mình ta xài thì chẳng nói làm gì ---> Tên biến đặt thế nào cũng được, miễn sao là ta hiểu và bảo đảm code chạy nhanh, chính xác
- Còn nếu như ta xác định hướng tới sự chuyên nghiệp thì nên học theo những lập trình viên chuyên nghiệp, tức là nên xem lại cách trình bày và đặt tên biến theo hướng chung mà các lập trình viên đang dùng

Lấy 1 ví dụ:
PHP:
Public Const GWL_WNDPROC = -4
Đây là hằng số API mà phần lớn lập trình viên đều dùng, thế mà ta lại chơi kiểu khác:
PHP:
Public Const Cuatoi = -4
điều này cũng giống như trên thế giới đã quy ước ĐÈN ĐỎ thì dừng lại còn ĐÈN XANH thì đi, ta lại tạo ra quy ước mới rằng ĐÈN TÍM đì dừng lại, ĐÈN HỒNG thì đi... chắc sẽ khiến cho người khác rối đầu...
Thử nghĩ 20 người làm việc nhóm, cùng có cách đặt biến giống nhau, có phải sẽ giúp cho việc đọc code lẩn nhau nhanh hơn không?
Cách đặt tên biến theo quy ước ngầm định người ta đã dùng hầu hết trên thế giới rồi, thiết nghĩ ta không cần phải "chế" thêm làm gì, trừ những trường hợp đặc biệt
Tóm lại: Nếu chúng ta muốn 1 ngày nào đó vươn ra biển lớn thì từ bây giờ mọi thứ nên chuyên nghiệp (kẻo bọn nước ngoài chê code của mình không phải vì thuật toán dở mà vì mấy cái tên biến kia thì thật là...)
 
Cách của mình là dùng VBA. Nếu bạn biết 1 chút về VBA thì chắc bạn sẽ làm được thôi. Mọi bí mật được nằm trong code lệnh. bạn bấm ALT + f11 sau đó chon sheet2 là có code đó bạn
Thân!
Xin cảm ơn sự giúp đỡ của bạn, tuy nhiên các biến bạn đặt mình đọc hơi khó, :D
 
Có 1 sự quy ước ngầm về cách đặt tên biến của các nhà lập trình như thế này:
attachment.php

View attachment 66348

Quy ước này chuẩn với ngôn ngữ Visual Basic đó. Với các biến kiểu đối tượng (Class) thì tiếp đầu ngữ là 3 ký tự chữ thường, với các kiểu dữ liệu còn lại có thể dùng 1 ký tự chữ thường, sau tiếp đầu ngữ là tên biến thể hiện mục đích sử dụng, như là: i - Integer; l - Long; s - String; b - Boolean,...Đặt tên biến: iRow, iCol, rngAmount, rngFirstName,....

Với hằng số sử dụng, nếu hằng ta tự tạo thì tên có thể theo cách đặt của chúng ta, nhưng các hằng số quy định lập trình Windows (API), của ứng dụng thì ta nên dùng đúng tên để đảm bảo sự thống nhất chung. Nguyên tắc này là thống nhất cho tất cả các ngôn ngữ lập trình.
 
Thưa các bác, em học theo các bác mãi mà chưa làm đc, chị em có 1 file excel bị lỗi tham chiếu, lỗi đúng như những j` em hỏi ở đây ạ, em cũng mày mò mãi mà không sửa được, rất mong nhận được thông tin ai có thể sửa được lỗi tham chiếu của file excel giúp em, em xin hậu tạ ạ. Xin các bác để lại mail hoặc số điện thoại để gặp trực tiếp.

Liên hệ: Đỗ Phương Anh - 0915 50 50 19 - Ngõ 23 Lò Đúc - HN

Xin cảm ơn,.
 
Web KT
Back
Top Bottom