Hàm Vlookup kết hợp hàm Choose trong VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

thuong_93

Thành viên mới
Tham gia
2/8/16
Bài viết
10
Được thích
0
Chào mọi ngưới. Em với tập tành học vba cho excel và đang gặp vấn đề sau:
Em dùng hàm Vlookup kết hợp hàm Choose để lọc ra được chiều cao h và chiều rộng b của dầm ( trong sheet THIET KE ) (em học xây dựng),nhưng không hiểu sai chỗ nào.Mong mọi người chỉ giúp làm như thế nào và cần bổ sung kiến thức nào về VBA để làm được.
 

File đính kèm

Câu lệnh này:
Mã:
Set NoiLuc = Sheets("Beam forces").Range("A2")
Chi biết biến 'NoiLuc' chỉ có 1 ô dữ liệu mà thôi;
Vậy thì sao có thể xài vòng lặp để khảo sát nó:
PHP:
Do While NoiLuc(iDong, 2) <> ""         'Lam cong tac A '
  Loop

Biến 'KetQua' ở câu lệnh bên trên cũng vậy;
Bạn xem lại đi nha!
 
Upvote 0
Dòng này
Set NoiLuc = Sheets("Beam forces").Range("A2")
Em hiểu là mảng 'NoiLuc' sẽ bắt đầu từ Range("A2"), nó có thể chỉ bao gồm ô "A2" hoặc một mảng "A2:H100" chẳng hạn, với lại ô cuối cùng trong mảng của em không phải cố định (mỗi 1 công trình 1 khác).
Em đã thử module SUB_XOA_DU_LIEU (mình cũng khai báo biến tương tự biến 'NoiLuc' ) và thấy vẫn chạy bình thường.
Phiền anh xem giúp em module SUB_TRICH_TIET_DIEN , em đang mắc chỗ kết hợp hàm Vlookup và Choose .
Em mới tìm hiểu về món này lên vẫn còn gà .Cảm ơn anh đã giúp đỡ.
 
Upvote 0
Khoan hãy thảo luận về VLOOKUP() & CHOOSE()
Bài này của mình sẽ bàn kỹ với bạn về cách thức gán 1 vùng ô cho biến đã khai báo, với các câu lệnh chủa bạn tương thự sau:
PHP:
1    Set ThietKe = Sheets("THIET KE").Range("B9")
2   Set STORY = Sheets("Frame Section Assignments").Range("A2:A10000")
        'Gan bien STORY tai cot STORY tu o A2 den o A10000 tai sheet "Frame Section Assignments"    '
3   Set LINELABELS = Sheets("Frame Section Assignments").Range("B2:B10000")
        'Gan bien LINELABELS tai cot LINE tu o B2 den o B10000 tai sheet "Frame Section Assignments"    '
4   Set ANALYSISSECT = Sheets("Frame Section Assignments").Range("F2:F10000")
        'Gan bien ANALYSISSECT tai cot AnalysisSect tu o F2 den o F10000 tai sheet "Frame Section Assignments"  '
5   Set GanTDien = Sheets("Frame Section Properties").Range("A2:H10000")
        'Gan bien TDien la 1 vung du lieu tai sheet "Frame Section Properties",bat dau tu o A2   '
Ở dòng lệnh mang số 1: Biến ThietKe chỉ là 1 ô [B9]
Mình chưa dám chắc là bạn muốn vậy.

Ở D2: Sau dòng lệnh này, biến sTory chứa gần vạn ô; Nhưng trên trang tính cụ thể chỉ khoảng dưới 100 ô có dữ liệu thôi;
Theo mình bạn nên gán vô biến đối tượng này những ô có dữ liệu mà thôi; Như
Mã:
 With Sheets("Frame Section Assignments")
   Set STORY = .Range(.[A2], .[A60000].End(xlUp))
End With[/code]

Nếu xét đến cả các dòng lệnh bên dưới nữa, thì ta nên làm vầy
PHP:
 Dim Rws As Long, Sh As WorkSheet
 Set Sh=Sheets("Frame Section Assignments")
 Rws=Sh.[B2].CurrentRegion.Rows.Count
 Set STORY = Sh.[A2].Resize( Rws)
 Set LINELABELS = Sh.Range("B2").Resize(Rws)
 '. . . . '
 
