Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load DateTimePicker1.MaxDate = Date.Now DateTimePicker1.MinDate = #1/1/2004# DateTimePicker2.MaxDate = Date.Now DateTimePicker2.MinDate = #1/1/2004# End Sub
Private Sub 灶具分析统计() Call killEXCEL()
Dim excelApp As New Excel.Application Dim 佳尼2004灶具生产计划 As Excel.Workbook Dim 行号 As Integer = 1 Dim 列号 As Integer = 1 Dim 办事处计划数统计 As New SortedList Dim 办事处完成数统计 As New SortedList
Dim 型号计划数统计 As New SortedList Dim 型号完成数统计 As New SortedList Dim 统计表 As Excel.Worksheet '
Try 佳尼2004灶具生产计划 = excelApp.Workbooks.Open("E:\my documents\生产计划\佳尼2004灶具生产计划.xls") 统计表 = CType(佳尼2004灶具生产计划.Worksheets("统计表"), Excel.Worksheet) 统计表.Cells(1, 3).value = DateTimePicker1.Value.ToShortDateString '统计开始日期 统计表.Cells(1, 7).value = DateTimePicker2.Value.ToShortDateString '统计结束日期 统计表.Range("c4:z6").Value = "" '先清空统计表中原来有关数据 统计表.Range("c9:z11").Value = "" '
Dim 生产计划表 As Excel.Worksheet For Each 生产计划表 In 佳尼2004灶具生产计划.Worksheets '遍历生产计划表 If Strings.Left(生产计划表.Name, 1) = "0" Or Strings.Left(生产计划表.Name, 1) = "1" Then '如果是0或1开头的表名,因生产计划表名是0或1开头 'MsgBox(生产计划表.Name) 行号 = 4 '生产计划表中生产数据从第四行开始 列号 = 14 '第14列是计划下发日期。从计划下发日期判断是否是所要数据
Dim 临时行号 As Integer = 4 '求得工作表中最后一行所在的行号,从第四行开始往下计算 While 生产计划表.Cells(临时行号, 列号).value <> Nothing 'MsgBox(生产计划表.Cells(行号, 列号).value, , 行号) 临时行号 += 1 End While 临时行号 -= 1 '得到生产计划表中,最后数据行所在的行号 ' MsgBox(临时行号)
For 行号 = 4 To 临时行号 '生产计划标准格式行号从4开始,到工作表中最后一行
If (CDate(DateTimePicker1.Value.ToShortDateString) <= CDate(生产计划表.Cells(行号, 列号).value)) And (CDate(DateTimePicker2.Value.ToShortDateString) >= CDate(生产计划表.Cells(行号, 列号).value)) Then '如果日期在规定范围内
'灶具各城市分布情况 Dim 城市 As String = 生产计划表.Cells(行号, 3).value '第3列是城市名称 Dim 计划数 As Decimal = CType(生产计划表.Cells(行号, 7).value, Decimal) '第7列是计划数 Dim 完成数 As Decimal = CType(生产计划表.Cells(行号, 11).value, Decimal) '第11列是实际完成数 Dim 未完成数 As Decimal = 0 '用Decimal是因为后面要加小数 If 完成数 < 计划数 Then '如果没有完成 未完成数 = 计划数 - 完成数 End If
If 城市 <> "" Then If InStr(城市, "沈阳") <> 0 Or InStr(城市, "鞍山") <> 0 Or InStr(城市, "哈尔滨") <> 0 Or InStr(城市, "葫芦岛") <> 0 Then If 办事处计划数统计.Contains("沈阳") Then 办事处计划数统计.Item("沈阳") += 计划数 Else 办事处计划数统计.Add("沈阳", 计划数) End If
If 办事处完成数统计.Contains("沈阳") Then 办事处完成数统计.Item("沈阳") += 未完成数 Else 办事处完成数统计.Add("沈阳", 未完成数) End If
Else If 办事处计划数统计.Contains(城市) Then 办事处计划数统计.Item(城市) += 计划数 Else 办事处计划数统计.Add(城市, 计划数) End If
If 办事处完成数统计.Contains(城市) Then 办事处完成数统计.Item(城市) += 未完成数 Else 办事处完成数统计.Add(城市, 未完成数) End If
End If Else MsgBox(生产计划表.Name & "没有城市名称", MsgBoxStyle.Critical, "生产计划中要有城市名称") excelApp.Visible = True 生产计划表.Activate() 生产计划表.Select() End If
'以下计算灶具型号分布情况 Dim 型号 As String = Strings.Left(生产计划表.Cells(行号, 2).value, 3) '灶具型号在第3列 If 型号计划数统计.Contains(型号) Then 型号计划数统计.Item(型号) += 计划数 Else 型号计划数统计.Add(型号, 计划数) End If
If 型号完成数统计.Contains(型号) Then 型号完成数统计.Item(型号) += 未完成数 Else 型号完成数统计.Add(型号, 未完成数) End If
End If Next
End If
Next
Dim 城市数 As Integer = 办事处计划数统计.Count Dim 城市数clone As Integer = 办事处计划数统计.Count
行号 = 4
'依计划数大小排序 Dim 办事处计划数统计副本 As New SortedList Dim asa As Decimal = 0.001 '加上此数是为了防止键值的重复,在工作表中可选不显示小数 Dim 办事处计划数Enum As IDictionaryEnumerator = 办事处计划数统计.GetEnumerator While 办事处计划数Enum.MoveNext 办事处计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key) asa += 0.001 End While
'这里利用SortedList自动排序的功能 Dim i As Integer = 1 For 列号 = 3 To 3 + 城市数 - 1 '从第三列开始填写数据,这是预先定义的格式 统计表.Cells(行号, 列号).value = 办事处计划数统计副本.GetByIndex(城市数clone - i) '城市 统计表.Cells(行号 + 1, 列号).value = 办事处计划数统计副本.GetKey(城市数clone - i) '计划数 统计表.Cells(行号 + 2, 列号).value = 办事处完成数统计.Item(办事处计划数统计副本 .GetByIndex(城市数clone - i)) '计划数 i += 1 Next
'以型号计划数多少排序 Dim 型号计划数统计副本 As New SortedList 办事处计划数Enum = 型号计划数统计.GetEnumerator While 办事处计划数Enum.MoveNext 型号计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key) asa += 0.001 ' MsgBox(办事处计划数Enum.Value + asa, , 办事处计划数Enum.Key) End While
Dim 型号数 As Integer = 型号计划数统计.Count Dim 型号数clone As Integer = 型号计划数统计.Count 'MsgBox(型号数) i = 1 行号 = 9 For 列号 = 3 To 3 + 型号数 - 1 统计表.Cells(行号, 列号).value = 型号计划数统计副本.GetByIndex(型号数clone - i) '灶具型号 统计表.Cells(行号 + 1, 列号).value = 型号计划数统计副本.GetKey(型号数clone - i) '计划数 统计表.Cells(行号 + 2, 列号).value = 型号完成数统计.Item(型号计划数统计副本 .GetByIndex(型号数clone - i)) i += 1 Next
' Dim WSf As Excel.WorksheetFunction = excelApp.WorksheetFunction excelApp.Visible = True '显示工作簿 统计表.Select() '选择工作表 统计表.Activate() '激活工作表
Catch ex As Exception '捕捉错误
办事处计划数统计 = Nothing 办事处完成数统计 = Nothing 型号计划数统计 = Nothing 型号完成数统计 = Nothing 统计表 = Nothing 佳尼2004灶具生产计划 = Nothing excelApp = Nothing GC.Collect(0) MsgBox(ex.ToString, MsgBoxStyle.Critical, "出现错误了") Finally 办事处计划数统计 = Nothing 办事处完成数统计 = Nothing 型号计划数统计 = Nothing 型号完成数统计 = Nothing 统计表 = Nothing 佳尼2004灶具生产计划 = Nothing excelApp = Nothing GC.Collect(0) End Try MsgBox("已经统计好了,请查看", MsgBoxStyle.DefaultButton1, "灶具生产计划统计") '如果完成就 提示 End Sub
|