PrivateSub CommandButton6_Click() '库存执行按钮
'删除库存数据中得空行及空列
Dim LastRow As Long, 空行 As Long
![[技术]VBA钢铁企业权威库存数据自动取数与分析报表程序分享(行数变量库存物料大类) 软件开发 [技术]VBA钢铁企业权威库存数据自动取数与分析报表程序分享(行数变量库存物料大类) 软件开发](http://riosart.com/zb_users/upload/2024/07/20240724112720172179164099433.jpeg)
Dim LastColumn As Long, 空列 As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Rows.Count
LastRow = LastRow + ActiveSheet.UsedRange.Row - 1
For 空行 = LastRow To 1 Step -1
If WorksheetFunction.CountA(Rows(空行)) = 0 Then Rows(空行).Delete
Next 空行
LastColumn = ActiveSheet.UsedRange.Columns.Count
LastColumn = LastColumn + ActiveSheet.UsedRange.Column
For 空列 = LastColumn To 1 Step -1
If WorksheetFunction.CountA(Columns(空列)) = 0 Then Columns(空列).Delete
Next 空列
'将库存数据第一行所有空格去掉!
Rows("1:1").Select
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'判断有效数据的行数及列数,并把最后一行和前两列删除!
Dim 有效行数, 有效列数
有效行数 = Sheet1.UsedRange.Rows.Count '取数据的有效行数
有效列数 = Sheet1.UsedRange.Columns.Count '取数据有效列数
Rows(有效行数).EntireRow.Delete '删除库存临时表最后行
'Rows(有效行数 - 1).EntireRow.Delete
Range("A:A,B:B").Select '删除A、B两列
Selection.Delete Shift:=xlToLeft
'将物料编码列变成文本格式
Dim 文本格式&
'文本格式 = Application.ActiveSheet.UsedRange.Rows.Count
'Rows(i).Delete
Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 2), TrailingMinusNumbers:=True
'在库存表增加3列,用存放“物料编码大类”、“计划员”、“备件类别”三列数据!
Columns("B:D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("B1").Select
ActiveCell.FormulaR1C1 = "物料编码大类"
Range("C1").Select
ActiveCell.FormulaR1C1 = "计划员"
Range("D1").Select
ActiveCell.FormulaR1C1 = "备件类别"
Range("B1:D1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("B8").Select
Columns("B:B").ColumnWidth = 6.13
Columns("C:C").ColumnWidth = 5.88
Columns("D:D").ColumnWidth = 8.13
Columns("G:G").ColumnWidth = 6.25
Columns("H:H").ColumnWidth = 5.75
Columns("D:D").ColumnWidth = 5.75
'取物料编码大类:若物料编码为10位数,则取该编码的前四位数;若物料编码13位且为开头为B0—B6位数,则取该编码的前两位数;
'若物料编码为13位数且为B999开头,则取该编码的前五位数;
有效行数 = Sheet1.UsedRange.Rows.Count
Dim 行数变量 As Long
'插入进度条
For 行数变量 = 2 To 有效行数 Step 1
DoEvents
ProgressBar1.Value = 行数变量 '进度条步行
ProgressBar1.Max = 有效行数 '进度条最大值设置
Label2.Caption = "正在进行物料大类码处理,请稍后..........."
'取物料大类码程序
If Len(Range("A" & 行数变量)) = 10 Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 4)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B0" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B1" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B2" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B3" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B4" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B5" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 2) = "B6" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 2)
ElseIf Len(Range("A" & 行数变量)) = 13 And Left(Range("A" & 行数变量), 4) = "B999" Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 6)
ElseIf Len(Range("A" & 行数变量)) = 13 Then
Range("B" & 行数变量) = Mid(Range("A" & 行数变量), 1, 3)
Else
End If
Next
'根据物料编码大类,取物料大类与计划员、备件类别对应关系
Dim e, sr, sl As Integer
With Sheets("临时表")
'sl = .Range("a65536").End(3).Row '进度条最大值设置
'插入进度条
For e = 2 To 有效行数
DoEvents
ProgressBar1.Value = e '进度条步行
ProgressBar1.Max = 有效行数 '进度条最大值设置
Label2.Caption = "正在进行物料类码与计划员、备件类别对应关系处理,请稍后....."
sr = Cells(e, 2)
Cells(e, 3) = Sheets("物料大类与计划员、备件类别关系").Cells.Find(sr, , , 1).Offset(0, 1)
Cells(e, 4) = Sheets("物料大类与计划员、备件类别关系").Cells.Find(sr, , , 2).Offset(0, 2)
Next
End With
'库存数据统计:分别为按照大类统计库存、按照计划员统计库存、按照备件类别统计库存
Dim arr, brr(1 To 10000, 1 To 5), crr(1 To 10000, 1 To 4), drr(1 To 10000, 1 To 4)
Dim i As Long, j As Long, k As Long, m As Long, n As Long, l As Long, f As Long
Dim d1, d2, d3, s1, s2
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
Set d3 = CreateObject("scripting.dictionary")
arr = Sheets("临时表").Range("a1").CurrentRegion
'插入进度条处理
Dim jdt2%
For jdt2 = 2 To 有效行数 'UBound(arr)
DoEvents
ProgressBar1.Max = 有效行数 'UBound(arr) '设置进度条控件的最大值
ProgressBar1.Value = jdt2 '进度条控件对象的当前值 '用它插入到运行程序的各处。
Label2.Caption = "正在进行库存数据统计处理,请稍后......"
Next
'统计库存数据程序
For i = 2 To UBound(arr)
If d1.exists(arr(i, 2)) Then
m = d1(arr(i, 2))
brr(m, 4) = brr(m, 4) + arr(i, 9) '8
brr(m, 5) = brr(m, 5) + arr(i, 12) '11
Else
j = j + 1
d1(arr(i, 2)) = j
brr(j, 1) = j
brr(j, 2) = arr(i, 2)
brr(j, 3) = arr(i, 3)
brr(j, 4) = arr(i, 9) '8
brr(j, 5) = arr(i, 12) '11
End If
If d2.exists(arr(i, 3)) Then
n = d2(arr(i, 3))
crr(n, 3) = crr(n, 3) + Round(arr(i, 9), 0)
crr(n, 4) = crr(n, 4) + arr(i, 12)
Else
k = k + 1
d2(arr(i, 3)) = k
crr(k, 1) = k
crr(k, 2) = arr(i, 3)
crr(k, 3) = arr(i, 9)
crr(k, 4) = arr(i, 12)
End If
If d3.exists(arr(i, 4)) Then
l = d3(arr(i, 4))
drr(l, 3) = drr(l, 3) + Round(arr(i, 9), 0)
drr(l, 4) = drr(l, 4) + arr(i, 12)
Else
f = f + 1
d3(arr(i, 4)) = f
drr(f, 1) = f
drr(f, 2) = arr(i, 4)
drr(f, 3) = arr(i, 9)
drr(f, 4) = arr(i, 12)
End If
Next
For i = 1 To j
brr(i, 5) = Round(brr(i, 5) / 10000, 2)
s1 = s1 + brr(i, 4)
s2 = s2 + brr(i, 5)
Next
brr(j + 1, 1) = "合计"
brr(j + 1, 4) = s1
brr(j + 1, 5) = s2
s1 = 0: s2 = 0
For i = 1 To k
crr(i, 4) = Round(crr(i, 4) / 10000, 2)
s1 = s1 + crr(i, 3)
s2 = s2 + crr(i, 4)
Next
crr(k + 1, 1) = "合计"
crr(k + 1, 3) = s1
crr(k + 1, 4) = s2
s1 = 0: s2 = 0
For i = 1 To f
drr(i, 4) = Round(drr(i, 4) / 10000, 2)
s1 = s1 + drr(i, 3)
s2 = s2 + drr(i, 4)
Next
drr(f + 1, 1) = "合计"
drr(f + 1, 3) = s1
drr(f + 1, 4) = s2
With Sheets("按照大类统计库存汇总表")
.Range("a3:e65536").ClearContents
.Range("a3").Resize(j + 1, 5) = brr
End With
With Sheets("按照计划员统计库存汇总表")
.Range("a3:d65536").ClearContents
.Range("a3").Resize(k + 1, 4) = crr
End With
With Sheets("按照备件类别统计库存汇总表")
.Range("a3:d65536").ClearContents
.Range("a3").Resize(f + 1, 4) = drr
End With
Label2.Caption = "库存数据统计已完成......"
有效行数 = Sheet1.UsedRange.Rows.Count
有效行数101 = Sheet2.UsedRange.Rows.Count
Label3.Caption = "本次执行的库存行数据共有" & 有效行数 - 1 & "条,库存总金额共计" & Sheets("按照大类统计库存汇总表").Cells(有效行数101, 5) & "万元,请您校验!"
MsgBox "恭喜您,库存数据统计完成"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Private Sub CommandButton6_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
CommandButton6.BackColor = &H8000000D
End Sub
Private Sub CommandButton7_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) '库存执行按钮
CommandButton7.BackColor = &H8000000D
End Sub