Upvote 0
.End(xlUp)
.CurrentRegion.Rows.Count
.Resize
Toàn thứ mới lạ đối với em. Em có google thì được biết đây là các thuộc tính (chắc là còn nhiều thuộc tính nữa khác...).
Thực sự là bây giờ em thấy hơi loạn rồi, có lẽ là em tạm gác lại bảng tính này để học thêm về vba.
Anh có thể chia sẻ ngắn gọn về phương pháp học , các nguồn tài liệu căn bản nhất về VBA dành cho người mới không ạ?
Em cảm ơn anh.
 
Upvote 0
Hàm Choose và VLookup có thể thay bằng Index và Match. Hoặc nếu array đúng rồi thì có thể lấy thằng qua chỉ số, không cần hàm Index

Chú: dùng hàm VLookup thì phải bẫy lỗi chứ!
 
Upvote 0
(2) Em đã thử module SUB_XOA_DU_LIEU (mình cũng khai báo biến tương tự biến 'NoiLuc' ) và thấy vẫn chạy bình thường.

(1) Phiền anh xem giúp em module SUB_TRICH_TIET_DIEN , em đang mắc chỗ kết hợp hàm Vlookup và Choose .
PHP:
1    Set ThietKe = Sheets("THIET KE").Range("B9")
' . . . . . . .      '
    iDong = 1
    Do While ThietKe(iDong, 1) <> ""
        VungTraTD = Application.Choose(Array(1, 2), STORY & LINELABELS, ANALYSISSECT)
        TDienTam = Application.VLookup(ThietKe(iDong, 1) & ThietKe(iDong, 2), VungTraTD, 2, 0)
        ThietKe(iDong, 6) = Application.VLookup(TDienTam, GanTDien.Range("A1:H5"), 8, False)
        ThietKe(iDong, 7) = Application.VLookup(TDienTam, GanTDien.Range("A1:H5"), 7, False)
        ThietKe(iDong, 8) = ThietKe(iDong, 7) * 0.1
        iDong = iDong + 1
    Loop
Như đã nêu ở bài trên, tham biến 'ThietKe' chỉ đang chứa 1 ô;
Vậy xài vòng lặp ở đay là vô nghĩa;
Bạn hãy cho biết í đồ thực sự của bạn xài vòng lặp để mong mõi duyệt qua các ô của vùng nào?
Sâu xa hơn, cái mà bạn đang cần tu bổ kiến thức của mình không fải là VLOOKUP() hay CHOOSE() mà là các dòng lệnh bên trên vòng lặp này.
[Ông bà nói: "Đầu xuôi đuôi lọt" đó bạn]
 
Upvote 0
Hoang2013
1. Mục đích cuối cùng của em là lấy được giá trị tại cột H và cột G sheets "Frame Section Properties" để điền vào b h của sheets "THIET KE" (phải phù hợp với Story và beam tương ứng).
2. Để làm được vậy thì cần tạo ra 1 "TietDienTam" trong sheets "THIET KE" (chính là cột F của sheets "Frame Section Assignments" - dùng vlookup và choose) , rồi từ "TietDienTam" dùng hàm vlookup để lấy ra b h (cột H G) trong sheets "Frame Section Properties".

Ý đồ của em là cho biến iDong chạy từ dòng đầu tiên (dòng 9 của sheet "THIET KE") đến dòng cuối cùng chứa dữ liệu. Nếu dòng đó mà có dữ liệu thì làm các thao tác ở mục 2, còn nếu dòng đó không có dữ liệu thì thoát.
Bởi vì không cố định biết trước dòng nào là dòng cuối nên cứ chạy đến khi nào dòng đó không có dữ liệu thì thoát.
 
Lần chỉnh sửa cuối:
Upvote 0
Ý đồ của em là cho biến iDong chạy từ dòng đầu tiên (dòng 9 của sheet "THIET KE") đến dòng cuối cùng chứa dữ liệu. Nếu dòng đó mà có dữ liệu thì làm các thao tác ở mục 2, còn nếu dòng đó không có dữ liệu thì thoát.
Vậy bạn muốn dòng lệnh này làm gì:
PHP:
VungTraTD = Application.Choose(Array(1, 2), STORY & LINELABELS, ANALYSISSECT)

