Hướng dẫn phần II
Select Case MenuLevel
Case 1 ' A Menu
' Add the top-level shortcut menu to the Cell CommandBar
' Menu cap mot
Set ToolbarMenuControl = Application.CommandBars(ToolBarMenuName). Controls.Add(Type:=msoControlPopup)
ToolbarMenuControl.Caption = Caption
Case 2 ' A Menu Item
If NextLevel = 3 Then
Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlPopup)
Else
Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlButton)
MenuItem.OnAction = PositionOrMacro
End If
MenuItem.Caption = Caption
If FaceId <> "" Then MenuItem.FaceId = FaceId
If Divider Then MenuItem.BeginGroup = True
Case 3 ' A SubMenu Item
Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
SubMenuItem.Caption = Caption
SubMenuItem.OnAction = PositionOrMacro
If FaceId <> "" Then SubMenuItem.FaceId = FaceId
If Divider Then SubMenuItem.BeginGroup = True
End Select
Row = Row + 1
Loop
ToolBarMenu.Visible = True
End If
End Sub
Public Const TenMenuSheet = "Menu"
' Ten sheet chua du lieu de tao Menu
Public Const ToolBarMenuName = "Raw Material Warehouse"
' Ten cua ToolBar Menu
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' TAO VA DELETE MENU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub DeleteMenuAll(Optional DeleteMenuBar As Boolean, Optional DeleteShortcutMenu As Boolean, Optional DeleteToolBarMenu As Boolean)
' Thu tuc nay nen duoc thuc hien khi Workbook duoc dong
' This sub should be executed when the workbook is closed
' Deletes the Menus
''''''''''''''''''''''''''''''''''''''''''''''''''
' Khai bao bien cho CreateMenuBar
Dim MenuSheet As Worksheet
Dim CB As CommandBar
Dim Row As Integer
Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId
''''''''''''''''''''''''''''''''''''''''''''''''''
' Kiem tra ActiveWorkbook truoc khi thuc hien
If ActiveWorkbook.Name <> TenWB Then
Exit Sub
End If
' Assign default value if the argument is missing
' Dua cac gia tri mac dinh vao neu cac doi so khong dua vao
If IsMissing(DeleteMenuBar) Then DeleteMenuBar = False
If IsMissing(DeleteShortcutMenu) Then DeleteShortcutMenu = False
If IsMissing(DeleteToolBarMenu) Then DeleteToolBarMenu = False
' Delete Menu
If DeleteMenuBar = True Then
On Error Resume Next
Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
Row = 2
Do Until IsEmpty(MenuSheet.Cells(Row, 1))
If MenuSheet.Cells(Row, 1) = 1 Then
Caption = MenuSheet.Cells(Row, 2)
Application.CommandBars(1).Controls(Caption).Delete
End If
Row = Row + 1
Loop
On Error GoTo 0
End If
' Delete Shortcut Menu
If DeleteShortcutMenu = True Then
On Error Resume Next
Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
Row = 2
Do Until IsEmpty(MenuSheet.Cells(Row, 1))
If MenuSheet.Cells(Row, 1) = 1 Then
Caption = MenuSheet.Cells(Row, 2)
Application.CommandBars("Cell").Controls(Caption).Delete
End If
Row = Row + 1
Loop
On Error GoTo 0
End If
' Delete ToolbarMenu
If DeleteToolBarMenu = True Then
On Error Resume Next
For Each CB In CommandBars
If mb.Name = ToolBarMenuName Then
CommandBars(ToolBarMenuName).Delete
End If
Next
On Error GoTo 0
End If
End Sub
Ở sheet VatTu, ở ô C3 ta dùng validation nhằm cho người sử dụng chọn các thao tác. Các thao tác gồm : nhập, xuất và cập nhật công thức. Dữ liệu validation được lấy ở sheet Dulieu vùng E2:E4 (Tên ThaoTac). Nếu ở ô này là Nhap thì bạn chỉ nhập được dữ liệu ở cột nhập, tương tự đối với Xuat hay CapNhat. Ở ô E3, để bạn chọn ngày nhập hay xuất dữ liệu. Ta cũng dùng validation để giúp người nhập liệu chọn ngày. Dựa vào dữ liệu ở 2 ô này và biến cố Change của sheet DuLieu mà kiểm tra việc người nhập liệu đúng cột hay không.
Private Sub Worksheet_Change(ByVal Target As Range)
' Thu tuc nay nham tranh cho nguoi nhap lieu sai
Dim bThaoTac As String, bNgay As Integer
Dim bHangHienTai As Long, bCotHienTai As Integer
Dim bCotTon As Integer, bCotNhap As Integer, bCotXuat As Integer
Dim BTuaDeThongBao As String
Dim bThongBao As String
Dim bTam
Static bThucHien As Boolean
BTuaDeThongBao = Sheets("DuLieu").Cells(2, 1)
bThongBao = Sheets("DuLieu").Cells(3, 8)
bThaoTac = ActiveSheet.Cells(3, 3)
bNgay = ActiveSheet.Cells(3, 5)
bHangHienTai = Target.Row
bCotHienTai = Target.Column
bCotNhap = (bNgay - 1) * 3 + 8: bCotXuat = (bNgay - 1) * 3 + 9: bCotTon = (bNgay - 1) * 3 + 10
Select Case bThaoTac
Case "Nhap"
If bCotHienTai <> bCotNhap And bThucHien = False And bCotHienTai > 7 Then
bTam = ThongBaoNguoiDung(BTuaDeThongBao, bThongBao, True)
Application.SendKeys ("%eu")
bThucHien = True
Exit Sub
Else
bThucHien = False
End If
Case "Xuat"
If bCotHienTai <> bCotXuat And bThucHien = False And bCotHienTai > 7 Then
bTam = ThongBaoNguoiDung(BTuaDeThongBao, bThongBao, True)
Application.SendKeys ("%eu")
bThucHien = True
Exit Sub
Else
bThucHien = False
End If
Case "CapNhatCT"
Exit Sub
End Select
End Sub
Một chú ý quan trọng là khối dữ liệu bạn nhập vào trong sheet DuLieu, được đặt tên là VatTu. Địa chỉ của VatTu là: =VatTu!$A$5:$CV$125. Khi bạn thêm vào một mã vật tư bằng cách Inser row, thì khối dữ liệu của bạn sẽ tự động lớn ra. Đây cũng là một cách thuận lợi của việc đặt tên khối dữ liệu! Khi bạn thêm vào một mã vật tư mới bạn sẽ chọn CapNhat, sau đó chọn Cập nhật công thức trong Menu (Các lọai Menu, bạn để ý trên Menu File, Edit, View...hay bạn Click chuột phải trên bất kỳ ô này trên sheet, hay Menu trên Toolbar cũng được...tiện lợi !!!)
Ở ô G2, sẽ có công thức như sau =IF(D2+E2-F2=SUM(G6:G125),SUM(G6:G125),"Lỗi") để kiểm tra việc nhập dữ liệu nhập xuất có đúng hay không! Nếu ô này có giá trị là Lỗi, thì bạn phải xem lại.
Sau khi bạn nhập dữ liệu nhập, xuất trong ngày thì bạn có thể chọn trên Menu: Báo cáo xuất, Báo cáo nhập và nhập vào ngày bạn muốn tạo báo cáo, thế là xong. Cuối tháng bạn lại chọn Báo cáo tháng.
Ngoài ra chương trình còn giúp bạn In tồn kho, In thẻ kho. Các bạn có thể phát triển thêm. Xin các bạn xem đọan mã của 2 form: frmPrinting, frmStockView.
Ngòai ra còn có nhiều đọan mã trong các module mà các bạn có thể sử dụng cho công việc của các bạn.
Khi qua một tháng khác, các bạn phải rất cẩn thận, các bạn làm theo các bước sau:
_Lưu file và đặt với tên khác nhằm tránh tình trạng nếu lỡ bạn thao tác sai thì còn có thể phục hồi lại được.
_Copy dữ liệu ở cột tồn cuối kỳ đưa qua tồn đầu kỳ.
_Xóa dữ liệu nhập vào của các ngày trong tháng.
_Đổi giá trị của ngày đầu tháng mới ở ô H3. Ví dụ: 1/12/2004. Các cột sau sẽ tự động cập nhật.
_Đặt ô C3 có giá trị CapNhat.
_Lưu lại (SaveAs) tập tin với tên của tập tin là tên để theo dõi cho tháng mới. Chú ý quan trọng, bạn phải thay đổi giá trị của hằng số Public Const TenWB As String = "RawMaterialsControl.xls" sang tên mà bạn vừa đặt tên trong module PublicConst. (Nhấn Alt + F11, bạn sẽ thấy)
_Chọn Cập nhật công thức trên Menu.
_Lưu lại một lần nữa.
Các bạn hãy từ từ thực hiện và nghiền ngẫm. Tôi đã sửa lại file xuất nhập tồn cho các bạn dễ thao tác. Tôi có thể gởi cho bạn nào file này để bạn có thể gởi cho các bạn cần? Xin cám ơn.
Mong các bạn góp ý !
Chúc các bạn thành công.
Lê Văn Duyệt