Tạo kế hoạch làm việc theo định kỳ

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Tôi gữi kèm theo file, các bạn mở ra và chạy file bằng cách chọn vào các ComboBox nhé...
Tôi xin trình bày nội dung cũa file như sau:
1> Có 1 khối lượng công việc cố định (nằm ở cột C) phải dc hoàn tất trong 2 tháng
2> Ngày CN đầu tiên cũa tháng lẽ luôn là ngày bắt đầu công việc đầu tiên
3> Thời gian bắt tay làm việc luôn luôn nằm ở những ngày CN
vấn đề đặt ra ở đây là trong 2 tháng có thể có 8 ngày CN hoặc 9 ngày CN... vậy phải dùng code hoặc công thức đễ chia công việc sau cho tương đối đều (có tổng cộng 62 hạng mục công việc)
Các bạn xem file, trong này tôi vừa dùng code, vừa kết hợp với công thức trong define name đễ đạt mục đích...
Vậy xin hỏi: Với cách làm việc như trong file thì có cách nào bõ luôn dc các công thức trong Define name ko? Ngoài ra còn 1 vấn đề nữa là tốc độ tính toán, tôi thấy nó ko nhanh lắm... Nhờ các bạn cải tiến dùm
ANH TUẤN
 

File đính kèm

Các cao thủ đã tham khảo qua câu hỏi tại:
http://www.giaiphapexcel.com/forum/showthread.php?t=8058
Thật ra vấn đề truy xuất phần tử thứ n cũa mãng là tôi hỏi cho vấn đề này đây! Tôi ko biết làm thế nào biến đổi giá trị số trong name thành 1 range...
Qua sự giãi thích cũa TuanVNUNI tôi đã làm dc rồi... Code sửa lại như sau:
PHP:
Sub Dinhdang()
   Dim StCol As Integer, FnCol As Integer, CHIA As Integer
   Dim iStart As Range
   Application.ScreenUpdating = False
   CHIA = Evaluate("CHIA")
   Range("Temp").ColumnWidth = 0.9
   Range("Temp").Font.Size = 6
   StCol = Range("Start").Column
   FnCol = Range("DATE").Columns.Count + 3
   Range("VUNG").ClearContents
   For i = StCol To FnCol Step 7
        Set iStart = Range("Start").Resize(CHIA, 1)
        Cells(, i).ColumnWidth = 1.86
        Cells(, i).Font.Size = 10
        iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Value = "X"
   Next
   Rows("74:84").Clear
End Sub
Xem file
Xin chân thành cãm ơn tất cả các cao thủ, đặc biệt là bạn TuanVNUNI
Mến!
ANH TUẤN
 

File đính kèm

Upvote 0
anhtuan1066 đã viết:
Các cao thủ đã tham khảo qua câu hỏi tại:
http://www.giaiphapexcel.com/forum/showthread.php?t=8058
Thật ra vấn đề truy xuất phần tử thứ n cũa mãng là tôi hỏi cho vấn đề này đây! Tôi ko biết làm thế nào biến đổi giá trị số trong name thành 1 range...
Qua sự giãi thích cũa TuanVNUNI tôi đã làm dc rồi... Code sửa lại như sau:
PHP:
Sub Dinhdang()
   Dim StCol As Integer, FnCol As Integer, CHIA As Integer
   Dim iStart As Range
   Application.ScreenUpdating = False
   CHIA = Evaluate("CHIA")
   Range("Temp").ColumnWidth = 0.9
   Range("Temp").Font.Size = 6
   StCol = Range("Start").Column
   FnCol = Range("DATE").Columns.Count + 3
   Range("VUNG").ClearContents
   For i = StCol To FnCol Step 7
        Set iStart = Range("Start").Resize(CHIA, 1)
        Cells(, i).ColumnWidth = 1.86
        Cells(, i).Font.Size = 10
        iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Value = "X"
   Next
   Rows("74:84").Clear
End Sub
Xem file
Xin chân thành cãm ơn tất cả các cao thủ, đặc biệt là bạn TuanVNUNI
Mến!
ANH TUẤN

Không hiểu nhiều về File này lắm, nhưng nhìn vào cũng thấy lắm công phu.
Tuy nhiên về phần code, bác nên cho đoạn này lên đầu các module
PHP:
Option Explicit
như vậy đảm bảo các biến luôn tường minh (phải được khai báo rõ ràng)
như vậy code mới không bị lỗi. Chạy ở máy em thấy lỗi nhiều quá.

thân!
 
Upvote 0
File này như tôi nói ở đâu bài #1, chẳng qua là sắp lịch làm việc cho 1 nhóm công việc có sẳn (tổng cộng 62 công việc tại cột C).. sao cho phải làm hết số công việc ấy trong vòng 2 tháng... Điều kiện là chỉ làm vào ngày CN...
Cứ làm thế nào chia số công việc ra cho từng tuần tương đối đều là dc... Do 2 tháng có thể có 8 tuần hoặc 9 tuần nên số công việc trong 1 tuần có thể là 8 công việc hoặc 7 công việc
Tôi làm file trên cũng tạm ổn rồi, nhưng vẩn thấy còn dở ở đoạn code cuối cùng:
Rows("74:84").Clear
Nhưng nếu ko có nó thì ký tự "X" sẽ bị "ló" ra khỏi danh sách...
Bắp có ý kiến gì hay cho vấn đề này ko?
Còn nữa... Theo như Bắp nói thì nên cho Option Explicit lên đầu module.. nhưng khi tôi cho vào như thế thì lại bị lỗi (bõ đi thì OK)... và tôi phát hiện ra rằng nếu đưa code này vào thì bắt buộc tất cã các biến phải dc định nghĩa (kể cã biến i trong vòng lập)... Có đúng thế ko?
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
File này như tôi nói ở đâu bài #1, chẳng qua là sắp lịch làm việc cho 1 nhóm công việc có sẳn (tổng cộng 62 công việc tại cột C).. sao cho phải làm hết số công việc ấy trong vòng 2 tháng... Điều kiện là chỉ làm vào ngày CN...
Cứ làm thế nào chia số công việc ra cho từng tuần tương đối đều là dc... Do 2 tháng có thể có 8 tuần hoặc 9 tuần nên số công việc trong 1 tuần có thể là 8 công việc hoặc 7 công việc
Tôi làm file trên cũng tạm ổn rồi, nhưng vẩn thấy còn dở ở đoạn code cuối cùng:
Rows("74:84").Clear
Nhưng nếu ko có nó thì ký tự "X" sẽ bị "ló" ra khỏi danh sách...
Bắp có ý kiến gì hay cho vấn đề này ko?
ANH TUẤN

Em không chạy code của bác được, bác sửa lại sau đó em sẽ kiểm tra thử.

Còn việc tham gia vào File này thì để em nghiên cứu file đã vì chưa hiểu nhiều+-+-+-+, xong rồi em sẽ tham gia cùng bác.

Thân!
 
Upvote 0
Tôi đã sửa giống như Bắp nói... Xem giúp tôi với (chỉ còn mỗi chổ Rows("74:84").Clear là thấy hơi kỳ kỳ)
ANH TUẤN
 

File đính kèm

Upvote 0
Chương trình rất hay! Em thấy tốc độ xử lý có vẻ bị chậm?
 
Upvote 0
TuanVNUNI đã viết:
Chương trình rất hay! Em thấy tốc độ xử lý có vẻ bị chậm?
Vậy phải làm sao đây? Tôi đã cải tiến rất nhiều bằng cách dùng vòng lập step 7 và xử lý định vị chính xác đến từng vị trí cần thiết, ko thừa ko thiếu.. tuy nhiên đôi lúc vẫn thấy nó chậm giống như TuanVNUNI vừa nói... ko biết phải cải tiến thế nào nữa...
Bạn gợi ý giúp tôi với!
ANH TUẤN
 
Upvote 0
Nhanh hơn, k cần xóa Rows("74:84")

anhtuan1066 đã viết:
Vậy phải làm sao đây? Tôi đã cải tiến rất nhiều bằng cách dùng vòng lập step 7 và xử lý định vị chính xác đến từng vị trí cần thiết, ko thừa ko thiếu.. tuy nhiên đôi lúc vẫn thấy nó chậm giống như TuanVNUNI vừa nói... ko biết phải cải tiến thế nào nữa...
Bạn gợi ý giúp tôi với!
ANH TUẤN
+ Nhanh hơn, k cần xóa Rows("74:84")

+ anhtuan tự so sánh nhé và -> tại sao


