Dùng mảng có gán được cho LISTVIEW không?

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Tôi có một Form với 1 Listview, nếu gán bình thường bằng For ... Next gán trực tiếp từ Sheet lên thì đương nhiên là được. Nhưng nếu số lượng hàng từ 500 trở lên thì nó cho tốc độ khá chậm.

Được biết xử lý dữ liệu trên mảng thường rất nhanh, vậy cho hỏi ta có thể gán giá trị lên Listview từ mảng có được không và phải thực hiện như thế nào?

Xin cảm ơn.
 

File đính kèm

Tôi có một Form với 1 Listview, nếu gán bình thường bằng For ... Next gán trực tiếp từ Sheet lên thì đương nhiên là được. Nhưng nếu số lượng hàng từ 500 trở lên thì nó cho tốc độ khá chậm.

Được biết xử lý dữ liệu trên mảng thường rất nhanh, vậy cho hỏi ta có thể gán giá trị lên Listview từ mảng có được không và phải thực hiện như thế nào?

Xin cảm ơn.
Thiện xem file sau của anh Duyệt mà vận dụng. #3
http://www.giaiphapexcel.com/forum/showthread.php?50602-Chuy%E1%BB%83n-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-ADO-khi-%C4%91%C3%A3-l%E1%BB%8Dc-xong-v%C3%A0o-L%C3%ADtview&
 
Upvote 0
Tôi có một Form với 1 Listview, nếu gán bình thường bằng For ... Next gán trực tiếp từ Sheet lên thì đương nhiên là được. Nhưng nếu số lượng hàng từ 500 trở lên thì nó cho tốc độ khá chậm.

Được biết xử lý dữ liệu trên mảng thường rất nhanh, vậy cho hỏi ta có thể gán giá trị lên Listview từ mảng có được không và phải thực hiện như thế nào?

Xin cảm ơn.
Với Listview thì xin thưa rằng: KHÔNG CÓ CÁCH NÀO NẾU KHÔNG DÙNG FOR... NEXT
Dữ liệu nhiều... chậm thì.. ráng chịu vậy!
 
Upvote 0
Với Listview thì xin thưa rằng: KHÔNG CÓ CÁCH NÀO NẾU KHÔNG DÙNG FOR... NEXT
Dữ liệu nhiều... chậm thì.. ráng chịu vậy!
Gửi sư phụ NDU, toi cũng đang gặp tình huống như bạn Minhthien. Lúc dữ liệu còn ít thì không sao. Đến khi dữ liệu nhiều rồi thì người dùng kêu trời: "Mỗi lần chạy bảng (khi đó ListView dang được nạp dữ liệu), có thừa thời gian để hút thuốc và uống càfe!!!!"
Tôi chọn dùng listview vì nó cho phép chỉnh lề cho dữ liệu trên từng cột. Giờ nó chạy chậm quá nên muốn đổi không dùng listview nữa.
Nhớ dạo trước, sư phụ có giới thiệu về Sheet Object. Không biết Sheet Object có cải thiện được tốc độ nạp dữ liệu không?
Mong nhận hồi âm.
Trân trọng.
 
Upvote 0
Gửi sư phụ NDU, toi cũng đang gặp tình huống như bạn Minhthien. Lúc dữ liệu còn ít thì không sao. Đến khi dữ liệu nhiều rồi thì người dùng kêu trời: "Mỗi lần chạy bảng (khi đó ListView dang được nạp dữ liệu), có thừa thời gian để hút thuốc và uống càfe!!!!"
Tôi chọn dùng listview vì nó cho phép chỉnh lề cho dữ liệu trên từng cột. Giờ nó chạy chậm quá nên muốn đổi không dùng listview nữa.
Nhớ dạo trước, sư phụ có giới thiệu về Sheet Object. Không biết Sheet Object có cải thiện được tốc độ nạp dữ liệu không?
Mong nhận hồi âm.
Trân trọng.

Có thể ListView chỉ để gán 1 phần giá trị trong cơ sở dữ liệu thôi, nên sẽ chạy rất chậm nếu dữ liệu quá lớn. Tôi biết điều đó nên hạn chế khoảng 500 dòng mới nhất, tức là chỉ lấy 500 dòng từ dòng nhập mới nhất trở về trước, không nhập hết (như vậy cũng quá nhiều rồi).
 
