Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 错误处理,复制行_Vba_Excel_Excel 2010 - Fatal编程技术网

Vba 错误处理,复制行

Vba 错误处理,复制行,vba,excel,excel-2010,Vba,Excel,Excel 2010,以下是我的帖子: 我急需帮助。我需要帮助来处理错误 如果在ComboBox2列表中找不到,我需要它显示一个带有全局工作表中lookupVal的msgbox 除了这段错误处理之外,我还请求您提供帮助,让它在代码运行完成后显示MsgBox,以显示已复制到每个工作表的行数和复制的行总数 类似于下面的内容,如果它将更多行复制到其他工作表,那么它将在2555之后声明,然后告诉我这些工作表没有复制到任何内容 Private子命令按钮2\u单击() 尺寸i为长,j为长,lastG为长,strWS为字符串,r

以下是我的帖子:

我急需帮助。我需要帮助来处理错误

  • 如果在ComboBox2列表中找不到,我需要它显示一个带有全局工作表中lookupVal的msgbox
  • 除了这段错误处理之外,我还请求您提供帮助,让它在代码运行完成后显示MsgBox,以显示已复制到每个工作表的行数和复制的行总数
  • 类似于下面的内容,如果它将更多行复制到其他工作表,那么它将在2555之后声明,然后告诉我这些工作表没有复制到任何内容

    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