PHP:
Option Explicit
Sub Dinhdang()
   Dim StCol As Integer, FnCol As Integer, CHIA As Integer, i As Integer
   Dim iStart As Range, Start As Range
   Application.ScreenUpdating = False
   
   Range("VUNG").ClearContents: Range("Temp").ColumnWidth = 0.9:  Range("Temp").Font.Size = 6
   CHIA = Evaluate("CHIA")
   
   Set Start = Range("Start"): StCol = Start.Column:   FnCol = Range("DATE").Columns.Count + 3
   Set iStart = Start.Resize(CHIA, 1)
   
   For i = StCol To FnCol Step 7
        Cells(, i).ColumnWidth = 1.86
        If i + 7 > FnCol Then
                iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Resize(62 Mod CHIA, 1).Value = "X"
        Else:   iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Value = "X": End If
   Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hay nhanh hơn nữa

Hay nhanh hơn nữa, bỏ IF đi

PHP:
Option Explicit

Sub Dinhdang()
   Dim StCol As Integer, FnCol As Integer, CHIA As Integer, i As Integer
   Dim iStart As Range, Start As Range
   Application.ScreenUpdating = False
   
   Range("VUNG").ClearContents: Range("Temp").ColumnWidth = 0.9:  Range("Temp").Font.Size = 6
   CHIA = Evaluate("CHIA")
   
   Set Start = Range("Start"): StCol = Start.Column:   FnCol = Range("DATE").Columns.Count + 3
   Set iStart = Start.Resize(CHIA, 1)
   
   For i = StCol To FnCol - 7 Step 7
        Cells(, i).ColumnWidth = 1.86
        iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Value = "X"
   Next
   Cells(, i).ColumnWidth = 1.86
   iStart.Offset(((i - 4) \ 7) * CHIA, 7 * ((i - 4) \ 7)).Resize(62 Mod CHIA, 1).Value = "X"
End Sub
 
Upvote 0
Quã thật những thứ tinh tế, nhỏ nhặt phải đễ ý kỹ mới tinh chỉnh dc... Thì ra mang cái Resize ra ngoài (đở mất công mỗi lần chạy vòng lập lại phải Resize)... Có vậy mà ko nghĩ ra.. hi.. hi.. Cảm ơn Tigertiger nhiều...
Tôi vẫn còn thắc mắc ở 1 điểm: Trong khá nhiều code post lên diển đàn tôi thấy có dang:
code1...: code2...: code3...
Nó có ý nghĩa gì.. tôi thì đoán là "Làm hết cái này thì đến cái kia"... Vậy có khác gì so với cách trình bày:
Code1...
Code2...
Code3...
-----------------
Còn nữa, có 1 điểm tôi thật ko hiểu nỗi... Khi khởi động file lần đầu tiên thì code luôn chạy rất chậm (khoảng 15s cho việc chuyển đổi)... Sau đó lại bình thường... Là tại sao nhỉ? Có phải do lần đầu nó phải dò tìm và định nghĩa các range và name đã dc set ko?
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Tôi vẫn còn thắc mắc ở 1 điểm: Trong khá nhiều code post lên diển đàn tôi thấy có dang:
code1...: code2...: code3...
Nó có ý nghĩa gì.. tôi thì đoán là "Làm hết cái này thì đến cái kia"... Vậy có khác gì so với cách trình bày:
Code1...
Code2...
Code3...
-----------------
ANH TUẤN

Là như nhau anh ạ. Đó chỉ có ý nghĩa về trình bày cho dễ nhìn (ở một số trương hợp).

anhtuan1066 đã viết:
Còn nữa, có 1 điểm tôi thật ko hiểu nỗi... Khi khởi động file lần đầu tiên thì code luôn chạy rất chậm (khoảng 15s cho việc chuyển đổi)... Sau đó lại bình thường... Là tại sao nhỉ? Có phải do lần đầu nó phải dò tìm và định nghĩa các range và name đã dc set ko?

Tất cả là do Name động!!! Cái này em đã nói nhiều trên GPE nhưng mọi người lơ đi hoặc không để ý mà thôi. Name động là một trong những nguyên chính làm "phá sản" của một "Project"!
 