Upvote 0
Gửi sư phụ NDU,
cám ơn bạn đã trả lời.
Vấn đề của tôi nằm ở chỗ: người dùng muốn load toàn bộ dữ liệu vào listview (thế mới ác), mà listview lại bị hạn chế tốc độ load dữ liệu, đã chậm rồi lại còn phải convert từ font Uni về font VNI khiến nó càng chậm hơn... Nói theo sư phụ thì "ai bảo muốn ráng chịu", chỉ có điều cũng ức lắm. Muốn dùng cái listbox cho nó nhẹ nợ, nhưng....
Về cái SpreadSheet Control, qua quá trình tìm hiểu trên điễn đàn, tôi nhận thấy sư phụ nắm rất rõ. Muốn hỏi thăm sư phụ có tài liệu gì về SpreadSheet Control cho tôi xin để tự ngâm cứu có được không? (Tiếng Anh hay tiếng Việt đều được). Hiện tại, thực sự là tôi không biết dùng SpreadSheet Control như thế nào.
Trân trọng
 
Upvote 0
Gửi sư phụ NDU,
cám ơn bạn đã trả lời.
Vấn đề của tôi nằm ở chỗ: người dùng muốn load toàn bộ dữ liệu vào listview (thế mới ác), mà listview lại bị hạn chế tốc độ load dữ liệu, đã chậm rồi lại còn phải convert từ font Uni về font VNI khiến nó càng chậm hơn... Nói theo sư phụ thì "ai bảo muốn ráng chịu", chỉ có điều cũng ức lắm. Muốn dùng cái listbox cho nó nhẹ nợ, nhưng....
Về cái SpreadSheet Control, qua quá trình tìm hiểu trên điễn đàn, tôi nhận thấy sư phụ nắm rất rõ. Muốn hỏi thăm sư phụ có tài liệu gì về SpreadSheet Control cho tôi xin để tự ngâm cứu có được không? (Tiếng Anh hay tiếng Việt đều được). Hiện tại, thực sự là tôi không biết dùng SpreadSheet Control như thế nào.
Trân trọng
Thực sự thì tôi chẳng biết gì về đối tượng SpreadSheet, còn ListView thì cũng đã thử dùng nhưng cái này có vẻ khỏ dùng, thêm nữa, nó lại có một nhược điểm mà tôi rất ghét đó là nó không hỗ trợ tiếng Việt Unicode.
Để giải quyết vấn đề này (một cách tương đối), tôi vẫn dùng đối tượng Listbox với thuộc tính ColumnHeads=True, nhưng trước đó, tôi lọc dữ liệu thỏa mãn yêu cầu qua một vùng tạm. Tiếp theo là sử dụng câu lệnh [...].CurrentRegion.EntireColumn.AutoFit để chỉnh kích thước cột trong vùng tạm này. Cuối cùng lấy kích thước các cột này nhân với một tỷ lệ thích hợp để thiết lập cho thuộc tính Listbox.ColumnWidths.
 
Upvote 0
Gửi sư phụ NDU,
cám ơn bạn đã trả lời.
Vấn đề của tôi nằm ở chỗ: người dùng muốn load toàn bộ dữ liệu vào listview (thế mới ác), mà listview lại bị hạn chế tốc độ load dữ liệu, đã chậm rồi lại còn phải convert từ font Uni về font VNI khiến nó càng chậm hơn... Nói theo sư phụ thì "ai bảo muốn ráng chịu", chỉ có điều cũng ức lắm. Muốn dùng cái listbox cho nó nhẹ nợ, nhưng....
Về cái SpreadSheet Control, qua quá trình tìm hiểu trên điễn đàn, tôi nhận thấy sư phụ nắm rất rõ. Muốn hỏi thăm sư phụ có tài liệu gì về SpreadSheet Control cho tôi xin để tự ngâm cứu có được không? (Tiếng Anh hay tiếng Việt đều được). Hiện tại, thực sự là tôi không biết dùng SpreadSheet Control như thế nào.
Trân trọng
Tài liêu tôi không có... nhưng mà thằng SpreadSheet này nó dễ như.. ăn khoai ấy mà ---> Code trên bảng tính thế nào thì trên SpreadSheet như thế ấy (cũng có Range, Row, Column.. vân vân... )
 
Upvote 0
Hỏi lại 1 chút, bạn đã thiết lập lại chế độ tính toán, cập nhật màn hình trước khi load form chưa?
Mình nghi nó còn ảnh hưởng nhiều vấn đề khác chứ chỉ load Listview với vài ngàn dòng thì không thể nói uống trà hút thuốc được.
 
Upvote 0
Hỏi lại 1 chút, bạn đã thiết lập lại chế độ tính toán, cập nhật màn hình trước khi load form chưa?
Mình nghi nó còn ảnh hưởng nhiều vấn đề khác chứ chỉ load Listview với vài ngàn dòng thì không thể nói uống trà hút thuốc được.
Mình đã kiểm chứng rồi mà. BẢng của mình có khoảng 10600 record, gồm 40 cột. Form của mình thiết kế trên excel 2003, load dữ liệu mất khoảng 12 giây. Cũng form đó, người dùng chạy trên excel 2007 thì lâu kinh khủng (10 phút!!!!)
Mình đang tìm cách sửa lại, không dùng listview mà dùng ListBox thì thời gian load dữ liệu giảm đáng kể. Cũng bảng đó chạy trên excel 2003, với ListView là 12 giây, nhưng với ListBox chỉ mất có 0,5 giây thôi.
 
Upvote 0
thanks a lot, Master NDU....
- Sau khi chạy thử ví dụ của thày NDU, tôi đã tìm thấy phần trợ giúp, bằng tiếng Anh, của SpreadSheet Control rồi. Cách làm như sau:
1. Nếu đang chạy chương trình, thì nhắp chuột phải trên Spreadsheet -> chọn mục Help
2. Nếu đang ở cửa sổ thiết kế, chọn SpreadSheet rồi bấm phím F1 cũng cho kết quả tương tự.
- So với ListView thì giao diện của SpreadSheet đẹp hơn hẳn, tuy nhiên mỗi khi thoát form có chứa SpreadSheet thì màn hình phải chờ hơi lâu. Để giải quyết vấn đề thời gian xử lý dữ liệu, tôi đành quay trở về dùng giải pháp ListBox vậy.

Rất cám ơn các sư phụ đã hỗ trợ.
Trân trọng.
 
Upvote 0
Hôm nay, xin up file của file của mình lên để cả nhà cùng xem xét.

Hiện tại, tôi dang giải quyết bằng cách chỉ định Rowsource cho Listbox từ bảng:
Mã:
    If .Cells(5, BaseCol + 11) <> "" Then   'Ngay Nhap - co so lieu
        .Range(.Cells(5, BaseCol + 1), _
        .Cells(.Cells(Rows.Count, BaseCol + 11).End(xlUp).Row, BaseCol + 26)).Name = "BangKeGo_view"
        
        Range("BangKeGo_view").Columns("H:I").NumberFormat = "#0.00000"
        Range("BangKeGo_view").Columns("J").NumberFormat = "#0.00"
        Range("BangKeGo_view").Columns("L").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("N").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("P:Q").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("S").NumberFormat = "dd/mm/yyyy"
        
        Me.LBBangKeGo.RowSource = "BangKeGo_view"
        Call SortLBBangKe(HeaderID:=3)
    End If

Nhờ các bạn chỉ cách làm với mảng để được kết quả hiển thị trên ListBox tương tự như vậy.

Trân trọng
 

File đính kèm

Upvote 0
Hôm nay, xin up file của file của mình lên để cả nhà cùng xem xét.

Hiện tại, tôi dang giải quyết bằng cách chỉ định Rowsource cho Listbox từ bảng:
Mã:
    If .Cells(5, BaseCol + 11) <> "" Then   'Ngay Nhap - co so lieu
        .Range(.Cells(5, BaseCol + 1), _
        .Cells(.Cells(Rows.Count, BaseCol + 11).End(xlUp).Row, BaseCol + 26)).Name = "BangKeGo_view"
        
        Range("BangKeGo_view").Columns("H:I").NumberFormat = "#0.00000"
        Range("BangKeGo_view").Columns("J").NumberFormat = "#0.00"
        Range("BangKeGo_view").Columns("L").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("N").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("P:Q").NumberFormat = "dd/mm/yyyy"
        Range("BangKeGo_view").Columns("S").NumberFormat = "dd/mm/yyyy"
        
        Me.LBBangKeGo.RowSource = "BangKeGo_view"
        Call SortLBBangKe(HeaderID:=3)
    End If

Nhờ các bạn chỉ cách làm với mảng để được kết quả hiển thị trên ListBox tương tự như vậy.

Trân trọng
Có thể thay đoạn trên thành:
PHP:
If .Cells(5, BaseCol + 11) <> "" Then
  With .Range(.Cells(5, BaseCol + 1), .Cells(.Cells(Rows.Count, BaseCol + 11).End(xlUp).Row, BaseCol + 26))
    .Parent.Columns("H:I").NumberFormat = "#0.00000"
    .Parent.Columns("J").NumberFormat = "#0.00"
    .Parent.Range("L:L,N:N,P:Q,S:S").NumberFormat = "dd/mm/yyyy"
    Me.LBBangKeGo.List() = .Value
  End With
  Call SortLBBangKe(HeaderID:=3)
End If
Mà nè: Nhìn cách vận hành của UserForm và code thấy phức tạp quá ---> Hay bạn mô tả vấn đề, tôi nghĩ có thể cải tiến cho form và code của bạn gọn và nhanh hơn nữa đấy
(nhìn nó rối quá)
 
Lần chỉnh sửa cuối:
Upvote 0
Mà nè: Nhìn cách vận hành của UserForm và code thấy phức tạp quá ---> Hay bạn mô tả vấn đề, tôi nghĩ có thể cải tiến cho form và code của bạn gọn và nhanh hơn nữa đấy
(nhìn nó rối quá)
Gửi bạn NDU.
Bạn trả lời nhanh thật.

Vấn đề của mình là làm tìm cách nhanh nhất, có thể, để load dữ liệu (đã lọc được) cho form.

Form này mình làm giúp cậu em đang quản lý một xưởng chế biến gỗ.

Mục đích của form là giúp cậu ta có thể nắm bắt được tình hình lưu chuyển sản phẫm gỗ trong nhà máy trong một năm. Vì vậy mới có chuyện có rất nhiều dòng có "tình trạng = Đã xuất" mà vẫn phải giữ lại

Các dự liệu hiển thị trên ListBox là kết quả lọc dự liệu bằng kỹ thuật Advanced Filter, với nhiều nhất là 9 điều kiện lọc khác nhau. Việc nhập điều kiện lọc nào là do người dùng quyết định. Mỗi khi người dùng nhập xong một điều kiện, tôi dùng sự kiện AfterUpdate() để chạy thủ tục Range2ListBox()

Thủ tục Range2ListBox() có nhiệm vụ lọc dữ liệu theo điều kiện.

Các sự kiện cboHeader..._Click() để khi người dùng kích chuột trên cboHeader sẽ Sort kết quả lọc theo cột được chọn thông qua việc chạy thủ tục SortListBox(). Việc tô màu cboHeader nhằm giúp cho người dùng biết BÀng đang được sort theo cột nào (vì quá nhiều cột nên phải dùng màu để phân biệt).

Các dòng lệnh Format là để định dạng dữ liệu sẽi hiển thị trên ListBox. (Cái này tôi đã hỏi bạn ở đây: http://www.giaiphapexcel.com/forum/showthread.php?46834-Các-câu-hỏi-về-mảng-trong-VBA-(Array)&p=357026#post357026, nhưng mới chỉ áp dụng được một kiểu định dạng cho toàn bảng. Trong khi dữ liệu ở đây gồm có Text, Date, Number; với dữ liệu kiểu số cũng có tới hai kiểu địng dạng)

Trước khi post lên, tôi đã phải dọn dẹp rất nhiều các điều khiển cũng như lược bớt các đoạn code xử lý dữ liệu theo như yêu cầu của người dùng, chỉ để lại phần code có liên quan tới các yêu cầu trên.

Vì là tự học, nên trong quá trình viết code vẫn còn nhiều thiếu sót lắm.

Chân thành cảm ơn sự giúp đỡ của các bạn.

Trân trọng.

P/S: Tôi vừ thử chạy code của Bác rồi. Nếu dùng câu lệnh Me.LBBangKeGo.List() = .Value
thì dữ liệu không thể hiện được như đã định dạng bởi các câu lệnh trược đó ???
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom