ztsubaki
Thành viên mới

- Tham gia
- 10/9/16
- Bài viết
- 1
- Được thích
- 1
Microsoft chỉ cung cấp mẫu lập trình để minh họa chứ không đảm bảo dưới bất kỳ hình thức nào dù có quy định rõ ràng hay ngụ ý. Điều này bao gồm nhưng không giới hạn trong các hình thức bảo hành đối với tính thương mại cũng như tính thích hợp cho một mục đích cụ thể. Bài viết này giả định rằng bạn đã quen với ngôn ngữ lập trình đang được giải thích, và công cụ được sử dụng để tạo và gỡ lỗi quy trình. Microsoft hỗ trợ các kỹ sư có thể giải thích chức năng của quy trình đặc biệt, nhưng họ sẽ không sửa đổi những mẫu này để cung cấp chức năng được bổ sung hoặc xây dựng các quy trình nhằm đáp ứng yêu cầu cụ thể của bạn.
Để tạo lịch, hãy làm theo những bước sau.
Microsoft Excel 2003
CHÚ Ý: Nếu Ruy băng dành cho Nhà phát triển không hiển thị, hãy đi tới Tuỳ chọn Excel và kích hoạt. Trong Excel 2007, bạn sẽ tìm thấy ruy băng trong menu Phổ biến còn trong Excel 2010, bạn sẽ thấy trong menu Ruy băng Tuỳ Chỉnh.
Quy trình Visual Basic Mẫu
[FONT=&]
Sub CalendarMaker()
' Không bảo vệ trang nếu có lịch trước đó để ngăn lỗi.
ActiveSheet.Protect DrawingObjects:=False, Contents:=False, _
Scenarios:=False
' Ngăn màn hình nhấp nháy trong khi vẽ lịch.
Application.ScreenUpdating = False
' Thiết lập bẫy lỗi.
On Error GoTo MyErrorTrap
' Xoá khu vực a1:g14 bao gồm bất kỳ lịch nào trước đó.
Range("a1:g14").Clear
' Sử dụng InputBox để có tháng và năm mong muốn rồi đặt biến
' MyInput.
MyInput = InputBox("Nhập Tháng và năm cho Lịch")
' Cho phép người dùng chấm dứt macro bằng Huỷ trong InputBox.
If MyInput = "" Then Exit Sub
' Nhận giá trị ngày đầu tháng đã nhập.
StartDay = DateValue(MyInput)
' Kiểm tra xem ngày có hợp lệ hay không chứ không cần kiểm tra ngày đầu tiên của tháng
' -- nếu ngày hợp lệ, đặt lại StartDay về ngày đầu tiên của tháng.
Nếu Day(StartDay) <> 1 thì
StartDay = DateValue(Month(StartDay) & "/1/" & _
Year(StartDay))
Kết thúc Nếu
' Chuẩn bị ô cho Tháng và Năm như được nêu đầy đủ.
Range("a1").NumberFormat = "mmmm yyyy"
' Căn giữa nhãn Tháng và Năm trên a1:g1 thích hợp
' kích thước, chiều cao và độ đậm.
Với Range("a1:g1")
.HorizontalAlignment = xlCenterAcrossSelection
.VerticalAlignment = xlCenter
.Font.Size = 18
.Font.Bold = True
.RowHeight = 35
Kết thúc Bằng
' Chuẩn bị a2:g2 cho nhãn ngày của tuần với căn giữa, kích thước,
' chiều cao và độ đậm.
Với Range("a2:g2")
.ColumnWidth = 11
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Orientation = xlHorizontal
.Font.Size = 12
.Font.Bold = True
.RowHeight = 20
Kết thúc Bằng
' Đặt ngày trong tuần trong a2:g2.
Range("a2") = "Sunday"
Range("b2") = "Monday"
Range("c2") = "Tuesday"
Range("d2") = "Wednesday"
Range("e2") = "Thursday"
Range("f2") = "Friday"
Range("g2") = "Saturday"
' Chuẩn bị a3:g7 cho ngày với căn trái/trên cùng, kích thước, chiều cao
' và độ đậm.
Với Range("a3:g8")
.HorizontalAlignment = xlRight
.VerticalAlignment = xlTop
.Font.Size = 18
.Font.Bold = True
.RowHeight = 21
Kết thúc Bằng
' Đặt tháng và năm đã nhập đầy đủ vào "a1".
Range("a1").Value = Application.Text(MyInput, "mmmm yyyy")
' Đặt biến và nhận ngày nào trong tuần mà tháng sẽ bắt đầu.
DayofWeek = WeekDay(StartDay)
' Đặt biến để xác định năm và tháng riêng biệt
' biến.
CurYear = Year(StartDay)
CurMonth = Month(StartDay)
' Đặt biến và tính ngày đầu tiên của tháng tiếp theo.
FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
' Đặt "1" vào vị trí ô của ngày đầu tiên được chọn
' tháng dựa trên DayofWeek.
Chọn trường hợp DayofWeek
Trường hợp 1
Range("a3").Value = 1
Trường hợp 2
Range("b3").Value = 1
Trường hợp 3
Range("c3").Value = 1
Trường hợp 4
Range("d3").Value = 1
Trường hợp 5
Range("e3").Value = 1
Trường hợp 6
Range("f3").Value = 1
Trường hợp 7
Range("g3").Value = 1
Kết thúc Chọn
' Vòng lặp thông qua dải ô a3:g8 tăng mỗi ô sau ô"1"
'.
Đối với Mỗi ô trong Range("a3:g8")
RowCell = cell.Row
ColCell = cell.Column
' Làm gì nếu "1" nằm trong cột đầu tiên.
Nếu cell.Column = 1 và cell.Row = 3 thì
' Làm gì nếu ô hiện tại không nằm trong cột đầu tiên.
ElseIf cell.Column <> 1 thì
Nếu cell.Offset(0, -1).Value >= 1 thì
cell.Value = cell.Offset(0, -1).Value + 1
' Dừng lại khi ngày cuối cùng của tháng đã
' được nhập.
Nếu cell.Value > (FinalDay - StartDay) thì
cell.Value = ""
' Thoát khỏi vòng lặp khi lịch có đúng số
' ngày được hiển thị.
Thoát cho
Kết thúc Nếu
Kết thúc Nếu
' Làm gì nếu ô hiện tại không nằm trong Hàng 3 mà nằm trong Cột 1.
ElseIf cell.Row > 3 và cell.Column = 1 thì
cell.Value = cell.Offset(-1, 6).Value + 1
' Dừng lại khi ngày cuối cùng của tháng đã được nhập.
Nếu cell.Value > (FinalDay - StartDay) thì
cell.Value = ""
' Thoát khỏi vòng lặp khi lịch có đúng số ngày
' được hiển thị.
Thoát cho
Kết thúc Nếu
Kết thúc Nếu
Tiếp theo
' Tạo ô Mục nhập, định dạng ô ở giữa, ngắt dòng và đường viền
' khoảng ngày.
Cho x = 0 đến 5
Range("A4").Offset(x * 2, 0).EntireRow.Insert
Với Range("A4:G4").Offset(x * 2, 0)
.RowHeight = 65
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlTop
.WrapText = True
.Font.Size = 10
.Font.Bold = False
' Mở khoá các ô này để có thể nhập văn bản sau sau khi
' trang được bảo vệ.
.Locked = False
Kết thúc Bằng
' Đặt đường viền xung quanh khối ngày.
Với Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlLeft)
.Weight = xlThick
.ColorIndex = xlAutomatic
Kết thúc Bằng
Với Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlRight)
.Weight = xlThick
.ColorIndex = xlAutomatic
Kết thúc Bằng
Với ("A3").Offset(x * 2, 0).Resize(2, 7).BorderAround _
Weight:=xlThick, ColorIndex:=xlAutomatic
Tiếp theo
Nếu Range("A13").Value = "" thì Range("A13").Offset(0, 0) _
.Resize(2, 8).EntireRow.Delete
' Tắt đường lưới.
ActiveWindow.DisplayGridlines = False
' Bảo vệ trang để ngăn ghi đè ngày.
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True
' Định lại kích thước cửa sổ để hiển thị tất cả lịch (có thể phải được điều chỉnh
' để cấu hình video).
ActiveWindow.WindowState = xlMaximized
ActiveWindow.ScrollRow = 1
' Cho phép màn hình vẽ lại với lịch hiển thị.
Application.ScreenUpdating = True
' Ngăn đi tới bẫy lỗi trừ khi tìm thấy lỗi bằng cách thoát ô Phụ
' ở đây.
Thoát ô Phụ
' Lỗi giúp msgbox phát hiện sự cố, cung cấp ô nhập mới,
' và tiếp tục tại nơi đã gây ra lỗi.
MyErrorTrap:
MsgBox "Có thể bạn đã không nhập Tháng và Năm đúng". _
& Chr(13) & "Viết Tháng không đúng" _
& " (hoặc sử dụng 3 chữ viết tắt)" _
& Chr(13) & "và 4 chữ số cho Năm"
MyInput = InputBox("Nhập Tháng và Năm cho Lịch")
If MyInput = "" Then Exit Sub
Tiếp tục
Chấm dứt ô phụ
[/FONT]
Bạn có thể thêm mã khác để tuỳ chỉnh lịch nhằm đáp ứng yêu cầu của mình. Chèn thêm hàng cho mục nhập trên màn hình cho mỗi ngày hoặc thay đổi kích thước màn hình để xem tất cả lịch dựa trên kích thước và độ phân giải màn hình.
Để tạo lịch, hãy làm theo những bước sau.
Microsoft Excel 2003
- Tạo sổ làm việc mới.
- Trên menu Công cụ, trỏ chuột vào Macro, sau đó bấm Visual Basic Editor.
- Trên menu Chèn, bấm Mô-đun.
- Sao chép mã Visual Basic for Applications bên dưới vào trang mô-đun.
- Trên menu Tệp, bấm "Đóng và Quay lại Microsoft Excel".
- Bấm vào tab Sheet1.
- Trên menu Công cụ, trỏ chuột vào Macro, sau đó bấm vào các Macro.
- Bấm vào CalendarMaker, và sau đó bấm vào Chạy để tạo lịch.
- Tạo sổ làm việc mới.
- Trên ruy băng dành cho Nhà phát triển, bấm Visual Basic.
- Trên menu Chèn, bấm Mô-đun.
- Sao chép mã Visual Basic for Applications bên dưới vào trang mô-đun.
- Trên menu Tệp, bấm "Đóng và Quay lại Microsoft Excel".
- Bấm vào tab Sheet1.
- Trên ruy băng dành cho Nhà phát triển, bấm vào Macro
- Bấm vào CalendarMaker, và sau đó bấm vào Chạy để tạo lịch.
CHÚ Ý: Nếu Ruy băng dành cho Nhà phát triển không hiển thị, hãy đi tới Tuỳ chọn Excel và kích hoạt. Trong Excel 2007, bạn sẽ tìm thấy ruy băng trong menu Phổ biến còn trong Excel 2010, bạn sẽ thấy trong menu Ruy băng Tuỳ Chỉnh.
Quy trình Visual Basic Mẫu
[FONT=&]
Sub CalendarMaker()
' Không bảo vệ trang nếu có lịch trước đó để ngăn lỗi.
ActiveSheet.Protect DrawingObjects:=False, Contents:=False, _
Scenarios:=False
' Ngăn màn hình nhấp nháy trong khi vẽ lịch.
Application.ScreenUpdating = False
' Thiết lập bẫy lỗi.
On Error GoTo MyErrorTrap
' Xoá khu vực a1:g14 bao gồm bất kỳ lịch nào trước đó.
Range("a1:g14").Clear
' Sử dụng InputBox để có tháng và năm mong muốn rồi đặt biến
' MyInput.
MyInput = InputBox("Nhập Tháng và năm cho Lịch")
' Cho phép người dùng chấm dứt macro bằng Huỷ trong InputBox.
If MyInput = "" Then Exit Sub
' Nhận giá trị ngày đầu tháng đã nhập.
StartDay = DateValue(MyInput)
' Kiểm tra xem ngày có hợp lệ hay không chứ không cần kiểm tra ngày đầu tiên của tháng
' -- nếu ngày hợp lệ, đặt lại StartDay về ngày đầu tiên của tháng.
Nếu Day(StartDay) <> 1 thì
StartDay = DateValue(Month(StartDay) & "/1/" & _
Year(StartDay))
Kết thúc Nếu
' Chuẩn bị ô cho Tháng và Năm như được nêu đầy đủ.
Range("a1").NumberFormat = "mmmm yyyy"
' Căn giữa nhãn Tháng và Năm trên a1:g1 thích hợp
' kích thước, chiều cao và độ đậm.
Với Range("a1:g1")
.HorizontalAlignment = xlCenterAcrossSelection
.VerticalAlignment = xlCenter
.Font.Size = 18
.Font.Bold = True
.RowHeight = 35
Kết thúc Bằng
' Chuẩn bị a2:g2 cho nhãn ngày của tuần với căn giữa, kích thước,
' chiều cao và độ đậm.
Với Range("a2:g2")
.ColumnWidth = 11
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Orientation = xlHorizontal
.Font.Size = 12
.Font.Bold = True
.RowHeight = 20
Kết thúc Bằng
' Đặt ngày trong tuần trong a2:g2.
Range("a2") = "Sunday"
Range("b2") = "Monday"
Range("c2") = "Tuesday"
Range("d2") = "Wednesday"
Range("e2") = "Thursday"
Range("f2") = "Friday"
Range("g2") = "Saturday"
' Chuẩn bị a3:g7 cho ngày với căn trái/trên cùng, kích thước, chiều cao
' và độ đậm.
Với Range("a3:g8")
.HorizontalAlignment = xlRight
.VerticalAlignment = xlTop
.Font.Size = 18
.Font.Bold = True
.RowHeight = 21
Kết thúc Bằng
' Đặt tháng và năm đã nhập đầy đủ vào "a1".
Range("a1").Value = Application.Text(MyInput, "mmmm yyyy")
' Đặt biến và nhận ngày nào trong tuần mà tháng sẽ bắt đầu.
DayofWeek = WeekDay(StartDay)
' Đặt biến để xác định năm và tháng riêng biệt
' biến.
CurYear = Year(StartDay)
CurMonth = Month(StartDay)
' Đặt biến và tính ngày đầu tiên của tháng tiếp theo.
FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
' Đặt "1" vào vị trí ô của ngày đầu tiên được chọn
' tháng dựa trên DayofWeek.
Chọn trường hợp DayofWeek
Trường hợp 1
Range("a3").Value = 1
Trường hợp 2
Range("b3").Value = 1
Trường hợp 3
Range("c3").Value = 1
Trường hợp 4
Range("d3").Value = 1
Trường hợp 5
Range("e3").Value = 1
Trường hợp 6
Range("f3").Value = 1
Trường hợp 7
Range("g3").Value = 1
Kết thúc Chọn
' Vòng lặp thông qua dải ô a3:g8 tăng mỗi ô sau ô"1"
'.
Đối với Mỗi ô trong Range("a3:g8")
RowCell = cell.Row
ColCell = cell.Column
' Làm gì nếu "1" nằm trong cột đầu tiên.
Nếu cell.Column = 1 và cell.Row = 3 thì
' Làm gì nếu ô hiện tại không nằm trong cột đầu tiên.
ElseIf cell.Column <> 1 thì
Nếu cell.Offset(0, -1).Value >= 1 thì
cell.Value = cell.Offset(0, -1).Value + 1
' Dừng lại khi ngày cuối cùng của tháng đã
' được nhập.
Nếu cell.Value > (FinalDay - StartDay) thì
cell.Value = ""
' Thoát khỏi vòng lặp khi lịch có đúng số
' ngày được hiển thị.
Thoát cho
Kết thúc Nếu
Kết thúc Nếu
' Làm gì nếu ô hiện tại không nằm trong Hàng 3 mà nằm trong Cột 1.
ElseIf cell.Row > 3 và cell.Column = 1 thì
cell.Value = cell.Offset(-1, 6).Value + 1
' Dừng lại khi ngày cuối cùng của tháng đã được nhập.
Nếu cell.Value > (FinalDay - StartDay) thì
cell.Value = ""
' Thoát khỏi vòng lặp khi lịch có đúng số ngày
' được hiển thị.
Thoát cho
Kết thúc Nếu
Kết thúc Nếu
Tiếp theo
' Tạo ô Mục nhập, định dạng ô ở giữa, ngắt dòng và đường viền
' khoảng ngày.
Cho x = 0 đến 5
Range("A4").Offset(x * 2, 0).EntireRow.Insert
Với Range("A4:G4").Offset(x * 2, 0)
.RowHeight = 65
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlTop
.WrapText = True
.Font.Size = 10
.Font.Bold = False
' Mở khoá các ô này để có thể nhập văn bản sau sau khi
' trang được bảo vệ.
.Locked = False
Kết thúc Bằng
' Đặt đường viền xung quanh khối ngày.
Với Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlLeft)
.Weight = xlThick
.ColorIndex = xlAutomatic
Kết thúc Bằng
Với Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlRight)
.Weight = xlThick
.ColorIndex = xlAutomatic
Kết thúc Bằng
Với ("A3").Offset(x * 2, 0).Resize(2, 7).BorderAround _
Weight:=xlThick, ColorIndex:=xlAutomatic
Tiếp theo
Nếu Range("A13").Value = "" thì Range("A13").Offset(0, 0) _
.Resize(2, 8).EntireRow.Delete
' Tắt đường lưới.
ActiveWindow.DisplayGridlines = False
' Bảo vệ trang để ngăn ghi đè ngày.
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True
' Định lại kích thước cửa sổ để hiển thị tất cả lịch (có thể phải được điều chỉnh
' để cấu hình video).
ActiveWindow.WindowState = xlMaximized
ActiveWindow.ScrollRow = 1
' Cho phép màn hình vẽ lại với lịch hiển thị.
Application.ScreenUpdating = True
' Ngăn đi tới bẫy lỗi trừ khi tìm thấy lỗi bằng cách thoát ô Phụ
' ở đây.
Thoát ô Phụ
' Lỗi giúp msgbox phát hiện sự cố, cung cấp ô nhập mới,
' và tiếp tục tại nơi đã gây ra lỗi.
MyErrorTrap:
MsgBox "Có thể bạn đã không nhập Tháng và Năm đúng". _
& Chr(13) & "Viết Tháng không đúng" _
& " (hoặc sử dụng 3 chữ viết tắt)" _
& Chr(13) & "và 4 chữ số cho Năm"
MyInput = InputBox("Nhập Tháng và Năm cho Lịch")
If MyInput = "" Then Exit Sub
Tiếp tục
Chấm dứt ô phụ
[/FONT]
Bạn có thể thêm mã khác để tuỳ chỉnh lịch nhằm đáp ứng yêu cầu của mình. Chèn thêm hàng cho mục nhập trên màn hình cho mỗi ngày hoặc thay đổi kích thước màn hình để xem tất cả lịch dựa trên kích thước và độ phân giải màn hình.