Lần chỉnh sửa cuối:
Upvote 0
Tuân nói là do name động? Cũng có lý.. nhưng...
Bạn xem tôi trình bày nhé: Khi tôi khởi động file lần đầu tiên, bấm vào ComboBox lần đầu tiên thì tốc độ tính toán rất chậm, nhưng bấm ComboBox từ lần 2 trờ đi thì ko việc gì... Tiếp theo nếu tôi đóng file lại (lưu hoặc ko lưu tùy ý).. nhưng ko đóng hoàn toàn cũa sổ chương trình Excel, rồi mỡ lại file lần nữa thì lại ko bị tình trạng trên...
Nói tóm lại tôi đã thử nhiều lần và nhận xét rằng file chỉ bị chậm khi:
1> Mở file lần đầu, bấm vào ComboBox lần đầu
2> Đóng hoàn toàn Excel, sau đó mỡ lại file
Ngoài các trường hợp trên thì file vẫn chạy nhanh... vậy sao nguyên nhân lại có thể là name dc nhỉ?
Tôi đang đoán mò có cái gì đó cần "gọi" lên lần đầu tiên.. Khi đã ổn định mọi chuyện thì dù có đóng file nhưng nếu cũa sổ Excel vẫn đang mỡ thì vẫn ko có chuyện gì xãy ra (vì "cái đó" đã dc "triệu" ra rồi)... Cái đó là cái gì tôi chã biết... (có khi nào là 1 thư viện gì đó cũa macro 4 ko nhỉ)
ANH TUẤN
 
Upvote 0
Gọi hàm hay chạy lệnh lần đầu tiên thường bị chậm

anhtuan1066 đã viết:
Khi tôi khởi động file lần đầu tiên, bấm vào ComboBox lần đầu tiên thì tốc độ tính toán rất chậm, nhưng bấm ComboBox từ lần 2 trờ đi thì ko việc gì... Tiếp theo nếu tôi đóng file lại (lưu hoặc ko lưu tùy ý).. nhưng ko đóng hoàn toàn cũa sổ chương trình Excel, rồi mỡ lại file lần nữa thì lại ko bị tình trạng trên...
Nói tóm lại tôi đã thử nhiều lần và nhận xét rằng file chỉ bị chậm khi:
1> Mở file lần đầu, bấm vào ComboBox lần đầu
2> Đóng hoàn toàn Excel, sau đó mỡ lại file
Tôi đang đoán mò có cái gì đó cần "gọi" lên lần đầu tiên.. Khi đã ổn định mọi chuyện thì dù có đóng file nhưng nếu cũa sổ Excel vẫn đang mỡ thì vẫn ko có chuyện gì xãy ra (vì "cái đó" đã dc "triệu" ra rồi)... Cái đó là cái gì tôi chã biết... (có khi nào là 1 thư viện gì đó cũa macro 4 ko nhỉ)
ANH TUẤN

Vâng, cái gì đã gọi ra rồi thì không gọi lại nữa và cái gì không dùng nữa thì phải giải phóng nó (Unload) như vậy ứng dụng mới tối ưu.

Nguyên lý lập trình của một ứng dụng cơ bản như thế này

Mã:
Sub RunExcelExe()

Dim ExcelIntefaceIsLoaded As Boolean
Dim ExcelFuncIsLoaded As Boolean	

Dim VBEIntefaceIsLoaded As Boolean
Dim VBAFuncIsLoaded As Boolean

Dim Quit As Boolean
	
	ExcelIntefaceIsLoaded = OpenExcelIntefaceDLL()	

	Quit = False
	
	Do While Not Quit
		If UserCallFunc Then
			If Is ExcelFunction Then	
				If Not ExcelFuncIsLoaded Then
					ExcelFuncIsLoaded = OpenExcelFuncDLL()
				End If
			Else
				If Not VBAFuncIsLoaded Then
					VBAFuncIsLoaded = OpenVBAFuncDLL()
				End If
			End If
				
		End If
		
		If UserCallVBE or ALT_F11 Then
			If Not VBEIntefaceIsLoaded Then
				VBEIntefaceIsLoaded = OpenVBEIntefaceDLL()
			End If
		End If

		...
		...
		
		If Error or UserQuit Then
			Quit = True
		End If
	Loop

End Sub


Với nguyên lý cơ bản trên mọi người sẽ hiểu tại sao gọi hàm hay chạy lệnh lần đầu tiên thường bị chậm.
 
Upvote 0
TuanVNUNI đã viết:
Vâng, cái gì đã gọi ra rồi thì không gọi lại nữa và cái gì không dùng nữa thì phải giải phóng nó (Unload) như vậy ứng dụng mới tối ưu.

Nguyên lý lập trình của một ứng dụng cơ bản như thế này
......

Với nguyên lý cơ bản trên mọi người sẽ hiểu tại sao gọi hàm hay chạy lệnh lần đầu tiên thường bị chậm.

+ Oh, sao đao to thế, ứng dụng nhỏ mà
+ đôi khi chấp nhận dao nhỏ chém nhanh 2 nhát... hic
 
Upvote 0
Web KT

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

Back
Top Bottom