VBA运行报错,大佬帮忙看一下

Sub dqysjSub()

Dim i, j, k, arr, flg, arrG2(), arrG3()

With Application.FileDialog(msoFileDialogFilePicker)

.Title = "请选择Leadtime、到店清单、工单明细源数据!" '选择窗口的标题

.InitialFileName = ThisWorkbook.Path '初次打开窗口的路径以及默认名称

.AllowMultiSelect = True '是否允许选择多个文件

.Filters.Clear '清除现有规则

.Filters.Add "EXCEL File", "*.xlsx; *.xls; *.xlsm", 1 '增加规则到第一位

If .Show Then '显示文件选择对话框

.ButtonName = "Select Me"

Set ipath = .SelectedItems '获取选择项,无论是否选择一项还是多项,返回的选项都是多项

End If

End With

If IsEmpty(ipath) Then Exit Sub '如果按取消键,退出

If ipath.Count <> 3 Then

MsgBox "请选择3个文件!" '对话框

Exit Sub

End If

arr = Array("Leadtime", "到店清单", "工单明细")

flg = Array(0, 0, 0)

For i = 1 To 3

'获取文件名

Filename = Split(ipath(i), "\")(UBound(Split(ipath(i), "\"))) '数组的最后一个元素为文件名(含后缀名)

If InStr(Filename, arr(0)) <> 0 Then

flg(0) = i

ElseIf InStr(Filename, arr(1)) <> 0 Then

flg(1) = i

ElseIf InStr(Filename, arr(2)) <> 0 Then

flg(2) = i

End If

Next

If flg(0) + flg(1) + flg(2) <> 6 Then

MsgBox "选择3个文件不是Leadtime、到店清单、工单明细源数据!" '对话框

Exit Sub

End If

'获取文件顺序

For i = 0 To 2

If InStr(Split(ipath(1), "\")(UBound(Split(ipath(1), "\"))), arr(i)) <> 0 Then

flg(i) = 1

ElseIf InStr(Split(ipath(2), "\")(UBound(Split(ipath(2), "\"))), arr(i)) <> 0 Then

flg(i) = 2

ElseIf InStr(Split(ipath(3), "\")(UBound(Split(ipath(3), "\"))), arr(i)) <> 0 Then

flg(i) = 3

End If

Next

On Error GoTo Erra

Set wL = Workbooks.Open(ipath(flg(0)))

Set wD = Workbooks.Open(ipath(flg(1)))

Set wG = Workbooks.Open(ipath(flg(2)))

On Error GoTo 0

'读取数据

'Leadtime

arrL = wL.Sheets(1).Range("a1:bd" & wL.Sheets(1).Range("a65536").End(xlUp).Row)

'到店清单

arrD = wD.Sheets(1).Range("a1:ax" & wD.Sheets(1).Range("a65536").End(xlUp).Row)

'工单明细

arrG = wG.Sheets(1).Range("a1:bq" & wG.Sheets(1).Range("a65536").End(xlUp).Row)

'关闭原始数据

wL.Close False '不保存

wD.Close False '不保存

wG.Close False '不保存

'计算数据

'arrD

'表头

arrD(1, 48) = "预约时段"

arrD(1, 49) = "到店时间差"

arrD(1, 50) = "客户等待分钟"

'内容

For j = 2 To UBound(arrD, 1)

If arrD(j, 17) <> "" Then

arrD(j, 17) = TimeValue(arrD(j, 17))

Select Case Hour(arrD(j, 17))

Case Is <= 8

arrD(j, 48) = "8-9WIP"

Case 9

arrD(j, 48) = "9-10WIP"

Case 10

arrD(j, 48) = "10-11WIP"

Case 11

arrD(j, 48) = "11-12WIP"

Case 12

arrD(j, 48) = "12-13WIP"

Case 13

arrD(j, 48) = "13-14WIP"

Case 14

arrD(j, 48) = "14-15WIP"

Case 15

arrD(j, 48) = "15-16WIP"

Case 16

arrD(j, 48) = "16-17WIP"

Case Else

arrD(j, 48) = "17-18WIP"

End Select

arrD(j, 19) = TimeValue(arrD(j, 19))

arrD(j, 49) = DateDiff("n", arrD(j, 17), arrD(j, 19))

End If

If arrD(j, 28) <> "" Then

arrD(j, 50) = (Val(Left(arrD(j, 28), 2)) * 60 * 60 + Val(Mid(arrD(j, 28), 4, 2)) * 60 + Val(Right(arrD(j, 28), 2))) / 60

End If

Next

'arrG

'提取SRP工时代码,维修类型,班组信息

arrDMCJY = ThisWorkbook.Sheets("SRP工时代码").Range("A1").CurrentRegion

arrDMSRP = ThisWorkbook.Sheets("SRP工时代码").Range("D1").CurrentRegion

arrWXLX = ThisWorkbook.Sheets("维修类型").Range("A1").CurrentRegion

arrBZXX = ThisWorkbook.Sheets("技师数据明细").Range("B1").CurrentRegion

'转字典

Set dicDMCJY = CreateObject("scripting.dictionary")

Set dicDMSRP = CreateObject("scripting.dictionary")

Set dicWXLX = CreateObject("scripting.dictionary")

Set dicBZXX = CreateObject("scripting.dictionary")

For j = 2 To UBound(arrDMCJY, 1)

If Not dicDMCJY.Exists(arrDMCJY(j, 1)) Then

dicDMCJY(arrDMCJY(j, 1)) = arrDMCJY(j, 2)

End If

Next j

For j = 2 To UBound(arrDMSRP, 1)

If Not dicDMSRP.Exists(arrDMSRP(j, 1)) Then

dicDMSRP(arrDMSRP(j, 1)) = arrDMSRP(j, 2)

End If

Next j

For j = 2 To UBound(arrWXLX, 1)

If Not dicWXLX.Exists(arrWXLX(j, 1)) Then

dicWXLX(arrWXLX(j, 1)) = arrWXLX(j, 2)

End If

Next j

For j = 2 To UBound(arrBZXX, 1)

If Not dicBZXX.Exists(arrBZXX(j, 1)) Then

dicBZXX(arrBZXX(j, 1)) = arrBZXX(j, 2)

End If

Next j

'表头

arrG(1, 65) = "纯机油"

arrG(1, 66) = "纯SRP"

arrG(1, 67) = "纯机电"

arrG(1, 68) = "PDI"

arrG(1, 69) = "班组"

NarrG2 = 0

'提取符合要求的数据加行号

For i = 2 To UBound(arrG, 1)

If arrG(i, 19) = "工时" And arrG(i, 34) <> "D-删除" And arrG(i, 39) <> "W 保修" And arrG(i, 39) <> "K Local BSI" Then

NarrG2 = NarrG2 + 1

ReDim Preserve arrG2(2, NarrG2 - 1)

arrG2(0, NarrG2 - 1) = i

arrG2(1, NarrG2 - 1) = arrG(i, 3)

arrG2(2, NarrG2 - 1) = arrG(i, 22)

End If

Next

'所有不重复单号,,首行

Set dicGDSH = CreateObject("scripting.dictionary")

For i = 0 To UBound(arrG2, 2)

If Not dicGDSH.Exists(arrG2(1, i)) Then

dicGDSH(arrG2(1, i)) = arrG2(0, i)

End If

Next

arrdicGDSHkeys = dicGDSH.Keys '所有不重复单号

For i = 0 To UBound(arrdicGDSHkeys)

''判断纯SRP

flg = 1

flgVHC = 0

For j = 0 To UBound(arrG2, 2)

If arrdicGDSHkeys(i) = arrG2(1, j) Then '单号相同

If Not dicDMSRP.Exists(arrG2(2, j)) Then

flg = 0

End If

If arrG2(2, j) <> "VHC" Then

flgVHC = 1

End If

End If

Next

If flg = 1 And flgVHC = 1 Then

arrG(dicGDSH(arrdicGDSHkeys(i)), 66) = 1

End If

'判断存机油

flg = 1

flgVHC = 0

For j = 0 To UBound(arrG2, 2)

If arrdicGDSHkeys(i) = arrG2(1, j) Then '单号相同

If Not dicDMCJY.Exists(arrG2(2, j)) Then

flg = 0

End If

If arrG2(2, j) <> "VHC" Then

flgVHC = 1

End If

End If

Next

If flg = 1 And flgVHC = 1 Then

arrG(dicGDSH(arrdicGDSHkeys(i)), 65) = 1

arrG(dicGDSH(arrdicGDSHkeys(i)), 66) = ""

End If

Next

'内容-存机电

NarrG3 = 0

'提取符合要求的数据加行号

For i = 2 To UBound(arrG, 1)

If arrG(i, 19) = "工时" And arrG(i, 34) <> "D-删除" Then

NarrG3 = NarrG3 + 1

ReDim Preserve arrG3(2, NarrG3 - 1)

arrG3(0, NarrG3 - 1) = i

arrG3(1, NarrG3 - 1) = arrG(i, 3)

arrG3(2, NarrG3 - 1) = arrG(i, 12)

End If

Next

'所有不重复单号,,首行

Set dicGDSH3 = CreateObject("scripting.dictionary")

For i = 0 To UBound(arrG3, 2)

If Not dicGDSH3.Exists(arrG3(1, i)) Then

dicGDSH3(arrG3(1, i)) = arrG3(0, i)

End If

Next

arrdicGDSHkeys3 = dicGDSH3.Keys '所有不重复单号

For i = 0 To UBound(arrdicGDSHkeys3)

''判断纯SRP

flgJD = 1

flgPDI = 1

For j = 0 To UBound(arrG3, 2)

If arrdicGDSHkeys3(i) = arrG3(1, j) Then '单号相同

If dicWXLX.Exists(arrG3(2, j)) Then

If dicWXLX(arrG3(2, j)) <> "机电" Then

flgJD = 0

End If

If dicWXLX(arrG3(2, j)) <> "PDI" Then

flgPDI = 0

End If

End If

End If

Next

If flgJD = 1 Then

arrG(dicGDSH3(arrdicGDSHkeys3(i)), 67) = 1

End If

If flgPDI = 1 Then

arrG(dicGDSH3(arrdicGDSHkeys3(i)), 68) = 1

End If

Next

'内容-班组

For i = 2 To UBound(arrG, 1)

If arrG(i, 25) <> "" Then

If dicBZXX.Exists(arrG(i, 25)) Then

arrG(i, 69) = dicBZXX(arrG(i, 25))

End If

End If

'工单明细工项代码转字符串

arrG(i, 22) = "'" & arrG(i, 22)

Next

'leadtime-源数据:从AN列开始,都是刷新以后计算的结果,并且带出列名

arrL(1, 40) = "当天结算" 'AN

arrL(1, 41) = "进厂时段" 'AO

arrL(1, 42) = "结账时段" 'AP

arrL(1, 43) = "纯机油" 'Aq-at

arrL(1, 44) = "纯SRP"

arrL(1, 45) = "纯机电"

arrL(1, 46) = "PDI"

arrL(1, 47) = "纯机油58min"

arrL(1, 48) = "服务时长"

arrL(1, 49) = "进厂-开工"

arrL(1, 50) = "开工-完工"

arrL(1, 51) = "完工-结算"

arrL(1, 52) = "wip重复标记"

arrL(1, 53) = "班组"

arrL(1, 54) = "进厂-开工"

arrL(1, 55) = "完工-出厂"

arrL(1, 56) = "当日调度出厂"

For i = 2 To UBound(arrL, 1)

'AN

If arrL(i, 14) = arrL(i, 32) Then

arrL(i, 40) = 1

End If

'AO

If arrL(i, 15) <> "" Then

arrL(i, 15) = TimeValue(arrL(i, 15))

Select Case Hour(arrL(i, 15))

Case Is <= 8

arrL(i, 41) = "8-9WIP"

Case 9

arrL(i, 41) = "9-10WIP"

Case 10

arrL(i, 41) = "10-11WIP"

Case 11

arrL(i, 41) = "11-12WIP"

Case 12

arrL(i, 41) = "12-13WIP"

Case 13

arrL(i, 41) = "13-14WIP"

Case 14

arrL(i, 41) = "14-15WIP"

Case 15

arrL(i, 41) = "15-16WIP"

Case 16

arrL(i, 41) = "16-17WIP"

Case Else

arrL(i, 41) = "17-18WIP"

End Select

End If

'AP

If arrL(i, 33) <> "" Then

arrL(i, 33) = TimeValue(arrL(i, 33))

Select Case Hour(arrL(i, 33))

Case Is <= 8

arrL(i, 42) = "8-9WIP"

Case 9

arrL(i, 42) = "9-10WIP"

Case 10

arrL(i, 42) = "10-11WIP"

Case 11

arrL(i, 42) = "11-12WIP"

Case 12

arrL(i, 42) = "12-13WIP"

Case 13

arrL(i, 42) = "13-14WIP"

Case 14

arrL(i, 42) = "14-15WIP"

Case 15

arrL(i, 42) = "15-16WIP"

Case 16

arrL(i, 42) = "16-17WIP"

Case Else

arrL(i, 42) = "17-18WIP"

End Select

End If

'AQ-at

For j = 2 To UBound(arrG, 1)

If arrL(i, 2) = arrG(j, 3) Then

If arrG(j, 65) = 1 Then

arrL(i, 43) = 1

End If

If arrG(j, 66) = 1 Then

arrL(i, 44) = 1

End If

If arrG(j, 67) = 1 Then

arrL(i, 45) = 1

End If

If arrG(j, 68) = 1 Then

arrL(i, 46) = 1

End If

End If

Next

'AV

If arrL(i, 32) <> "" Then

arrL(i, 32) = CDate(arrL(i, 32)) 'AF

End If

If arrL(i, 33) <> "" Then

arrL(i, 33) = TimeValue(arrL(i, 33)) 'AG

End If

If arrL(i, 14) <> "" Then

arrL(i, 14) = CDate(arrL(i, 14)) 'N

End If

If arrL(i, 15) <> "" Then

arrL(i, 15) = TimeValue(arrL(i, 15)) 'O

End If

If arrL(i, 32) <> "" And arrL(i, 33) <> "" And arrL(i, 14) <> "" And arrL(i, 15) <> "" Then

arrL(i, 48) = DateDiff("s", arrL(i, 14) + arrL(i, 15), arrL(i, 32) + arrL(i, 33))

End If

'AU

If arrL(i, 43) = 1 And arrL(i, 48) < 3480 Then

arrL(i, 47) = 1

End If

'AW

If arrL(i, 17) <> "" And arrL(i, 18) <> "" And arrL(i, 14) <> "" And arrL(i, 15) <> "" Then 'Q-R

arrL(i, 17) = CDate(arrL(i, 17)) 'Q

arrL(i, 18) = TimeValue(arrL(i, 18)) 'R

arrL(i, 49) = DateDiff("s", arrL(i, 14) + arrL(i, 15), arrL(i, 17) + arrL(i, 18))

End If

'AX

If arrL(i, 17) <> "" And arrL(i, 18) <> "" And arrL(i, 19) <> "" And arrL(i, 20) <> "" Then 'Q-R S-T

arrL(i, 17) = CDate(arrL(i, 17)) 'Q

arrL(i, 18) = TimeValue(arrL(i, 18)) 'R

arrL(i, 19) = CDate(arrL(i, 19)) 'S

arrL(i, 20) = TimeValue(arrL(i, 20)) 'T

arrL(i, 50) = DateDiff("s", arrL(i, 17) + arrL(i, 18), arrL(i, 19) + arrL(i, 20))

End If

'AY

If arrL(i, 19) <> "" And arrL(i, 20) <> "" And arrL(i, 32) <> "" And arrL(i, 33) <> "" Then 'S-T

arrL(i, 19) = CDate(arrL(i, 19)) 'S

arrL(i, 20) = TimeValue(arrL(i, 20)) 'T

arrL(i, 51) = DateDiff("s", arrL(i, 19) + arrL(i, 20), arrL(i, 32) + arrL(i, 33))

End If

'az

WIP = 0

For j = i To 2 Step -1

If arrL(i, 2) = arrL(j, 2) Then

WIP = WIP + 1

End If

Next j

arrL(i, 52) = WIP

'技师1-5转班组

Set dicJs = CreateObject("scripting.dictionary")

For j = 2 To UBound(arrG, 1)

If arrL(i, 2) = arrG(j, 3) And arrG(j, 19) = "工时" Then

If Not dicJs.Exists(arrG(j, 25)) Then

dicJs(arrG(j, 25)) = ""

End If

End If

Next j

arrJS = dicJs.Keys

For j = 0 To UBound(arrJS)

If dicBZXX.Exists(arrJS(j)) Then

arrJS(j) = dicBZXX(arrJS(j))

End If

Next j

arrL(i, 53) = Join(arrJS, "_")

'BB列54:列名:进厂-开工:(Q+R)-(N+O)上述几列要是空值或零都不要计算,以秒为单位

If arrL(i, 18) <> "" And arrL(i, 17) <> "" And arrL(i, 14) <> "" And arrL(i, 15) <> "" Then '(Q+R)-(N+O)

arrL(i, 18) = TimeValue(arrL(i, 18))

arrL(i, 17) = CDate(arrL(i, 17))

arrL(i, 14) = CDate(arrL(i, 14))

arrL(i, 15) = TimeValue(arrL(i, 15))

arrL(i, 54) = DateDiff("s", arrL(i, 14) + arrL(i, 15), arrL(i, 17) + arrL(i, 18))

End If

'BC列55:列名:完工-出厂:(W+X)-(S+T)上述几列要是空值或零都不要计算,以秒为单位

If arrL(i, 23) <> "" And arrL(i, 24) <> "" And arrL(i, 19) <> "" And arrL(i, 20) <> "" Then '(W+X)-(S+T)

arrL(i, 23) = CDate(arrL(i, 23))

arrL(i, 24) = TimeValue(arrL(i, 24))

arrL(i, 19) = CDate(arrL(i, 19))

arrL(i, 20) = TimeValue(arrL(i, 20))

arrL(i, 55) = DateDiff("s", arrL(i, 19) + arrL(i, 20), arrL(i, 23) + arrL(i, 24))

End If

'BD列:列名:当日调度出厂:N列=W列,标记1

If arrL(i, 14) <> "" And arrL(i, 23) <> "" Then

If arrL(i, 14) = arrL(i, 23) Then

arrL(i, 56) = 1

End If

End If

Next

'写入表格

'第一步清空

ThisWorkbook.Sheets("leadtime-源数据").UsedRange.ClearContents

ThisWorkbook.Sheets("E-reception到店清单-源数据").UsedRange.ClearContents

ThisWorkbook.Sheets("工单明细-源数据").UsedRange.ClearContents

'第二步写入Resize

ThisWorkbook.Sheets("leadtime-源数据").Range("a1").Resize(UBound(arrL, 1), UBound(arrL, 2)) = arrL

ThisWorkbook.Sheets("E-reception到店清单-源数据").Range("a1").Resize(UBound(arrD, 1), UBound(arrD, 2)) = arrD

ThisWorkbook.Sheets("工单明细-源数据").Range("a1").Resize(UBound(arrG, 1), UBound(arrG, 2)) = arrG

ThisWorkbook.Save

MsgBox "读取源数据并计算完成!"

Exit Sub

Erra: MsgBox "打来源数据失败!"

End Sub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Dim ws As Worksheet Dim lastRow As Long Set ws = ThisWorkbook.Worksheets("Sheet1") '清除格式和删除行列 ws.Cells.ClearFormats ws.Range("1:2").Delete Shift:=xlUp ws.Range("A:A,B:B,C:C,F:F,G:G,I:I,J:J,K:K,M:M,P:P,Q:Q,S:S,T:T").Delete Shift:=xlToLeft '添加新列 ws.Range("H1").Value = "回收时间" ws.Range("K1").Value = "回收人" ws.Range("L1").Value = "复核人" ws.Columns("E:E").Copy Destination:=ws.Columns("I:I") ws.Columns("F:F").Copy Destination:=ws.Columns("J:J") '筛选数据 ws.Range("A:D").AutoFilter ws.Range("A:D").AutoFilter Field:=1, Criteria1:="<>tt", VisibleDropDown:=False ws.Range("A:D").AutoFilter Field:=2, Criteria1:="<>996999", VisibleDropDown:=False ws.Range("A:D").AutoFilter Field:=3, Criteria1:="<>996999", VisibleDropDown:=False ws.Range("A:D").AutoFilter Field:=4, Criteria1:="<>*贴", Operator:=xlAnd, Criteria2:="<>*片", VisibleDropDown:=False '排序数据 With ws.Sort .SortFields.Clear .SortFields.Add2 Key:=ws.Range("A2:A500"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("A1:L500") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With With ActiveSheet .Columns.AutoFit .Rows.AutoFit .Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove .Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove .Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove End With '合并单元格 With ws.Range("A1:L1") .Merge .Value = "yyy" End With '调整列宽 ws.Columns("B:B").ColumnWidth = 7.5 ws.Columns("E:E,I:I").ColumnWidth = 3.08 End Sub 改进
05-22
Sub UpdateData() Dim ws As Worksheet Dim lastRow As Long Set ws = ThisWorkbook.Worksheets("Sheet1") '清除格式和删除行列 With ws .Cells.ClearFormats .Range("1:2").Delete Shift:=xlUp .Range("A:A,B:B,C:C,F:F,G:G,I:I,J:J,K:K,M:M,P:P,Q:Q,S:S,T:T").Delete Shift:=xlToLeft '添加新列 .Range("H1").Value = "回收时间" .Range("K1").Value = "回收人" .Range("L1").Value = "复核人" '复制列 .Columns("E:E").Copy Destination:=.Columns("I:I") .Columns("F:F").Copy Destination:=.Columns("J:J") '筛选数据 .Range("A:D").AutoFilter .Range("A:D").AutoFilter Field:=1, Criteria1:="<>tt", VisibleDropDown:=False .Range("A:D").AutoFilter Field:=2, Criteria1:="<>996999", VisibleDropDown:=False .Range("A:D").AutoFilter Field:=3, Criteria1:="<>996999", VisibleDropDown:=False .Range("A:D").AutoFilter Field:=4, Criteria1:="<>*贴", Operator:=xlAnd, Criteria2:="<>*片", VisibleDropDown:=False '排序数据 lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row With .Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("A2:A" & lastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("A1:L" & lastRow) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With '合并单元格 .Range("A1:L1").Merge .Range("A1").Value = "yyy" '调整列宽 .Columns("B:B").ColumnWidth = 7.5 .Columns("E:E,I:I").ColumnWidth = 3.08 '调整行高和列宽 .Cells.EntireRow.AutoFit .Columns.AutoFit '插入空白行 .Rows("1:3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove End With End Sub

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值