XD360 KÍNH CHÚC CHO MỌI NHÀ VẠN SỰ AN LÀNH!

Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng

 Quên mật khẩu
 Đăng ký mới
Anh Trần HòeBùi Quốc Hưng
Xem: 4722|Trả lời: 7
In Chủ đề trước Tiếp theo
Thu gọn cột thông tin

Nhờ dịch code VBA liên quan đối tượng scripting.dictionary

[Lấy địa chỉ]

Hãy đăng nhập để có nhiều chức năng hữu dụng hơn và xem ảnh rõ hơn!

Bạn phải đăng nhập để xem được nội dung, nếu bạn chưa có tài khoản? hãy Đăng ký mới

x
Anh Fubi, anh Tranhoe có thể dịch hộ em đoạn code tô đậm bên dưới không, em đang cần tổng hợp số liệu mà cái khoản dictionary em chả hiểu gì cả:

[Visual Basic] 纯文本查看 复制代码
Sub M_remove_duplicate_records()
sn = Sheets("unique").Cells(1).CurrentRegion
With CreateObject("scripting.dictionary")
For j = 1 To UBound(sn)
.Item(sn(j, 1)) = Application.Index(sn, j, 0)
Next
Sheets("unique").Cells(1, 4).Resize(.Count, UBound(sn, 2)) = Application.Index(.Items, 0, 0)
End With
End Sub


Em cảm ơn!
p/S: Về mặt tư duy thì em hiểu code này nó chạy dữ liệu trong cả mảng của sheet1, sau đó nó loại giá trị trùng lặp rồi resize đối tượng chọn chọn sang vị trí mới. Tuy nhiên em vẫn không hiểu cặn kẽ cơ chế chạy của nó như thế nào cả.
Em bổ sung thêm File đính kèm nhé! Sheet("unique") chạy code bằng nút start anh nhé!
__VBA_dictionaries_voorbeelden_en.xls (268.5 KB, Lượt tải về: 40)

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

2#
tranhoe Đăng lúc 8/5/2014 21:42 | Chỉ xem của tác giả
Thứ nhất: không có dữ liệu đầu vào nên không biết dữ liệu qui mô ra sao, quan hệ thế nào với nhau, thuộc lĩnh vực gì...
Thứ hai: Mình cũng mới đọc qua, chưa thành thạo về "Biến Mảng".
Tuy nhiên sẽ trao đổi 1 số ý sau (để Bạn dễ phân tích câu lệnh):
- sn là biến mảng chứa số liệu của Sheets("1")
-  UBound(sn) hoặc UBound(sn, 1) là xác định Dòng cuối của vùng "sn"; UBound(sn, 2) là xác định Cột cuối của vùng "sn"
- Index(array, row_num, column_num) trả về giá trị trong ô nằm ở giao điểm của Row_num và Column_num.
Mục đích của Macro: Qua vòng lặp For ... Next sẽ loại giá trị trùng lặp (kiểu của trùng lặp như thế nào thì chưa biết rõ) và rút gọn lại còn a dòng, b cột. Điền giá trị mãng này vào vùng mới bắt đầu từ Cells(1, 4)

Đánh giá

Mong bạn tiếp tục chia sẻ. Thanks!: 5.0
Mong bạn tiếp tục chia sẻ. Thanks!: 5
Em bổ sung File dữ liệu rồi anh ơi!  Đăng lúc 8/5/2014 22:18

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

3#
tranhoe Đăng lúc 9/5/2014 00:06 | Chỉ xem của tác giả
Trên Sheet("unique") thì sn là mảng chứa 18 dòng, 2 cột. Chạy code (bằng nút start) thì căn cứ kết quả ta nhận định:
Dò trên cột 1 từ trên xuống, nếu có ô nào trùng với những dữ liệu đã dò thì loại Dòng đó ra, cho đến hết dữ liệu.
Ghi những Dòng còn lại (chỉ còn 13 dòng) vào cột 4 (bắt đầu từ dòng 1).

Thử copy thành Sheet("unique2"), đưa thêm dữ liệu vào cho sn là mảng chứa 18 dòng, 3 cột, sửa code một tí, ghi kết quả vào cột 5 (bắt đầu từ dòng 1).
Nhận xét: 2 cột đầu tiên của kết quả mới này giống như bài trên, riêng cột cuối cùng số liệu lại không đồng nhất.
Đúng là mình chỉ biết đến đó thôi.

File làm thêm đính kèm: VBA_dictionaries_voorbeelden_en2.xls (290.5 KB, Lượt tải về: 18)

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

