Bài toán về VBA - Tự động chuyển dữ liệu (2 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

QL.GDHV2

Thành viên mới
Tham gia
8/11/24
Bài viết
2
Được thích
0
Chào các anh chị, em đang phải xây dựng file chấm điểm cho học viên, tuy nhiên có phần vướng khi làm VBA,
Tại sheet DIEM_CANHAN cần tạo VBA có thể giúp chuyển dữ liệu điểm qua Sheet DS_CHAMDIEMTUAN, tuy nhiên em chưa thạo về VBA rất mong các anh chị hỗ trợ với ạ !

Ngoài ra cách tính điểm xếp loại như em đang làm liệu có cách nào tối ưu hơn không ạ, dữ liệu của em có hơn 1k học viên khi chạy lọc bằng các hàm =SUBSTITUTE, TRIM, LEN... load bị chậm ạ !

Em xin cảm ơn !

1732264832273.png1732264858554.png
 

File đính kèm

Code anh chị đã viết đâu. Nó bị chậm là như nào?

Mình đang tự làm như này, tìm cách làm như này
Sub NhapLieu()
Dim wsDiemCaNhan As Worksheet
Dim wsDSChamDiemTuan As Worksheet
Dim lastRowDS As Long
Dim lastRowDiemCaNhan As Long
Dim i As Long
Set wsDiemCaNhan = ThisWorkbook.Sheets("DIEM_CANHAN")
Set wsDSChamDiemTuan = ThisWorkbook.Sheets("DS_CHAMDIEMTUAN")


lastRowDS = wsDSChamDiemTuan.Cells(wsDSChamDiemTuan.Rows.Count, 1).End(xlUp).Row + 1
lastRowDiemCaNhan = wsDiemCaNhan.Cells(wsDiemCaNhan.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRowDiemCaNhan
wsDSChamDiemTuan.Cells(lastRowDS, 1).Resize(, wsDiemCaNhan.Columns.Count).Value = wsDiemCaNhan.Cells(i, 1).Resize(, wsDiemCaNhan.Columns.Count).Value
lastRowDS = lastRowDS + 1
Next i

wsDiemCaNhan.Range("A2:Z" & lastRowDiemCaNhan).ClearContents

MsgBox "Đ? nh?p li?u thành công và reset d? li?u ? b?ng DIEM_CANHAN", vbInformation
End Sub
1732266884730.png

Tuy nhiên code lại ghi toàn bộ những gì trên DIEM_CANHAN sang DS_CHAMDIEMTUAN

1732266980853.png
 
Code bài này không phải là thu macro là giải quyết được vấn đề. Cấu trúc dữ liệu nó không đồng nhất giữa kết quả và nguồn

Trong sheet DS_CHAMDIEMTUAN không có hiển thị là đưa tuần nào qua. Thì khi bấm Nút Thêm mới. Tuần nào sẽ được đưa qua sheet DS_CHAMDIEMTUAN
 
Lần chỉnh sửa cuối:
Chào các anh chị, em đang phải xây dựng file chấm điểm cho học viên, tuy nhiên có phần vướng khi làm VBA,
Tại sheet DIEM_CANHAN cần tạo VBA có thể giúp chuyển dữ liệu điểm qua Sheet DS_CHAMDIEMTUAN, tuy nhiên em chưa thạo về VBA rất mong các anh chị hỗ trợ với ạ !

Ngoài ra cách tính điểm xếp loại như em đang làm liệu có cách nào tối ưu hơn không ạ, dữ liệu của em có hơn 1k học viên khi chạy lọc bằng các hàm =SUBSTITUTE, TRIM, LEN... load bị chậm ạ !

Em xin cảm ơn !

1/Sheet DIEM_CANHAN Có 5 cột tuần, Vậy khi code chạy thì điểm của cột tuần 2, tuần 3 ,... ghi vào đâu ở sheet DS_CHAMDIEMTUAN? (điểm của cột Tuần 1 đã được ghi vào Sheets DS_CHAMDIEMTUAN từ cột H đến cột V)
2/Ở sh DIEM CA NHAN có ô ghi ngày chấm, vậy ngày này chấm cho 1 tuần nào đó còn các tuần khác được chấm sẵn (chấm trước hoặc chấm sau) cho các tuần còn lại à?
Theo tôi giải pháp là ở sheet DIEM_CANHAN chỉ có 1 cột Tuần. Khi Ngày chấm (ô D2) là ngày nào thì Ô E2 thể hiện đó là tuần thứ máy của tháng đó.(=WEEKNUM(D2;1)-WEEKNUM(EOMONTH(D2;-1)-1;1)+1). Và ở sheet DS_CHAMDIEMTUAN cũng thêm 1 cột phụ (Wx) để ghi lại điểm của dòng từ Ax: Vx là điểm của tuần
Các nội dung khác đều căn cứ vào sheet DS_CHAMDIEMTUAN để Tính >
Tham khảo code sau:
Nếu trường hợp 1 mã (ô D1) mà bấm nhập nhiều lần trong cùng 1 ngày thì sao? Code đã loại trừ được trường họp đó.

Mã:
Option Explicit
Sub Nhap()
Dim i&, t&, Lr&
Dim Sh As Worksheet, Ws As Worksheet
Dim KQ()
Application.DisplayAlerts = False
Set Sh = Sheets("DIEM_CANHAN")
Set Ws = Sheets("DS_CHAMDIEMTUAN")
Sh.[D2] = Date
If Sh.[G1] = 0 Then
ReDim KQ(1 To 1, 1 To 23)
    KQ(1, 1) = Sh.Range("D" & 1)
    KQ(1, 2) = Sh.Range("D" & 3)
    KQ(1, 3) = Sh.Range("D" & 4)
    KQ(1, 4) = Sh.Range("D" & 5)
    KQ(1, 5) = Sh.Range("D" & 6)
    KQ(1, 6) = Sh.Range("D" & 7)
    KQ(1, 7) = Date
    KQ(1, 23) = Sh.Range("D" & 8)

t = 7

For i = 10 To 27

    If i >= 10 And Sh.Range("D" & i).Font.Bold = False Then
        t = t + 1
        KQ(1, t) = Sh.Range("D" & i)
    End If
Next i
    KQ(1, 22) = Sh.Range("D" & 28)
Lr = Ws.Range("A1000000").End(3).Row + 1
Ws.Range("A" & Lr).Resize(1, 23) = KQ
End If
End Sub
 
Chào các anh chị, em đang phải xây dựng file chấm điểm cho học viên, tuy nhiên có phần vướng khi làm VBA,.
. . . .
Chủ bài đăng nên lưu ý thêm về tên trang tính & tên các trường (Tiêu đề cột) dữ liệu
(1) Ví dụ không nên là DIEM_CANHAN mà nên là DiemCaNhan,
Tương tự như vậy, ta nên là DS_ChamDiemTuan thay vì như tên trang hiện tại của bạn. . .
Điều này giúp ta tránh thêm được lỗi chính tả ngớ ngẩn khi thao tác bàn fím
 
Web KT

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

Back
Top Bottom