Thế này chẳng hạn: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]
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 dán qua các cột AB:AM đúng không?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 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.
Ngộ nhỉ, mình thấy bình thường chứ có vấn đề gì đâu.Đú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.
Chắc đã đến lúc nặng lời với bạn mới được: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 đã!. . . )
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
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
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
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.Code của bạn là:
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 TextMã: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
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:
Khỏi SpecialCells gì ráoMã: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
--------------------
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ỉ!
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2