Cần viết Code nạp các ô chứa mã số cột B vô Dictionary mà không phải xài For...Next (1 người xem)

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

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
934
Được thích
240
Giới tính
Nam
Xin chào các Anh chị và các bạn GPE!
Nhờ các Anh chị và các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Tôi có một bảng tính như vầy:

McNiEgN.png


Dọc theo cột B là các ô chứa mã số khác nhau hoàn toàn (Không có ô nào trùng với ô nào). Để nạp các ô đó vô Dictionary, tôi xài Code:
[GPECODE=vb]Sub Nap_vo_Dic()
Dim Dic As Object
Dim rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
For Each rng In Range([B3], [B65536].End(xlUp))
If Not Dic.exists(rng.Value) Then
Dic.Add rng.Value, Empty
End If
Next
MsgBox Dic.Count
End Sub[/GPECODE]
=> Vấn đề được đặt ra ở đây là: Có Code nào nạp các ô chứa mã số đó vô
Dictionary mà không phải xài For...Next (Vì các ô chứa mã số đó không trùng với nhau nên xài For...Next chưa hiệu quả).
Mong các Anh chị và các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.
 

File đính kèm

Lần chỉnh sửa cuối:
nói không sử dụng For...Next còn viết úp lên mằn chi vậy ta
Tìm trên GPE bao la ... sử dụng thêm một Function
 
Upvote 0
Xin chào các Anh chị và các bạn GPE!
Nhờ các Anh chị và các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Tôi có một bảng tính như vầy:
...
Dọc theo cột B là các ô chứa mã số khác nhau hoàn toàn (Không có ô nào trùng với ô nào). Để nạp các ô đó vô Dictionary, tôi xài Code:
[GPECODE=vb]Sub Nap_vo_Dic()
Dim Dic As Object
Dim rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
For Each rng In Range([B3], [B65536].End(xlUp))
If Not Dic.exists(rng.Value) Then
Dic.Add rng.Value, Empty
End If
Next
MsgBox Dic.Count
End Sub[/COLOR][/GPECODE]
=> Vấn đề được đặt ra ở đây là: Có Code nào nạp các ô chứa mã số đó vô
Dictionary mà không phải xài For...Next (Vì các ô chứa mã số đó không trùng với nhau nên xài For...Next chưa hiệu quả).
Mong các Anh chị và các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.

Mình thấy cái yêu cầu này của bạn nó cứ thế nào ấy. Chẳng hiểu bạn nạp vào Dic làm gì nhỉ ?
Thế mạnh của Dic là lọc duy nhất mà dữ liệu của bạn đã là duy nhất rồi còn gì. Hay bạn muốn nạp dữ liệu vào Dic để lấy ra mảng 1 chiều từ keys ?
Nói thật chẳng hiểu bạn làm vậy để làm gì.
Mà yêu cầu của bạn chắc ko thực hiện đc vì key của Dic không nhận gía trị mảng

Để hiểu rõ hơn về Dic bạn có thể tham khảo link này:
http://www.giaiphapexcel.com/forum/showthread.php?60643-Tổng-quan-về-Scripting-Dictionary
 
Upvote 0
Mình thấy cái yêu cầu này của bạn nó cứ thế nào ấy. Chẳng hiểu bạn nạp vào Dic làm gì nhỉ ?
Thế mạnh của Dic là lọc duy nhất mà dữ liệu của bạn đã là duy nhất rồi còn gì. Hay bạn muốn nạp dữ liệu vào Dic để lấy ra mảng 1 chiều từ keys ?
Nói thật chẳng hiểu bạn làm vậy để làm gì.
Mà yêu cầu của bạn chắc ko thực hiện đc vì key của Dic không nhận gía trị mảng

Để hiểu rõ hơn về Dic bạn có thể tham khảo link này:
http://www.giaiphapexcel.com/forum/showthread.php?60643-Tổng-quan-về-Scripting-Dictionary
Đơn giản là khâu của đề tài này nằm trong đề tài lớn hơn. Tôi nạp vào Dictionary như là cột phụ rồi đem đi so với cột khác cho tiện (Để loại trừ ô trùng với cột khác, bôi màu cho ô trùng ở cột khác, Delete cả dòng ô trùng ở cột khác,...).
 
Upvote 0
Bạn đưa cái thớt đấy để làm gì nhỉ? Tôi nhìn thớt đó mà chả thấy cái nào không For...Next cả.
Xem thớt kia thấy cũng hỏi về dictionary và thớt này cũng vậy. chả biết hỏi về cái gì của dict.
Không hiểu câu hỏi "nạp các ô chứa mã số" là nạp vào cái gì của dict vậy ?
 
Upvote 0
Xem thớt kia thấy cũng hỏi về dictionary và thớt này cũng vậy. chả biết hỏi về cái gì của dict.
Không hiểu câu hỏi "nạp các ô chứa mã số" là nạp vào cái gì của dict vậy ?
Ủa, là nạp từng giá trị của từng ô như là ô B3 có giá trị là 030007, ô B4 có giá trị là 030031,... vào thư viện Dictionary.
P/s: 2 thớt tôi hỏi rõ ràng thế mà.
 
Upvote 0
Đơn giản là khâu của đề tài này nằm trong đề tài lớn hơn. Tôi nạp vào Dictionary như là cột phụ rồi đem đi so với cột khác cho tiện (Để loại trừ ô trùng với cột khác, bôi màu cho ô trùng ở cột khác, Delete cả dòng ô trùng ở cột khác,...).

À tôi hiểu rồi, vậy là bạn muốn "bê" cái Dic đó đến dự án lớn hơn bảo nó kiểm tra so sánh với dữ liệu trong dự án đó đúng không ?
Vậy thì theo tôi, bạn cứ "bê" luôn cái mảng (hay vùng) đó đến dự án lớn để so sánh thôi. Chứ nạp vào Dic chi cho mất công. Bạn có thể dùng hàm Instr hoăc application.match là kiểm tra.
 
Upvote 0
À tôi hiểu rồi, vậy là bạn muốn "bê" cái Dic đó đến dự án lớn hơn bảo nó kiểm tra so sánh với dữ liệu trong dự án đó đúng không ?
Vậy thì theo tôi, bạn cứ "bê" luôn cái mảng (hay vùng) đó đến dự án lớn để so sánh thôi. Chứ nạp vào Dic chi cho mất công. Bạn có thể dùng hàm Instr hoăc application.match là kiểm tra.
Cứ cho là vậy đi. Nhưng một bài toán có nhiều phương án giải đáp và tôi muốn học thêm phương án là nạp phần tử vào Dictionary như tiêu đề này.
 
Upvote 0
thấy xôm tham gia tí chút
thớt yêu cầu là không dùng for...next :
Mã:
Public Sub Dict()
r = 3
With CreateObject("scripting.dictionary")
Do While r <= 77
.Add Range("B" & r), ""
r = r + 1
Loop
End With
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
thấy xôm tham gia tí chút
thớt yêu cầu là không dùng for...next :
Mã:
Public Sub Dict()
r = 3
With CreateObject("scripting.dictionary")
Do While r <= 77
.Add Range("B" & r), ""
r = r + 1
Loop
End With
End Sub

Bạn làm vầy mới "xôm" hơn nè:
Mã:
.......
If Not Dic.Exists(Range("B3").Value) then Dic.Add Range("B3").Value, ""
If Not Dic.Exists(Range("B4").Value) then Dic.Add Range("B4").Value, ""
If Not Dic.Exists(Range("B5").Value) then Dic.Add Range("B5").Value, ""
........ vân vân... và mây mây...
If Not Dic.Exists(Range("Bn").Value) then Dic.Add Range("Bn").Value, ""
Hổng có vòng lập nào ráo trọi, cứ xơi từ từ rồi từ gốc cũng đi đến ngọn
Ẹc... Ẹc...
 
Upvote 0
VẬY LÀ ĐỀ TÀI CỦA TÁC GIẢ TÈO TÉO TEO--=0--=0--=0 Ta lại triều tượng thêm một cái Dic khác chăng
 
Upvote 0
Mà người ta tránh dùng đệ quy thay vòng lặp. Chỉ khi nào vòng lặp không thể giải vấn đề thì người ta mới dùng đệ quy
 
Upvote 0
[thongbao]Chỉ khi nào vòng lặp không thể giải vấn đề thì người ta mới dùng đệ quy[/thongbao]

Nguyên tắc đó được đa số người áp dụng, Nhưng sáng kiến & fát minh thường không từ đa số mà ra!
 
Upvote 0
Không có cách nào thì thôi vậy.
 
Upvote 0
Mà người ta tránh dùng đệ quy thay vòng lặp. Chỉ khi nào vòng lặp không thể giải vấn đề thì người ta mới dùng đệ quy

Không thấy tôi bôi đậm cụm từ "xài For ... Next chưa hiệu quả" hay sao?

Theo kiến thức của tôi thì "hiệu quả" là trạng thái chủ quan và tương đối. Nếu hoàn hảo mặt A thì phải hy sinh mặt B. Nếu không nêu rõ mục đích thì thầy tôi cũng không biết làm sao cho hiệu quả. Ví dụ bảo tôi ra hiệu mua chiếc xe máy. Ít nhất phải cho tôi biết bạn hay chạy trong thành phố thì tôi mua tay ga, bạn hay chạy đường trường, leo dốc thì tôi mua loại sang sô; đâu thể cả đoan rằng loại nào hiệu quả hơn loại nào được?

Thật sự tại chủ thớt lười biếng tìm, chỉ thích lập thớt hỏi cho tiện chứ chịu khó tìm thì đã thấy có nhiều bài cải tiến hiệu quả cách duyệt bằng vòng lặp. Nhất là chịu khó xem code của bạn quanghai...

Chú thích: trong tất cả các phương pháp code, đệ quy là phương pháp kém hiệu quả nhất về tốc độ. Về phương diện dễ hiểu và ngắn gọn thì tuỳ theo trình độ người code.
 
Upvote 0
Theo kiến thức của tôi thì "hiệu quả" là trạng thái chủ quan và tương đối. Nếu hoàn hảo mặt A thì phải hy sinh mặt B. Nếu không nêu rõ mục đích thì thầy tôi cũng không biết làm sao cho hiệu quả. Ví dụ bảo tôi ra hiệu mua chiếc xe máy. Ít nhất phải cho tôi biết bạn hay chạy trong thành phố thì tôi mua tay ga, bạn hay chạy đường trường, leo dốc thì tôi mua loại sang sô; đâu thể cả đoan rằng loại nào hiệu quả hơn loại nào được?
Hiệu quả ở đây là tôi muốn đề cập đến tốc độ của Code.
 
Upvote 0

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

Back
Top Bottom