4#
 Tác giả| tranhungdao12a3 Đăng lúc 9/5/2014 08:29 | Chỉ xem của tác giả

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ái ubound nó trả về giá trị cuối cùng mà, cell lặp nó cũng lấy giá trị cuối cùng! Do cột anh thêm vào không có sự trùng lặp, dữ liệu aa1 ở A2 tương ứng với bg2 tại C2 có trùng với aa1 tại A18 ứng với bg18 tại c18----> nó sẽ lấy bg18 là cuối cùng để đưa sang G2 là đúng rồi mà!
Code chạy ra kết quả thì em hiểu, vấn đề là em không hiểu cái quá trình nó chạy ra kết quả như thế nào thôi!Hixxx---->cái này là em vẫn chưa hiểu bản chất của code để mà sửa cho phù hợp với cái mình cần.

Đánh giá

Hiii! Thế anh em mình chờ Anh Fubi vậy, ảnh giải thích code tất cả trong file e gửi thì tốt! Hiiii!  Đăng lúc 9/5/2014 08:41
A nói rồi, mới đọc về mãng thôi nên giải thích một câu lệnh gộp nhiều lệnh như kiểu đó thật khó!  Đăng lúc 9/5/2014 08:37

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

5#
fubi Đăng lúc 9/5/2014 14:28 | Chỉ xem của tác giả
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.

Đánh giá

Rất hữu ích! Thanks!: 5.0
Rất hữu ích! Thanks!: 5
"Tức là lấy theo giá trị các ô tương ứng với gtrị trùng cuối cùng"  Đăng lúc 9/5/2014 20:23

Số người tham gia 2Uy Tín: +6 Thưởng +6 Thanked +2 Thu lại Lý do
tranhoe + 3 + 3 + 1 Bài hay quá. Cảm ơn!
tranhungdao12a3 + 3 + 3 + 1 Bài Quá hay luôn! Tks A!

Xem tất cả

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

6#
 Tác giả| tranhungdao12a3 Đăng lúc 9/5/2014 14:59 | Chỉ xem của tác giả
fubi gửi lúc 9/5/2014 14:28
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ề  ...

Anh dịch dễ hiểu quá! Em đọc trên GPE và lý thuyết ngoài thì có nhiều nhưng khó hiểu ghê. Em đang cần tổng hợp dữ liệu gấp nên mới tìm hiểu tắt bỏ qua giai đoạn. Em cũng mới đọc VbA mới được dăm bảy tháng thôi. Mấy cái em cần làm dùng Pivottable hoặc consolidate thì cũng được nhưng chọn dữ liệu cho pivot rất mất công. Đọc trên GPE có mấy bài về trích lọc trích lọc danh sách duy nhất đúng với cái mình đang cần nên em vô trang nước ngoài tải cái File trên về nhờ dịch. Thú thực là em đọc mất cả ngày bài về phần này trên GPE mà không hiểu được. Anh dịch phát hiểu bài này luôn.Hiii!

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

7#
tranhoe Đăng lúc 9/5/2014 17:48 | Chỉ xem của tác giả
fubi gửi lúc 9/5/2014 14:28
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ề  ...

A Fubi xem giúp file ở bài #3, trên Sheet("unique2") cái này dữ liệu gốc là 18 dòng, 3 cột.
Sao kết quả chạy ra: ô G2 <> C2

Đánh giá

OK anh! Mới đọc sơ sơ về biến Mảng và Scripting.Dictionary. Sẽ tranh thủ thời gian tìm hiểu về nó!  Đăng lúc 9/5/2014 21:27
Mỗi lần nó thấy key trùng thì nó thay thế ngay giá trị các ô cột khác theo giá trị mới tương ứng. Tức lấy theo giá trị các ô tương ứng với gtrị trùng cuối cùng   Đăng lúc 9/5/2014 19:48
Dạ vì cơ chế: key của DIC không cho trùng lặp nhưng các ô cột khác nó sẽ lấy theo giá trị của ô trùng tương ứng cuối cùng.  Đăng lúc 9/5/2014 19:47

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

8#
tranthuttc Đăng lúc 21/9/2014 18:53 | Chỉ xem của tác giả
hâm mộ anh fubi quá !!! cảm ơn anh đã giải thích không thể dễ hiểu hơn ạ !

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

Phiên bản Mobile|Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng  

Phần mềm dự toán xây dựng excel | Hướng dẫn lập dự toán xây dựng | Phần mềm tư vấn giám sát | Phần mềm quản lý chất lượng xây dựng |

Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng

Phần mềm ôn thi sát hạch chứng chỉ hành nghề Kiến Trúc sư

Phần mềm ôn thi sát hạch chứng chỉ hành nghề Đấu thầu

GMT+7, 11/5/2025 11:49 , Processed in 0.158097 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Kiso Comsenz Inc.