Viết code lất dữ liệu theo điều kiện

Liên hệ QC

Xuân hiếu

Thành viên thường trực
Tham gia
23/5/08
Bài viết
235
Được thích
72
Các bạn giúp viết sub lấy dữ liệu theo điều kiện trong file đính kèm với.
Xin cảm ơn
 

File đính kèm

  • HOI CODE LAY DU LIEU.rar
    780.1 KB · Đọc: 45
Các bạn giúp viết sub lấy dữ liệu theo điều kiện trong file đính kèm với.
Xin cảm ơn
Thế này chẳng hạn:
[GPECODE=vb]Sub LayDuLieu()
Dim Cll As Range, Rng As Range
Set Rng = Sheets("THCN").[Z:Z].SpecialCells(xlCellTypeFormulas, xlTextValues)
For Each Cll In Rng
If Cll.Value = "Ki" & ChrW(7875) & "m TL" Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
Next
End Sub[/GPECODE]
 
Upvote 0
Thầy Phúc xem lại hình như code chưa đúng hay sao đó.
Cảm ơn thầy Phúc nhen
Thế này chẳng hạn:
[GPECODE=vb]Sub LayDuLieu()
Dim Cll As Range, Rng As Range
Set Rng = Sheets("THCN").[Z:Z].SpecialCells(xlCellTypeFormulas, xlTextValues)
For Each Cll In Rng
If Cll.Value = "Ki" & ChrW(7875) & "m TL" Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
Next
End Sub[/GPECODE]
 
Upvote 0
Thầy Phúc xem lại hình như code chưa đúng hay sao đó.
Cảm ơn thầy Phúc nhen
Hỏi lại bạn hiền một chút: Yêu cầu là với những hàng có kết quả là "Kiểm TL" thì lấy điểm ở các cột E:p dán qua các cột AB:AM đúng không?
Nếu đúng như vậy thì code trên thỏa mãn rồi còn gì nữa. Trước khi chạy code nên xóa hết công thức của vùng AB:AM đi.
 
Upvote 0
Đúng như vây mà sao
code cũng chưa chạy thầy Phúc ơi

Hỏi lại bạn hiền một chút: Yêu cầu là với những hàng có kết quả là "Kiểm TL" thì lấy điểm ở các cột E:p dán qua các cột AB:AM đúng không?
Nếu đúng như vậy thì code trên thỏa mãn rồi còn gì nữa. Trước khi chạy code nên xóa hết công thức của vùng AB:AM đi.
 
Upvote 0
Đúng như vây mà sao
code cũng chưa chạy thầy Phúc ơi
Ngộ nhỉ, mình thấy bình thường chứ có vấn đề gì đâu.
Hiếu nhấn nút màu vàng trong file này xem sao.
Nếu file chứa dữ liệu lớn thì không nên sử dụng công thức, hãy chuyển thành code hết cho nhẹ nhàng.
 

File đính kèm

  • HOI CODE LAY DU LIEU.rar
    678.2 KB · Đọc: 31
Upvote 0
tRONG FILE MÌNH NÓ KHÔNG CHẠY GÌ CẢ MÀ FILE NHIỀU SHEET NÊN QUÁ NẶNG CHỈ CẮT 1 SHEET ĐƯA LÊN THÌ CHẠY SAO LẠ THẾ TA
Ngộ nhỉ, mình thấy bình thường chứ có vấn đề gì đâu.
Hiếu nhấn nút màu vàng trong file này xem sao.
Nếu file chứa dữ liệu lớn thì không nên sử dụng công thức, hãy chuyển thành code hết cho nhẹ nhàng.
 
Upvote 0
Sửa code lấy dữ liệu theo điều kiện

Mình đưa file này lên anh em xem code lấy dữ liệu bị gì mà không chạy. Anh em xem sửa giúp cảm ơn
 

File đính kèm

  • Copy of LAM DIEM HBT.rar
    1.8 MB · Đọc: 11
Upvote 0
Mình đưa file này lên anh em xem code lấy dữ liệu bị gì mà không chạy. Anh em xem sửa giúp cảm ơn
Chắc đã đến lúc nặng lời với bạn mới được:

(*) Bạn chú tâm vô VBA ngỏ hầu cải thiện tốc độ, mà chưa chú tâm đúng mức về kết cấu của 1 CSDL; Điều này thể hiện ở 1 số khía cạnh, từ nhỏ đến lớn như sau:

