Có phương án nào thay thế, chỉnh sửa để tăng tốc đoạn code cho lịch báo giảng này (3 người xem)

  • Thread starter Thread starter caico9x
  • Ngày gửi Ngày gửi
Liên hệ QC

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

caico9x

Thành viên mới
Tham gia
28/7/13
Bài viết
48
Được thích
4
Tôi có 2 đoạn code này dùng để ghép môn, ghép lớp trong Lịch báo giảng, nhưng nó chạy quá chậm, kính mong các bác giúp đỡ
Mã:
Mã:
Public Function GetMon(t As Integer, d As Date, n As Integer, tkb As Range) As String
Dim r As Range
Dim nr As Integer
Dim i As Integer
Dim st As Integer
 
    nr = 0
    For Each r In tkb.Rows
        nr = nr + 1
    Next
    i = 1
    While (tkb.Cells(i + 1, 1).Value <> vbEmpty) And (tkb.Cells(i + 1, 1).Value <= d) And (i < nr)
        i = i + 1
    Wend
    GetMon = tkb.Cells(i, (t - 2) * 10 + n * 2).Value
End Function
---------------------------------
Public Function GetLop(t As Integer, d As Date, n As Integer, tkb As Range) As String
Dim r As Range
Dim nr As Integer
Dim i As Integer
 
    nr = 0
    For Each r In tkb.Rows
        nr = nr + 1
    Next
    i = 1
    While (tkb.Cells(i + 1, 1).Value <> vbEmpty) And (tkb.Cells(i + 1, 1).Value <= d) And (i < nr)
            i = i + 1
    Wend
    GetLop = tkb.Cells(i, (t - 2) * 10 + n * 2 + 1).Value
End Function

CẢM ƠN CÁC BẠN
 
Hai hàm này sử lý trên mảng sẽ nhanh hơn nhiều so với Range. Không có dữ liệu Test nên cũng ngại dò Code e không chính xác.
 
Cảm ơn bạn tôi gửi File, mong bạngiúp

Bạn cũng hay thiệt đó: Đưa code thì không có file... sau đưa file lại không có code
Vậy ai biết bạn đã áp dụng code thế nào mà nói là CHẬM?
(Đã vậy còn khuyến mãi tên con virus trong file nữa chứ)
 
thay File lỗi, do gì đó ko biết, máy PC nay sao ko biết nữa mở excel lên là ko thấy code nào cả nhưng lại vẫn hoạt động bình thường; mang file này sang máy khác thì đọc được code; nhân đây bạn nào biết giúp tôi với
Cảm ơn các bạn, mong thông cảm
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn cũng hay thiệt đó: Đưa code thì không có file... sau đưa file lại không có code
Vậy ai biết bạn đã áp dụng code thế nào mà nói là CHẬM?
(Đã vậy còn khuyến mãi tên con virus trong file nữa chứ)
Em xin lỗi máy em bị vi rut hay sao sư phụ ah, em gửi ở bài #5
Mong các sư phụ thông cảm cho em, vội vã quá
 
Giúp em #1;#3 với các anh chị ơi, có cách nào tăng tốc không giúp em với
Em cảm ơn các anh chị
 
Việc xem Code đoán ý bạn định làm gì thật khó. Mình thấy thế này:

-Việc áp công thức trong bài mình thấy có chỗ còn sai (Circular lung tung cả)

-Trong Code có những đoạn hết sức vô duyên:
Ví dụ:

nr = 0
For Each r In cu.Rows
nr = nr + 1
Next


Sao không viết nr=cu.Rows

-Mình mới tạm nghiên cứu sửa lại hai hàm GetMon và GetLop thành FindMon và FindLop. Khi thay vào tốc độ nhanh hẳn. Code như sau:

Mã:
Public Function FindMon(t As Integer, d As Date, n As Integer, tkb As Range) As String
Dim Tm, i, j, Luu As Date
Tm = tkb
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) <= d And Tm(i, 1) > Luu Then
Luu = Tm(i, 1)
j = i
End If
Next
FindMon = Tm(j, (t - 1) * 10 - 8 + (n - 1) * 2)
End Function
'===============================================================
Public Function FindLop(t As Integer, d As Date, n As Integer, tkb As Range) As String
Dim Tm, i, j, Luu As Date
Tm = tkb
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) <= d And Tm(i, 1) > Luu Then
Luu = Tm(i, 1)
j = i
End If
Next
FindLop = Tm(j, (t - 1) * 10 - 7 + (n - 1) * 2)
End Function


Lưu ý: Code trên phần lấy kết quả còn để nguyên biểu thức để đẽ nhìn và nghiên cứu. Khi sử dụng thì rút gọn nó lại để bớt phần tính toán. Ví dụ:

FindMon = Tm(j, (t - 1) * 10 - 8 + (n - 1) * 2)

Ta rút gọn thành:

FindMon = Tm(j, 10 * t + 2 * n - 20)



Mình không rõ các hàm còn lại tính toán kiểu gì, Tiêu đề các cột viết tắt là cái gì (Mình không phải dân Giáo dục) lên không dám sửa. Nếu sửa thì mình cho rằng file không nặng đến thế khi tính toán.
 
Lần chỉnh sửa cuối:
Bài viết hay đấy, cố gắng phát huy nha chủ top, hihi
 
Việc xem Code đoán ý bạn định làm gì thật khó. Mình thấy thế này:

-Việc áp công thức trong bài mình thấy có chỗ còn sai (Circular lung tung cả)

-Trong Code có những đoạn hết sức vô duyên:
Ví dụ:

nr = 0
For Each r In cu.Rows
nr = nr + 1
Next


Sao không viết nr=cu.Rows

Chính xác là (bạn viết vội quá)
nr=cu.Rows.count

Gõ vội thôi chứ ai cũng đoán được. Một bên là Long một bên là Range.
 
Lần chỉnh sửa cuối:
Chính xác là (bạn viết vội quá)
nr=cu.Rows.count

Gõ vội thôi chứ ai cũng đoán được. Một bên là Long một bên là Range.

Anh ơi, em tranh thủ viết bài lúc 1 giờ đêm. Buồn ngủ nên không soát xét được.
 
Cảm ơn các bạn đã tham gia giúp đỡ, nhưng những thây đổi trong hai công thức trong bài #8 của Sealand có vẽ như chưa đúng kết quả hay do tôi dùng sai kết quả ah

tại shetBaogiang đặt công thức ô C5=GetMon(A6,A7,B5,Tkb!$B$4:$BJ$48)=HÓA
tại shetBaogiang đặt công thức ô C5=IF(C5="","",GetLop(A6,A7,B5,Tkb!$B$4:$BJ$48))=11A
----------
mới áp dụng Có phải sửa GetMon.........>FindMon ko ah

C5=FindMon(t As Integer, d As Date, n As Integer, tkb As Range)= lỗi
D5=FindLop(t As Integer, d As Date, n As Integer, tkb As Range)= lỗi
Hai công thức này nhằm mục đích lấy tên môn, tên lớp từ shet LBG sang sheet Bao giang
Nhờ các bạn kiểm tra giúp, cảm ơn các bạn rất nhiều

 
Lần chỉnh sửa cuối:
Hàm của tôi cũng cho kết quả như vậy, chỉ có điều tôi không làm cái việc bạn làm là dùng hàm Ucase để chuyển chữ thương sang chữ in. Cái này chỉ đúng với 1 số ký tự còn lai sai đó.
Cú pháp giữ nguyên hàm của bạn chỉ đổi tên hamf thôi
 

File đính kèm

Lần chỉnh sửa cuối:
Hàm của tôi cũng cho kết quả như vậy, chỉ có điều tôi không làm cái việc bạn làm là dùng hàm Ucase để chuyển chữ thương sang chữ in. Cái này chỉ đúng với 1 số ký tự còn lai sai đó.
Cú pháp giữ nguyên hàm của bạn chỉ đổi tên hamf thôi
Tôi test hai hàm này rồi, kết quả là như nhau, về tốc độ thì chưa thể so sánh được có thể còn nhiều hàm khác nữa nên file này chạy lề mề sốt ruột quá; rất mong các bạn chia sẽ thêm
Cảm ơn sealand nhiều lắm
 
máy tính xử lí hàng triệu tỉ phép tính/s. Nên bạn không thể thấy nó chạy nhanh hay chậm được. Mình thấy máy mình vẫn dùng bình thường. Máy mình core i5 ram 4G chạy rầm rầm.
 
Web KT

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

Back
Top Bottom