进销存管理系统主要包括进货、销售、库存和数据管理等模块,如下图所示:
针对上面的模块的相应功能,可以通过输入、输出用户窗体或工作表作来用户界面来实现。
功能区可以通过使用XML代码进行精细设置。
3.1 新建一个项目文件夹,可以命名为“进销存管理系统”;
3.2 将之前设计的“进销存管理.xlsm'工作表保存到项目文件夹内;
3.3 在项目文件夹内新建一个“customUI”文件夹;
3.4 在“customUI”文件夹内新建“customUI.xml'文件,内容如下:
‘↓禁止功能区“文件”中的部分菜单功能
’↓隐藏功能区9个内置选项卡
‘↓创建新选项卡
size='large' label='录入' onAction='btIN_INPUT_onAction'/>
size='large' label='报表' onAction='btIN_REPORT_onAction'/>
size='large' label='录入' onAction='btOUT_INPUT_onAction'/>
size='large' label='报表' onAction='btOUT_REPORT_onAction'/>
size='large' label='销售业绩' onAction='btOUT_RESULTS_onAction'/>
size='large' label='存货查询' onAction='btSTOCK_FIND_onAction'/>
size='large' label='存货统计' onAction='btSTOCK_SUM_onAction'/>
size='large' label='库存明细' onAction='btSTOCK_DETAILS_onAction'/>
size='large' label='商品信息' onAction='btDATA_COMM_onAction'/>
size='large' label='销售人员' onAction='btDATA_SALES_onAction'/>
3.5 将Excel工作薄变成一个压缩文件文件:将“进销存管理.xlsm'重命名为“进销存管理.xlsm.zip'即可。
3.6 添加文件夹“customUI”到压缩文件“进销存管理.xlsm.zip':拖入即可,如下图所示:
3.7 在工作簿文件与xml文件建立关系:
在压缩文件的_rels文件夹内的.rles文件中添加以下内容(添加到最后一个Relationship标记前):
Type='http://schemas.microsoft.com/office/2006/relationships/ui/extensibility' Target='customUI/customUI.xml'/>
3.8 保存并关闭.rles文件;
3.9 将压缩文件改回到工作簿:将“进销存管理.xlsm.zip'重命名为“进销存管理.xlsm'即可。
3.10 打开“进销存管理.xlsm”,即可看到如下自定义选项卡的工作界面:
2.1 按快捷键Alt+F11打开VBE环境;
2.2 增加一个标准模块:插入→模块;
2.3 定义一个全局变量:
Option Explicit
Public Const AppName As String = '进销存管理系统'
2.4 “进货”组中有两个按钮,用来操作进货录入和进化报表两个功能,具体的代码如下:
Sub btIN_INPUT_onAction(Control As IRibbonControl) '进货录入
Sheets('供货单').Select '选择'供货单'工作表
Range('b5').Select '选择B5单元格
End Sub
Sub btIN_REPORT_onAction(Control As IRibbonControl) '进货报报
Sheets('进货报表').Select '选择'进货报表'工作表
Range('C2').Select '选择C2单元格
End Sub
其它模块的按钮的代码按上述思想同样设置。
在“进货”模块,可以使用工作表“供货单”录入进货数据,录入的数据保存到“供货”工作表中。
3.1 设计“供货单”工作表
此输入界面可以是用户窗体,也可以是工作表。
3.2 设计“保存”代码
当用户输入好供货商品信息后,单击“保存”控件即可将输入的数据保存到“供货”工作表中,代码如下:
Sub 保存供货信息()
Dim x As Integer, i As Integer, j As Integer
Call 手动计算
With Sheets('供货')
.Unprotect Password:='wyg'
x = 2 '从第2行开始
'判断第2列的最后一行(即空行的上一行)
Do While Not (IsEmpty(.Cells(x, 2).Value))
x = x + 1 '在最后一行加一行即为空行
Loop
End With
With Sheets('供货单')
For i = 1 To 8
If Not IsEmpty(.Cells(5 + i, 2)) Then
Sheets('供货').Cells(x, 1) = .Cells(3, 9) '时间
Sheets('供货').Cells(x, 1).NumberFormatLocal = 'yyyy-m-d h:mm;@'
Sheets('供货').Cells(x, 11) = .Cells(3, 3) '供应商
For j = 2 To 10
Sheets('供货').Cells(x, j) = .Cells(5 + i, j)
Next j
x = x + 1
End If
Next i
'清除供货单中的数据
.Range('b6:b13') = ''
.Range('i6:i13') = ''
.Select
End With
Call 自动计算
With Sheets('供货').Range('A1').CurrentRegion
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Sheets('供货').Protect Password:='wyg'
End Sub
其它模块的保存的相应代码可以按上述思想分别设置。
当用户在功能区“进销存”选项卡的“进货”组中,单击“报表”按钮时,将显示进货报表。在该报表中由用户输入统计的起止日期,程序将按时间段统计所有进货的情况,生成进货报表。
为“生成报表”按钮指定宏,并编写宏代码如下:
Sub 进货报表()
Dim datStart As Date, datEnd As Date
If IsDate(Cells(2, 3)) Then
datStart = DateValue(Cells(2, 3))
Else
MsgBox '日期输入错误'
Exit Sub
End If
If IsDate(Cells(2, 5)) Then
datEnd = DateValue(Cells(2, 5))
Else
MsgBox '日期输入错误'
Exit Sub
End If
If datStart > datEnd Then
MsgBox '起始日期应小于或等于结束日期'
Else
生成进货报表
End If
End Sub
Sub 生成进货报表()
Dim x As Integer, j As Integer, rngTemp As Range
Dim intRow As Integer
Sheets('供货').Unprotect Password:='wyg'
Set rngTemp = Sheets('供货').Range('A2').CurrentRegion
rngTemp.Sort Key1:=Sheets('供货').Range('A2'), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal
Sheets('供货').Protect Password:='wyg'
With Sheets('进货报表')
.Activate
.Unprotect Password:='wyg'
intRow = .Range('A4').CurrentRegion.Rows.Count
.Range(.Cells(5, 1), .Cells(intRow + 4, 10)).EntireRow.Delete
.Range('A5').Select
x = 2
j = 5
Do While Not (IsEmpty(Sheets('供货').Cells(x, 2).Value))
If DateValue(Sheets('供货').Cells(x, 1)) >= DateValue(.Cells(2, 3)) And _
DateValue(Sheets('供货').Cells(x, 1)) <= datevalue(.cells(2,="" 5))="">
.Cells(j, 1).NumberFormatLocal = 'yyyy-m-d h:mm;@'
.Cells(j, 1) = Sheets('供货').Cells(x, 1) '日期
.Cells(j, 2) = Sheets('供货').Cells(x, 2) '货号
.Cells(j, 3) = Sheets('供货').Cells(x, 3) '名称
.Cells(j, 4) = Sheets('供货').Cells(x, 4) '型号
.Cells(j, 5) = Sheets('供货').Cells(x, 5) '产地
.Cells(j, 6) = Sheets('供货').Cells(x, 9) '数量
.Cells(j, 7).NumberFormatLocal = '#,##0.00_ '
.Cells(j, 7) = Sheets('供货').Cells(x, 6) '进价
.Cells(j, 8).NumberFormatLocal = '#,##0.00_ '
.Cells(j, 8) = .Cells(j, 6) * .Cells(j, 7) '金额
.Cells(j, 9).NumberFormatLocal = '#,##0.00_ '
.Cells(j, 9) = Sheets('供货').Cells(j, 7) '批发价
.Cells(j, 10).NumberFormatLocal = '#,##0.00_ '
.Cells(j, 10) = Sheets('供货').Cells(j, 8) '零售价
j = j + 1
End If
x = x + 1
Loop
.Cells(j, 1) = '合计'
.Cells(j, 8).NumberFormatLocal = '#,##0.00_ '
.Cells(j, 8).FormulaR1C1 = '=SUM(R[' & 5 - j & ']C:R[-1]C)'
.Range(.Cells(5, 1), .Cells(j, 10)).Select
设置边框
' .Select
.Range('A5').Select
.Protect Password:='wyg'
End With
End Sub
其它模块的报表的相应代码可以按上述思想分别设置。
-End-
联系客服