Vba 错误处理,复制行
以下是我的帖子: 我急需帮助。我需要帮助来处理错误Vba 错误处理,复制行,vba,excel,excel-2010,Vba,Excel,Excel 2010,以下是我的帖子: 我急需帮助。我需要帮助来处理错误 如果在ComboBox2列表中找不到,我需要它显示一个带有全局工作表中lookupVal的msgbox 除了这段错误处理之外,我还请求您提供帮助,让它在代码运行完成后显示MsgBox,以显示已复制到每个工作表的行数和复制的行总数 类似于下面的内容,如果它将更多行复制到其他工作表,那么它将在2555之后声明,然后告诉我这些工作表没有复制到任何内容 Private子命令按钮2\u单击() 尺寸i为长,j为长,lastG为长,strWS为字符串,r
Private子命令按钮2\u单击()
尺寸i为长,j为长,lastG为长,strWS为字符串,rngCPY为范围
应用
.ScreenUpdate=False
.EnableEvents=False
.CutCopyMode=False
以
如果范围(“L9”)=“那么
MsgBox“在此阶段无法拆分作业。”&vbLf&vbLf&“请先为分包商创建表单。”&vbLf&vbLf&“请按显示实用程序创建表单。”,VBEQUOTION,“无效操作”&vbLf&vbLf&“此操作无效。”
出口接头
如果结束
错误转到bm\u关闭\u
“找到最后一行
lastG=工作表(“全局”)。单元格(行数,“Q”)。结束(xlUp)。行
对于i=3到lastG
lookupVal=sheets(“全局”)。要查找的单元格(i,“Q”)值
'在“详细信息”中循环值'
对于j=0到UserForm2.ComboBox2.ListCount-1
currVal=UserForm2.ComboBox2.List(j,0)要匹配的值
如果lookupVal=currVal,则
设置rngCPY=表格(“全局”).单元格(i,“Q”).整个流程
strWS=UserForm2.ComboBox2.List(j,1)
错误转到bm\u需要\u工作表“0”,然后
lastRow2=wsPayment.Range(“A23:A39”).End(xlDown).row
其他的
lastRow2=wsPayment.Range(“A18:A34”).End(xlDown).row
如果结束
wsTemplate.Visible=True
wsTemplate.Copy before:=工作表(“详细信息”):设置wsNew=ActiveSheet
wsTemplate.Visible=False
如果InStr(1,第页(“付款表”).范围(“A20”).值,“显示的增值税是您应付海关和消费税的销项税”)>0,则
付款
范围内的每个单元格(“A23:A39”)
如果Len(cell)=0,则
如果表格(“付款单”).Range(“C9”).value=“网络”,则
cell.value=NewName&“-”&Name2&“:”&CCName
其他的
cell.value=NewName&“-”&Name2&“:”&CCName
如果结束
退出
如果结束
下一个细胞
以
其他的
付款
范围内的每个单元格(“A18:A34”)
如果Len(cell)=0,则
如果表格(“付款单”).Range(“C9”).value=“网络”,则
cell.value=NewName&“-”&Name2&“:”&CCName
其他的
cell.value=NewName&“-”&Name2&“:”&CCName
如果结束
退出
如果结束
下一个细胞
以
如果结束
如果InStr(1,第页(“付款表”).范围(“A20”).值,“显示的增值税是您应付海关和消费税的销项税”)>0,则
与wsNew
.Name=NewName
.Range(“D4”).value=wsPayment.Range(“A23:A39”).End(xlDown).value
.Range(“D6”).value=wsPayment.Range(“L11”).value
.Range(“D8”).value=wsPayment.Range(“C9”).value
.Range(“D10”).value=wsPayment.Range(“C11”).value
以
其他的
与wsNew
.Name=NewName
.Range(“D4”).value=wsPayment.Range(“A18:A34”).End(xlDown).value
.Range(“D6”).value=wsPayment.Range(“L11”).value
.Range(“D8”).value=wsPayment.Range(“C9”).value
.Range(“D10”).value=wsPayment.Range(“C11”).value
以
如果结束
wsPayment.Activate
付款
.Range(“J”&lastRow2+1)。值=0
.Range(“L”和lastRow2+1)。公式=“=N”和lastRow2+1&“-J”和lastRow2+1&”
.Range(“N”&lastRow2+1)。公式=“=”&NewName&“!L20”
.Range(“U”和lastRow+1)。值=新名称和“:”
.Range(“V”&lastRow+1)。公式=“=”&NewName&“!I21”
.Range(“W”&lastRow+1)。公式=“=”&NewName&“!I23”
.Range(“X”&lastRow+1)。公式=“=”&NewName&“!K21”
以
以
错误转到bm\u关闭\u
简历
bm_收尾:
应用
.ScreenUpdate=True
.EnableEvents=True
.CutCopyMode=True
以
端接头
在一些人的帮助下,我已经走到了这一步,但在这最后阶段失败了!感谢您的帮助。错误的是,它会转到标签,并在标签上重新打开屏幕更新等功能。您需要它执行的任何操作都必须在该标签之后。@Raystafarian您好,我已尝试在bm-Close_Out之后放置一些错误处理:。但即使存在正确的匹配值,它也会显示msgbox。如果我输入了一个不在列表中的值,那么它会正确地显示msgbox,但是如果删除了它,它仍然会显示它??对,因为除非您退出sub以避免错误,否则一切都将始终执行handler@Raystafarian. 我已成功获取if lookupVal currVal和msgbox lookupVal。但它只显示最后一个不匹配的值。我需要它在一个msgbox中显示所有不匹配的值。然后需要一个列表或数组来放入这些值,然后显示
Private Sub CommandButton2_Click()
Dim i As Long, j As Long, lastG As Long, strWS As String, rngCPY As Range
With Application
.ScreenUpdating = False
.EnableEvents = False
.CutCopyMode = False
End With
If Range("L9") = "" Then
MsgBox "You can't Split the Jobs at this stage. " & vbLf & vbLf & "Please create the form for the Sub-Contractor First." & vbLf & vbLf & "Please press Display Utilities to create form.", vbExclamation, "Invalid Operation" '& vbLf & vbLf & "This operation is invalid."
Exit Sub
End If
On Error GoTo bm_Close_Out
' find last row
lastG = sheets("Global").Cells(Rows.Count, "Q").End(xlUp).row
For i = 3 To lastG
lookupVal = sheets("Global").Cells(i, "Q") ' value to find
' loop over values in "details"
For j = 0 To UserForm2.ComboBox2.ListCount - 1
currVal = UserForm2.ComboBox2.List(j, 0) ' value to match
If lookupVal = currVal Then
Set rngCPY = sheets("Global").Cells(i, "Q").EntireRow
strWS = UserForm2.ComboBox2.List(j, 1)
On Error GoTo bm_Need_Worksheet '<~~ if the worksheet in the next line does not exist, go make one
With Worksheets(strWS)
rngCPY.Copy
.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Insert shift:=xlDown
End With
''''
Code here for msgbox to say, lookupVal ie(ISLDAMAGE) is not in the
list, please create the sheet manually then copy the rows accordingly
''''
End If
Next j
Next i
GoTo bm_Close_Out
bm_Need_Worksheet:
On Error GoTo 0
With Worksheet
Dim wb As Workbook: Set wb = ThisWorkbook
Dim wsTemplate As Worksheet: Set wsTemplate = wb.sheets("Template")
Dim wsPayment As Worksheet: Set wsPayment = wb.sheets("Payment Form")
Dim wsNew As Worksheet
Dim lastRow2 As Long
Dim Contract As String: Contract = sheets("Payment Form").Range("C9").value
Dim SpacePos As Integer: SpacePos = InStr(Contract, "- ")
Dim Name As String: Name = Left(Contract, SpacePos)
Dim Name2 As String: Name2 = Right(Contract, Len(Contract) - Len(Name))
Dim NewName As String: NewName = strWS
Dim CCName As Variant: CCName = UserForm2.ComboBox2.List(j, 2)
Dim lastRow As Long: lastRow = wsPayment.Range("U36:U53").End(xlDown).row
If InStr(1, sheets("Payment Form").Range("A20").value, "THE VAT SHOWN IS YOUR OUTPUT TAX DUE TO CUSTOMS AND EXCISE") > 0 Then
lastRow2 = wsPayment.Range("A23:A39").End(xlDown).row
Else
lastRow2 = wsPayment.Range("A18:A34").End(xlDown).row
End If
wsTemplate.Visible = True
wsTemplate.Copy before:=sheets("Details"): Set wsNew = ActiveSheet
wsTemplate.Visible = False
If InStr(1, sheets("Payment Form").Range("A20").value, "THE VAT SHOWN IS YOUR OUTPUT TAX DUE TO CUSTOMS AND EXCISE") > 0 Then
With wsPayment
For Each cell In .Range("A23:A39")
If Len(cell) = 0 Then
If sheets("Payment Form").Range("C9").value = "Network" Then
cell.value = NewName & " - " & Name2 & ": " & CCName
Else
cell.value = NewName & " -" & Name2 & ": " & CCName
End If
Exit For
End If
Next cell
End With
Else
With wsPayment
For Each cell In .Range("A18:A34")
If Len(cell) = 0 Then
If sheets("Payment Form").Range("C9").value = "Network" Then
cell.value = NewName & " - " & Name2 & ": " & CCName
Else
cell.value = NewName & " -" & Name2 & ": " & CCName
End If
Exit For
End If
Next cell
End With
End If
If InStr(1, sheets("Payment Form").Range("A20").value, "THE VAT SHOWN IS YOUR OUTPUT TAX DUE TO CUSTOMS AND EXCISE") > 0 Then
With wsNew
.Name = NewName
.Range("D4").value = wsPayment.Range("A23:A39").End(xlDown).value
.Range("D6").value = wsPayment.Range("L11").value
.Range("D8").value = wsPayment.Range("C9").value
.Range("D10").value = wsPayment.Range("C11").value
End With
Else
With wsNew
.Name = NewName
.Range("D4").value = wsPayment.Range("A18:A34").End(xlDown).value
.Range("D6").value = wsPayment.Range("L11").value
.Range("D8").value = wsPayment.Range("C9").value
.Range("D10").value = wsPayment.Range("C11").value
End With
End If
wsPayment.Activate
With wsPayment
.Range("J" & lastRow2 + 1).value = 0
.Range("L" & lastRow2 + 1).Formula = "=N" & lastRow2 + 1 & "-J" & lastRow2 + 1 & ""
.Range("N" & lastRow2 + 1).Formula = "='" & NewName & "'!L20"
.Range("U" & lastRow + 1).value = NewName & ": "
.Range("V" & lastRow + 1).Formula = "='" & NewName & "'!I21"
.Range("W" & lastRow + 1).Formula = "='" & NewName & "'!I23"
.Range("X" & lastRow + 1).Formula = "='" & NewName & "'!K21"
End With
End With
On Error GoTo bm_Close_Out
Resume
bm_Close_Out:
With Application
.ScreenUpdating = True
.EnableEvents = True
.CutCopyMode = True
End With
End Sub