(1) Tên trang tính: Thay vì 'TTLOPHOC' như bạn, ta nên 'TTLopHoc'; Như mình thì sẽ 'CacLop' hay 'LopHoc' là được rồi

(2) Trang 'SYLL' của bạn chưa liên tục mà để trống quá nhiều dòng; Các tiêu đề trường thì lặp đi lặp lại 1 cách không cần thiết.

Quan trọng là các em HS chưa có mã duy nhất; Theo mình đây là điều bắt buộc với những CSDL nhỏ nữa kia!; Còn đây là CSDL đồ sộ; Mà hiện này trùng cả họ tên trong 1 lớp không fải là không có!
Như người đời thường nói: "Chưa thấy quan tài, chưa đổ lệ!"
Ngoài ra vì lí do gì đó, 1 vài em trong học kỳ có chuyện chuyển lớp thì bạn làm sao; Chẳng lẻ cắt dán từ 1 số trang có chứa thông tin về em HS đó từ trang này sang 1 số trang khác?

Một khi có mã duy nhất rồi, ta xài VBA hay công thức cũng vậy, thông qua mã; Không bao giờ thao tác thông qua 2 trường 'Họ' & 'Tên' như bạn đang làm!
Riêng chuyện này đã làm cho bạn tổn hao bao nhiêu là bộ nhớ rồi còn gì!
. . . . (Định viết tiếp, nhưng ngưng chờ fản hồi từ bạn lần này cái đã!. . . )
 
Upvote 0
Xin cảm ơn bạn các tiêu đề lặp đi lặp lại là do để in ra đóng tập luôn chứ thật chất nó nhiều quá nên cũng ỏi thật. Có gì bạn đóng góp thêm tôi sẽ cố gắng hoàn thiện bạn xem dùm code lấy điểm ở sheet THCN ở phần thi lại dùm mình nếu em hs nào ở cột Z MÀ Kiểm TL lại copy phần Từ cột E:p sang AB:AM
Nói thật là do làm gần xong rồi mới nghỉ tới nên không biết phải nên sắp xếp dữ liệu như thế nào cho gọn. Tuy nhiên một số sheet thì không thể thay đổi về hình thức được do phải in ra để làm sổ luôn. Các bạn nếu biết xin thỉnh giáo
xin cảm ơn các anh em trước
Chắc đã đến lúc nặng lời với bạn mới được:

(*) Bạn chú tâm vô VBA ngỏ hầu cải thiện tốc độ, mà chưa chú tâm đúng mức về kết cấu của 1 CSDL; Điều này thể hiện ở 1 số khía cạnh, từ nhỏ đến lớn như sau:

(1) Tên trang tính: Thay vì 'TTLOPHOC' như bạn, ta nên 'TTLopHoc'; Như mình thì sẽ 'CacLop' hay 'LopHoc' là được rồi

(2) Trang 'SYLL' của bạn chưa liên tục mà để trống quá nhiều dòng; Các tiêu đề trường thì lặp đi lặp lại 1 cách không cần thiết.

Quan trọng là các em HS chưa có mã duy nhất; Theo mình đây là điều bắt buộc với những CSDL nhỏ nữa kia!; Còn đây là CSDL đồ sộ; Mà hiện này trùng cả họ tên trong 1 lớp không fải là không có!
Như người đời thường nói: "Chưa thấy quan tài, chưa đổ lệ!"
Ngoài ra vì lí do gì đó, 1 vài em trong học kỳ có chuyện chuyển lớp thì bạn làm sao; Chẳng lẻ cắt dán từ 1 số trang có chứa thông tin về em HS đó từ trang này sang 1 số trang khác?

Một khi có mã duy nhất rồi, ta xài VBA hay công thức cũng vậy, thông qua mã; Không bao giờ thao tác thông qua 2 trường 'Họ' & 'Tên' như bạn đang làm!
Riêng chuyện này đã làm cho bạn tổn hao bao nhiêu là bộ nhớ rồi còn gì!
. . . . (Định viết tiếp, nhưng ngưng chờ fản hồi từ bạn lần này cái đã!. . . )
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy dữ liệu theo điều kiện

Anh em giúp mình sửa code lấy dữ liệu với
Xin cảm ơn
File trong tập tin kèm theo
 

File đính kèm

  • Copy of LAM DIEM HBT.rar
    1.8 MB · Đọc: 14
Upvote 0
Anh em giúp mình sửa code lấy dữ liệu với
Xin cảm ơn
File trong tập tin kèm theo

Code của bạn là:
Mã:
Sub LayDuLieu()
    Dim Cll As Range, Rng As Range
    Set Rng = [B][COLOR=#ff0000]Sheets("THCN").[Z:Z].SpecialCells(xlCellTypeFormulas, xlTextValues)[/COLOR][/B]
    For Each Cll In Rng
        [B][COLOR=#0000cd]If Cll.Value = "Ki" & ChrW(7875) & "m TL"[/COLOR][/B] Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
    Next
End Sub
Chỗ màu đỏ nghĩa là chọn trong cột Z những cell nào là công thức có kết quả dạng Text
Trong khi kiểm tra bằng mắt thì thấy cell Z19 là dữ liệu thô (không phải công thức) nên dù thỏa điều kiện tại dòng code màu xanh nhưng vẫn không thể lấy dữ liệu được
Để đơn giản hóa vấn đề, sửa sub của bạn thành vầy:
Mã:
Sub LayDuLieu()
    Dim Cll As Range, Rng As Range
    Set Rng = [COLOR=#ff0000][B]Sheets("THCN").[Z7:Z1000][/B][/COLOR]
    For Each Cll In Rng
        If Cll.Value = "Ki" & ChrW(7875) & "m TL" Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
    Next
End Sub
Khỏi SpecialCells gì ráo
--------------------
Lưu ý: Lần sau hỏi chỗ nào thì chỉ cần đưa dữ liệu chỗ đó thôi. Những sheet không liên quan bạn nên xóa đi cho người ta đở hoa mắt
(mở file, nhìn đám rừng đã thấy chóng mặt rồi)
 
Lần chỉnh sửa cuối:
Upvote 0
Code của bạn là:
Mã:
Sub LayDuLieu()
    Dim Cll As Range, Rng As Range
    Set Rng = [B][COLOR=#ff0000]Sheets("THCN").[Z:Z].SpecialCells(xlCellTypeFormulas, xlTextValues)[/COLOR][/B]
    For Each Cll In Rng
        [B][COLOR=#0000cd]If Cll.Value = "Ki" & ChrW(7875) & "m TL"[/COLOR][/B] Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
    Next
End Sub
Chỗ màu đỏ nghĩa là chọn trong cột Z những cell nào là công thức có kết quả dạng Text
Trong khi kiểm tra bằng mắt thì thấy cell Z19 là dữ liệu thô (không phải công thức) nên dù thỏa điều kiện tại dòng code màu xanh nhưng vẫn không thể lấy dữ liệu được
Để đơn giản hóa vấn đề, sửa sub của bạn thành vầy:
Mã:
Sub LayDuLieu()
    Dim Cll As Range, Rng As Range
    Set Rng = [COLOR=#ff0000][B]Sheets("THCN").[Z7:Z1000][/B][/COLOR]
    For Each Cll In Rng
        If Cll.Value = "Ki" & ChrW(7875) & "m TL" Then Cll.Offset(, 2).Resize(, 12).Value = Cll.Offset(, -21).Resize(, 12).Value
    Next
End Sub
Khỏi SpecialCells gì ráo
--------------------
Lưu ý: Lần sau hỏi chỗ nào thì chỉ cần đưa dữ liệu chỗ đó thôi. Những sheet không liên quan bạn nên xóa đi cho người ta đở hoa mắt
(mở file, nhìn đám rừng đã thấy chóng mặt rồi)
Code trên là của em. Lúc viết code, ý đồ của việc phang em SpecialCells này vào là để giảm bước lặp của vòng For sau đó, vì nhìn ở cột Z những vị trí đáng quan tâm đều chứa công thức (em viết cho file ở đầu topic). Em nghĩ nếu kiểm soát được dữ liệu (chỗ nào chứa công thức, chỗ nào nhập giá trị,...) thì việc dùng SpecialCells là một cách hay, nó giúp giảm đi một lượng đáng kể số bước lặp không cần thiết.
Nhân tiện, nhờ anh sửa tiêu đề topic luôn, vì nó đang sai chính tả: lất --> lấy

Gửi Xuân hiếu: Theo mình thì về lâu dài, cách làm hiện tại của Hiếu không hay, file chứa nhiều công thức và nhiều sheet như vậy sẽ dẫn đến sự nặng nề về cả kích thước file và tốc độ xử lý dữ liệu. Theo mình thì Hiếu nên bố trí lại dữ liệu, bỏ hoàn toàn công thức, nên chuyển qua dùng code, vì thực tế thì cũng chỉ đến cuối học kỳ mới cần sử dụng đến việc tính toán (nếu dùng công thức thì bất kỳ lúc nào có sự thay đổi giá trị là Excel sẽ tính lại toàn bộ, dẫn đến ì ạch). Mình thấy ý kiến của bác ChanhTQ@ rất đáng tham khảo.
Nếu là mình thì mình sẽ dùng đến ít sheet thôi:
+ 1 sheet chứa các thông tin cơ bản: Trường, lớp, năm học, môn học,...
+ 1 sheet chứa thông tin về học sinh: Lý lịch, điểm,...
+ 1 sheet chứa thông tin về giáo viên: Danh sách, lý lịch (nếu cần), phân công chuyên môn,...
+ 1 sheet chứa các biểu mẫu (chỉ là form mẫu thôi chứ không chứa dữ liệu)
+ 1 sheet tạm để chứa đủ thứ chuyện: hễ dùng đến cái gì thì copy form mẫu trên sheet kia qua rồi đổ dữ liệu vào, nếu cần thiết thì sau khi xong xuôi có thể lưu cái sheet này thành 1 file riêng để lưu trữ.
Để bữa nào rảnh, xách laptop ra quán cafe, ta đàm đạo một chút về cái vụ này nhỉ!
 
Upvote 0
Code trên là của em. Lúc viết code, ý đồ của việc phang em SpecialCells này vào là để giảm bước lặp của vòng For sau đó, vì nhìn ở cột Z những vị trí đáng quan tâm đều chứa công thức (em viết cho file ở đầu topic). Em nghĩ nếu kiểm soát được dữ liệu (chỗ nào chứa công thức, chỗ nào nhập giá trị,...) thì việc dùng SpecialCells là một cách hay, nó giúp giảm đi một lượng đáng kể số bước lặp không cần thiết.
Nhân tiện, nhờ anh sửa tiêu đề topic luôn, vì nó đang sai chính tả: lất --> lấy

Gửi Xuân hiếu: Theo mình thì về lâu dài, cách làm hiện tại của Hiếu không hay, file chứa nhiều công thức và nhiều sheet như vậy sẽ dẫn đến sự nặng nề về cả kích thước file và tốc độ xử lý dữ liệu. Theo mình thì Hiếu nên bố trí lại dữ liệu, bỏ hoàn toàn công thức, nên chuyển qua dùng code, vì thực tế thì cũng chỉ đến cuối học kỳ mới cần sử dụng đến việc tính toán (nếu dùng công thức thì bất kỳ lúc nào có sự thay đổi giá trị là Excel sẽ tính lại toàn bộ, dẫn đến ì ạch). Mình thấy ý kiến của bác ChanhTQ@ rất đáng tham khảo.
Nếu là mình thì mình sẽ dùng đến ít sheet thôi:
+ 1 sheet chứa các thông tin cơ bản: Trường, lớp, năm học, môn học,...
+ 1 sheet chứa thông tin về học sinh: Lý lịch, điểm,...
+ 1 sheet chứa thông tin về giáo viên: Danh sách, lý lịch (nếu cần), phân công chuyên môn,...
+ 1 sheet chứa các biểu mẫu (chỉ là form mẫu thôi chứ không chứa dữ liệu)
+ 1 sheet tạm để chứa đủ thứ chuyện: hễ dùng đến cái gì thì copy form mẫu trên sheet kia qua rồi đổ dữ liệu vào, nếu cần thiết thì sau khi xong xuôi có thể lưu cái sheet này thành 1 file riêng để lưu trữ.
Để bữa nào rảnh, xách laptop ra quán cafe, ta đàm đạo một chút về cái vụ này nhỉ!

OK VẬY LÚC NÀO RẢNH THÌ GẶP NHAU HEN
Cảm ơn trước nhen thầy Phúc
 
Upvote 0
Web KT
Back
Top Bottom