tranhungdao12a3 gửi lúc 9/5/2014 08:29
Cột cuối nó trả về như thế là đúng rồi mà anh. Nó tìm kiếm trong cả mảng và cá ...
Muốn hiểu đượccode bạn đưa thì cần kiến thức căn bản nhưng ở mức chuyên sâu về VBA. Vì bạnchưa có căn bản nên mình không thể đi vào phân tích chuyên sâu cho bạn. Nôm na,bạn đang học phép nhân chia mà mình đi giảng lý thuyết tích phân thì bạn khó màhiểu được. Vậy nên mình chia sẻ ở mứcđộ mô tả nôm na: 1. Biến: là nơi trong bộnhớ máy vi tính được định ra để lưu trữ dữ liệu tạm thời. Dựa Vào kho tạm thờinày mà người lập trình làm nơi trung gian lưu vào rồi lấy ra dữ liệu mình muốn.Tắt máy hoặc thoát chương trình là biến tạm này mất sạch. Biến sẽ có rất nhiềuloại: string (chỉ chứa text), Integer, byte,.. Nó nôm na như tủ sách được phânthành rất nhiều ngăn. Mỗi ngăn chỉ chuyên biệt chứa 1 loại sách nào đấy: sáchtruyện, sách khoa học, sách tôn giáo... Không thể lấy biến kiểu này mà chứa dữliệu kiểu khác cho biến được. Nôm na hộc chứa truyện không thể để sách tôn giáovào. 2. Biến Mảng: là 1 biến đặc biệt. Nó như là 1 cái kho tạm để chứa dữ liệu gồm có hàng,cột: nôm na kho chứa định hình sẵn như bảng tính excel vậy (gồm hàng và cột.Từng Ô: nơi giao nhau giữa hàng và cột để lưu dữ liệu).
3. scripting.dictionary: - là 1 đối tượng(gần gần nôm na như biến mảng) với số lượng phần tử (item – ô) tùy ý,và mỗi phầntử (item – ô) được nhận dạng dựa trên một “key” duy nhất. Rõ hơn: nó có số hàngvà số cột tùy ý không cần biết trước (tự co dãn được tùy theo số liệu nhập vàocho nó. - dictionary cóthể nhận các dữ liệu thuộc các kiểu dữ liệu khác nhau mà thường thấy là kiểuchuỗi (string), số (integer, long,…) hay thậm chí là một sự kết hợp giữa cả haikiểu dữ liệu. - các phần tử (item– ô) chỉ có thể được gọi ra duy nhất bằng cách là thông qua một key mà key đólà bắt buộc và là duy nhất (không thể có 2 key trùng nhau). Điều này tạo thuậnlợi cho các bài toán trích lọc danh sách duy nhất và đây cũng chính là ưu điểmlớn nhất của Dictionary. - dictionary làmột phần trong thư viện Microsoft Scripting Runtime (scrrun.dll): nó giống nhưlà 1 cái kho của 1 khu đất “scrrun.dll” có sẵn trong máy tính vậy đó. * Tóm lại: - Nôm na Dictionary như là 1 bảng tô lớn vô cùng gồm nhiều hàng và nhiều cột. Nhưng cột đầu tiên sẽ chỉ chứa các giá trị không trùng nhau. Từng giá trị của ô trong cột đầu tiên xem như là key để truy xuất hay nhập liệu cho các ô của các cột còn lại.
4. Dịch từng câu lệnh: [Visual Basic] 纯文本查看 复制代码 sn = Sheets("unique").Cells(1).CurrentRegion
(bạn ghi sheets(“1”) là sai câu lệnh. Nếu đúng phải là sheets (“Sheet1”))
Đặt biến sn làbiến mảng chứa số hàng và số cột theo bảng dữ liệu hiện hành của sheet "unique"– Hoặc “Sheet1”. Trong sheet "unique" của file bạn nó chính là mảng “A1:B18” gồm 18 dòng và 2 cột.
[Visual Basic] 纯文本查看 复制代码 With CreateObject("scripting.dictionary")
- Tạo đối tượng dictionary.Hiện tại tạo cái kho trống (đối tượng dictionary) chưa có chứa gì cả. Với sốhàng và số cột tùy ý chờ sẵn để gắn dữ liệu vào. [Visual Basic] 纯文本查看 复制代码 For j = 1 To UBound(sn)
- UBound(sn): làm hàm trả về giá trị là 1 sốnguyên, là số thứ tự (hàng) của phần tử cuối cùng trong mảng. Ở đây là mảng sn.Mảng này có phần tử cuối cùng là 18 (dòng thứ 18). [Visual Basic] 纯文本查看 复制代码 .Item(sn(j, 1)) = Application.Index(sn, j, 0) - Tác dụng lệnh này là: + Thiết lập (lưu) giá trị cho 1 key (nôm nalà từng ô của cột đầu tiên) của đối tượng (cái kho BẢNG) dictionary. Giá trị của key này được lấy bằng giá trị của từng Ô của cộtđầu tiên của mảng sn. Nếu bị giá trị key bị trùng giá trị thì nó sẽ không lưuvào BẢNG dictionary. Các cột còn lạicủa BẢNG dictionary sẽ lấy theo giá trị các cột tương ứng với giá trị của cộtđầu tiên không trùng giá trị trong bảng sn (chính là bảng dữ liệu của Sheet "unique").Tức BẢNG sn có bao nhiêu cột thì BẢNG dictionary sẽ có bấy nhiêu cột. * Sau khi vòng lặpchạy từ ô đầu tiên cho đến ô dòng cuối cùng của mảng sn, ta thu được kết quả dữliệu của cái BẢNG dictionary là: + Cột đầu tiên:là các giá trị k trùng lặp của cột A dữ liệu. Tức thu được giá trị cột A khôngtrùng lặp. + cột thứ 2 (hay3, hay 4.. tùy vào số cột dữ liệu ban đầu): chứa các giá trị tương ứng tại cột từcột thứ 2 trở đi của dữ liệu. [Visual Basic] 纯文本查看 复制代码 Sheets("unique").Cells(1, 4).Resize(.Count, UBound(sn, 2)) = Application.Index(.Items, 0, 0) - Tại sheet "unique", tại Ô (dòng 1, cột 4) = Ô D1, cho giá trịvùng ô: gồm số dòng = số dòng của bảng dictionary,số cột = số cột của biến mảng sn (chính là số cột của dữ liệu trong sheet "unique". ==> Kết quả: Ta có 1 bảng dữliệu mới với số cột bằng số cột dữ liệu ban đầu. Số dòng bằng số dòng Ô của “bảng”dictionary mới tạo với cột đầu có các giá trị không trùng lặp. Các cột sau làgiá trị tương ứng với giá trị từng ô của cột đầu.
|