Vì hiện tại nó đang báo lỗi.
 
Upvote 0
Em muốn dòng đấy trả về 1 mảng gồm các cột A,B,F để lấy mảng đó làm table_array cho dòng bên dưới
TietDienTam = Application.VLookup(ThietKe(iDong, 1) & ThietKe(iDong, 2), VungTraTietDien, 2, 0)
 
Upvote 0
Trước dòng lệnh đó, bạn thử thêm 2 dòng lệnh này & tự chiêm nghiệm, nha!
PHP:
        Set VungTraTD = Union(STORY, LINELABELS, ANALYSISSECT)
        MsgBox VungTraTD.Address, , "GPE.COM Xin Chào!"
 
Upvote 0
Xuất hiện dòng này bị lỗi
ThietKe(iDong, 8) = ThietKe(iDong, 7) * 0.1
phiền anh xem lại hộ em
 
Upvote 0
Theo những gì bạn đã mô tả, bạn đang sai hướng tại dòng lệnh:
Mã:
Set ThietKe = Sheets("THIET KE").Range("B9")
Dòng lệnh này cú fáp không sai, nhưng nó chỉ đưa vô tham biến ThietKe có 1 ô thôi.
Vây mà dưới dó, bạn xài vòng lặp cho ô đó là chưa thể đúng.
Cái hiện giờ bạn cần nhờ là sửa dòng lệnh này cho đúng í đồ của bạn.
Có vài cách sửa đề dòng lệnh này lấy hết các ô có dữ liệu tại cột [B:B] từ ô [B9] trở xuống.:
Cách 1:
PHP:
 Dim Rws As Long  'Khai báo thêm 1 tham biến (để chứa số dòng của CSDL)  '
Rws=Sheets("THIET KE").Range("B9").CurrentRegion.Rows.Count
Set ThietKe = Sheets("THIET KE").Range("B9").Resize(Rws)
Msgbox ThietKe.Address, ,"GPE.COM Xin Mời Thử!"
' . . . . .   '

Cách 2:
Mã:
  Set ThietKe = Sheets("THIET KE").Range(Sheets("ThietKe").[B9], Sheets("ThietKe").[B9].EndxlDown))
Msgbox ThietKe.Address, ,"GPE.COM Xin Thử Xem Sao?"
' . . . . .   '
. . . . . .


(Mình chỉ giúp bạn vậy thôi; Chuyện sửa là của bạn, nha!)
 
Upvote 0
Theo những gì bạn đã mô tả, bạn đang sai hướng tại dòng lệnh:
Mã:
Set ThietKe = Sheets("THIET KE").Range("B9")
Dòng lệnh này cú fáp không sai, nhưng nó chỉ đưa vô tham biến ThietKe có 1 ô thôi.
Vây mà dưới dó, bạn xài vòng lặp cho ô đó là chưa thể đúng.
...
Trong vòng lặp kế tiếp, code của thớt cho ThietKe chạy theo biến iDong từ 1, tức là B9, lần lượt tăng iDong lên, tức là chỉ vào B10, B11,... cho đến lúc ô này là trống. Đây là một hình thức khác của hàm Offset.

Chỗ thớt bị sai là cách dùng Choose để gộp các cột dữ liệu vào thành 1 mảng 2 chiều để hàm VLookup có thể dò. Thớt cần cho biết công thức này lúc làm thực hiện trên worksheet thì đã hoạt động chưa? Khi biết nó hoạt động đúng rồi thì mới tính đến chuyện chuyển vào code VBA. Trong VBA, dùng worksheetfunction để lấy 1 mảng không phải là chuyện đơn giản, khá khó debug.

Như tôi đã nói ở trên, hàm này dùng VLookup rất phức tạp. Thớt nên tìm những bài nói về tìm kiếm theo nhiều điều kiện (gợi ý: hàm Lookup). Khi có hàm này rồi thì dùng nó để duyệt điều kiện trong 2 cột, lấy chỉ số và trích xuất từ cột thứ 3.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom