Nhờ giúp đỡ lọc và copy dữ liệu theo ý muốn (1 người xem)

Liên hệ QC

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

hancock88

Thành viên mới
Tham gia
3/6/11
Bài viết
6
Được thích
0
Em vừa tập viết VBA gặp vấn đề mới nhờ các huynh giúp đỡ, cũng coi như là học thêm 1 kiến thức. Vấn đề của em như sau:
- Có 1 bảng dữ liệu bao gồm ,mã tỉnh và chỉ tiêu gián đoạn thông tin của tỉnh đó (chuyên môn- tạm gọi là cell*h như file đính kèm). Em muốn lọc ra 3 tỉnh có cell*h cao nhất và cả các nguyên nhân gây ra cell*h cao( đã có sẵn) copy ra ngoài một ô khác (như file đính kèm-ô "K1"). Sau đó có mình sẽ tiến hành lọc từng tỉnh 1 sắp xếp theo thứ tự cell*h của các nguyên nhân từ cao xuống thấp (mục đích chọn ra 2 nguyên nhân gây ra gián đoạn cao nhất). Làm theo thứ tự từ tỉnh 1 đến tỉnh thứ 3, cứ mỗi tỉnh sau khi lọc là copy ra một ô khác gồm nguyên nhân đi kèm (như file đính kèm, copy từng tỉnh ra các ô K12,P12,S12). Mục đích em copy ra là để cố định ô đó nhằm link với công thức ở 1 sheet khác
- Em có thể dùng chức năng ghi Macro để thực hiện việc này đơn giản nhưng em muốn hỏi các huynh có hàm lặp nào để thực hiện việc này sao cho chuyên nghiệp hơn ko? Em muốn học thêm về vấn đề này. Em cảm ơn!
 

File đính kèm

Em vừa tập viết VBA gặp vấn đề mới nhờ các huynh giúp đỡ, cũng coi như là học thêm 1 kiến thức. Vấn đề của em như sau:
- Có 1 bảng dữ liệu bao gồm ,mã tỉnh và chỉ tiêu gián đoạn thông tin của tỉnh đó (chuyên môn- tạm gọi là cell*h như file đính kèm). Em muốn lọc ra 3 tỉnh có cell*h cao nhất và cả các nguyên nhân gây ra cell*h cao( đã có sẵn) copy ra ngoài một ô khác (như file đính kèm-ô "K1"). Sau đó có mình sẽ tiến hành lọc từng tỉnh 1 sắp xếp theo thứ tự cell*h của các nguyên nhân từ cao xuống thấp (mục đích chọn ra 2 nguyên nhân gây ra gián đoạn cao nhất). Làm theo thứ tự từ tỉnh 1 đến tỉnh thứ 3, cứ mỗi tỉnh sau khi lọc là copy ra một ô khác gồm nguyên nhân đi kèm (như file đính kèm, copy từng tỉnh ra các ô K12,P12,S12). Mục đích em copy ra là để cố định ô đó nhằm link với công thức ở 1 sheet khác
- Em có thể dùng chức năng ghi Macro để thực hiện việc này đơn giản nhưng em muốn hỏi các huynh có hàm lặp nào để thực hiện việc này sao cho chuyên nghiệp hơn ko? Em muốn học thêm về vấn đề này. Em cảm ơn!

bạn nên share thêm file mà bạn đã "dùng chức năng ghi Macro" để cho mọi người "tham khảo" luôn nhé :-=!
 
Upvote 0
Tối ưu code file ghi

Em post file ghi macro mình đã thực hiện. Mong các huynh tối ưu lại code theo hàm lặp để học hỏi thêm. Em cảm ơn ạ!
 

File đính kèm

Upvote 0
Em xin phép hỏi thêm một vấn đề nữa nhờ các huynh bày cách viết code cho hợp lý. Cụ thể là:
Em có một danh sách các sự kiện có ngày tháng cụ thể, em muốn chon ra các sự kiện diện ra trong "ngày hiện tại - 1" và copy các dòng có sự kiện xảy ra trong ngày ấy qua 1 sheet khác. Mong nhận được sự tận tình giúp đỡ của các thành viên khác ạ
 
Upvote 0
1./ Yêu cầu của bài #4 cần đưa file lên mới sớm có câu trả lời.

2./ Bạn xem trong file của mình & đối chiếu lại của bạn; Chú í mình có sửa thiết kế bảng lại 1 chút. Chạy macro bằng tổ hợp fím {CTRL}+{SHIFT}+G

3./ File của mình lấy về xử & khi lưu nó cảnh báo cái chi ấy, mình cũng chưa rõ!
Bạn nào ngang qua đây xem giúp hộ xem có cái gì mà khi lưu file nó cảnh báo làm vậy?



Rất cảm ơn!
 

File đính kèm

Upvote 0
Em cảm ơn anh. Nhưng anh có thể cho em thêm thông tin trong đoạn code đang chay không ạ? Em hỉu sơ về ý anh viết đoạn code nhưng để hiểu chi tiết thêm thì em vẫn chưa rõ. Trên tinh thần học hỏi anh có thể cho em biết nguồn tham khảo để hiều được đoạn code một cách tường minh và cũng để áp dụng dễ dàng cho những lần sau không ạ. Em cảm ơn!
 
Upvote 0
1./ Yêu cầu của bài #4 cần đưa file lên mới sớm có câu trả lời.

2./ Bạn xem trong file của mình & đối chiếu lại của bạn; Chú í mình có sửa thiết kế bảng lại 1 chút. Chạy macro bằng tổ hợp fím {CTRL}+{SHIFT}+G

3./ File của mình lấy về xử & khi lưu nó cảnh báo cái chi ấy, mình cũng chưa rõ!
Bạn nào ngang qua đây xem giúp hộ xem có cái gì mà khi lưu file nó cảnh báo làm vậy?



Rất cảm ơn!

Về yều cầu #4 em gửi form mẫu. Yêu cầu của em đơn giản chỉ là viết 1 marcro chọn ra các sự kiện xảy ra trong ngày hiện tại (today).Sau đó lọc lấy 3 sự kiện có thời gian GDTT (cell*h)>=30 cell*h . Chọn các thông tin sự kiện ấy có trong bảng để copy vào sheet 1.Nếu không có điều kiện nào thoả mãn như vậy sẽ báo rằng không có sự kiện nào nổi bật trong ngày tại ô A1 (sheet 1)
Ví dụ: Ngày chạy báo cáo của em là ngày 24. macro sẽ hiểu chỉ chọn các sự kiện ngày 24 ra để báo cáo, sau đó lọc xếp cell*h theo thứ tự từ trên xuống dưới sau đó chon ra 3 sự có có cell*h cao nhất >= 30 cell*h. trong ví dụ không có sự kiện nào xảy ra ngày 24 thoả mãn điều kiện nên ô A1 (sheet 1) xuất hiện thông báo "Không có sự kiện nào nổi bật trong ngày"

P/s: Do excel có chức năng lọc theo ngày today nên sử dụng chức năng ghi và kèm theo hàm điều kiện if em cũng đã viết được một đoạn code chạy được nhưng code của em dài và nhiều thao tác, nhờ các huynh cho hướng giải khác và có chú thích tường minh hơn để em tìm hỉu thêm về ý tưởng người viết. Em xin cảm ơn!
 

File đính kèm

Upvote 0
PHP:
Option Explicit
Dim Rng As Range
Sub gpeGhi()
 [k1].Resize(30).Interior.ColorIndex = 2
 [A1].Resize(, 6).Interior.ColorIndex = 2:                  Randomize
 [A1].Offset(, 6 * Rnd() \ 1).Interior.ColorIndex = 34 + 9 * Rnd \ 1
1 Set Rng = [A2].CurrentRegion
    gpeSort [h2]
3 Range("A1:F4").Copy
 Range("K1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True
5 Application.CutCopyMode = False
 Set Rng = [K2].CurrentRegion
7    gpeSort [L2]
 [k1].Resize(6, 2).Copy Destination:=[K9]
9    gpeSort [M2]
 [k1].Resize(6).Copy Destination:=[k16]
11 [L16].Resize(6).Value = [M1].Resize(6).Value
    gpeSort [n2]
13 [k1].Resize(6).Copy Destination:=[k23]
 [L23].Resize(6).Value = [n1].Resize(6).Value
15 Set Rng = Nothing:                                         [k1].Select
End Sub
Mã:
[B]Sub gpeSort(cRit As Range)
[/B] Rng.Sort Key1:=cRit, Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
[B]End Sub[/B]

Trước tiên fải nói rằng ở đây có 2 macro, 1 cái là cha & 1 cái là con;
Hơn nữa giữa chúng có liên lạc với nhau bằng biến Rng khai báo dùng chung.
Trước D1 là 3 dòng lệnh fù fím dùng để tô màu lòe loẹt chơi thôi; không quan trọng & đáng quan tâm sau
D1: Gán vùng dữ liệu xung quanh ô [A1] vô biến này
D2: Gọi chương trình con (CTc) & truyền cho hắn 1 tham biến là [H2]

CTc chỉ là 1 dòng lệnh (lặp đi lặp lại) với tham biến khác nhau được truyền cho khi chương trình cha ới gọi.
Dòng lệnh này có nghĩa là tiến hành sắp xếp vùng chứa trong biến Rng dùng chung theo trường/cột mà chương trình cha đã truyền cho (đó là ô được truyền trong tham biến)
(Cụ thể lần gọi đầu là sắp xếp giảm dần theo cột [H])

D3: Copy 3 dòng dữ liệu lớn nhất sang bảng mới. . .
D4: Tiến hành dán chuyển vị bảng này lên [K1] (góc trên trái nhất)
D5: Tắc chức năng cắt-dán
D6: Gán vùng dữ liệu xung quanh [K2] vô biến dùng chung.
(để hiểu thế nào là vùng dữ liệu xung quanh 1 ô hay 1 vùng ô nào đó, bạn nên tìm dọc fương thức này trên diễn đàn)
D7: Gọi CTc & truyền cho nó tham biến khác trước
D8: Tiến hành copy vùng cần thiết để tạo bảng mới; Đó là bảng có chứa số liệu lớn nhất.

Quá trình xếp lại dữ liệu & copy tạo bảng mới này được lặp 3 lần theo iêu cầu của tác giả.
(Quá trình kết thúc ở dòng lệnh D14)
D15: Vì là biến dùng chung nên ta cần "gỡ bỏ" nó để thu hồi tài nguyên.

Những mong đã giúp được bạn ít nhiều!
 
Upvote 0
Mình cảm ơn bạn đã giải thích từng dòng lệnh 1 trong đoạn code, nó giúp mình biết thêm cách viết mới cho đoạn code mình đang dùng chức năng ghi.
Nhưng điều mình thắc mắc chính trong đoạn code của anh ChánhTQ viết là đoạn lệnh sort xếp thứ tự từ lớn đến bé bên dưới. Bạn có thể cho mình biết nguồn để tham khảo cú pháp và các lựa chọn, ý nghĩa bên trong đoạn code để áp dụng sort cho các trường hợp khác được không vậy. Mình cảm ơn!
 
Upvote 0
[thongbao] Bạn có thể cho mình biết nguồn để tham khảo cú pháp và các lựa chọn, ý nghĩa bên trong đoạn code để áp dụng sort cho các trường hợp khác được không vậy. Mình cảm ơn! [/thongbao]
Nguồn ở ngay sẵn bên cạnh bạn chứ đâu!; Này nha:
Bạn lấy ngay file của bạn, Mở bộ thu macro lên & tiến hành sắp xếp không fải 1 mà là 3 tiêu chí khác nhau như [Truyền dẫn] tăng dần; [Tổng Cell] giảm dần & cuối cùng là [Cơ điện] (tùy chọn tăng hay giảm dần do bạn)
Sau đó tắc bộ thu đi & soi rọi lại các câu lệnh thu được với cú fáp đã đăng lên xem chúng khác nhau những gì.
. . . . . Chịu khó đi bạn & ắc thành công to lớn nay mai!
 
Upvote 0
Mình cảm ơn bạn đã giải thích từng dòng lệnh 1 trong đoạn code, nó giúp mình biết thêm cách viết mới cho đoạn code mình đang dùng chức năng ghi.
Nhưng điều mình thắc mắc chính trong đoạn code của anh ChánhTQ viết là đoạn lệnh sort xếp thứ tự từ lớn đến bé bên dưới. Bạn có thể cho mình biết nguồn để tham khảo cú pháp và các lựa chọn, ý nghĩa bên trong đoạn code để áp dụng sort cho các trường hợp khác được không vậy. Mình cảm ơn!

Phải đọc help thôi bạn ạ. Tôi chưa từng gặp ai viết code mà không phải đọc tài liệu cả.

Tất nhiên bạn có thể record macro nhưng không hẳn là cứ record macro rồi nghiên cứu thì sẽ biết tùy cơ ứng biến. Lắm lúc cũng biết là "cái này" nó có nghĩa "thế này" nhưng muốn tùy biến cho nó giá trị khác thì không biết phải cho giá trị nào. Có những thuộc tính có thể lấy hàng mấy chục giá trị, làm sao bạn biết là những giá trị thế nào?

Hơn thế nữa nếu tôi không lầm thì bạn có thể record 100 lần sort thì bạn vẫn mù tịt về cách sort trong

Mã:
Rng.Sort Key1:=cRit, Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

Mù tịt thì làm sao tùy biến được? Mà tùy biến thế nào?

Vì code ở trên là gọi phương thức SORT của đối tượng RANGE. Còn code có từ record macro là thiết lập các thuộc tính của đối tượng Worksheet.SORT, và gọi phương thức Apply của đối tượng đó.

Ngoài ra còn có thể dùng google tìm đọc trên mạng.
-------------
Alt + F11 --> F2 (menu View --> Object Browser)

View attachment 122246

View attachment 122247
 
Upvote 0

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

Back
Top Bottom