Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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
Excel VBA-某些数据仅在第二次运行后可见_Excel_Vba - Fatal编程技术网

Excel VBA-某些数据仅在第二次运行后可见

Excel VBA-某些数据仅在第二次运行后可见,excel,vba,Excel,Vba,以下代码执行以下操作: 从“源”工作表复制特定行 粘贴“目标”工作表中的行 对“类型”(E列)进行计数,并将计数插入J列 我的问题是第三步。宏应该做的是: 第一列第3-5行-->插入列标题“缺陷”, “系统”、“脚本” 对中的每个条件执行E列的CountIf函数 第一栏 将J列中的值(计数数)以相应的方式输出 列I旁边的行 例如: 第I列第3行-->缺陷 第J列第3行-->中出现“缺陷”的次数计数 E列 然而,似乎正在发生的是: 列I填充了正确的标准 执行CountIf(看起来正确)并插入

以下代码执行以下操作:

  • 从“源”工作表复制特定行
  • 粘贴“目标”工作表中的行
  • 对“类型”(E列)进行计数,并将计数插入J列
  • 我的问题是第三步。宏应该做的是:

  • 第一列第3-5行-->插入列标题“缺陷”, “系统”、“脚本”
  • 对中的每个条件执行E列的CountIf函数 第一栏
  • 将J列中的值(计数数)以相应的方式输出 列I旁边的行
  • 例如:

    • 第I列第3行-->缺陷
    • 第J列第3行-->中出现“缺陷”的次数计数 E列
    然而,似乎正在发生的是:

  • 列I填充了正确的标准
  • 执行CountIf(看起来正确)并插入 第J列中的值
  • 插入值时,将删除列I中的条件 我只剩下J列中的数值
  • 现在,如果我再次运行宏,那么它将按预期执行,我无法理解原因

    此外,E列中没有“缺陷”条目,因此该值为0。但是在第一次运行时,您没有看到0,它只是空白。在第二次运行时,它显示值0

    Sub Copy()
    
        Dim xRg As Range, xCell As Range
        Dim i As Long, J As Long, K As Long, x As Long, count As Long
        Dim y As Workbook
        Dim ws1 As Worksheet
        Dim element As Variant, myarray As Variant
    
        myarray = Array("Defect", "System", "Script")
    
        i = Worksheets("source").UsedRange.Rows.count
        J = Worksheets("target").UsedRange.Rows.count
    
        count = 3
    
        Set y = Workbooks("myWKBK.xlsm")
    
        Set ws1 = y.Sheets("target")
    
        If J = 1 Then
    
            If Application.WorksheetFunction.CountA(Worksheets("target").UsedRange) = 0 Then J = 0
    
        End If
    
        lngLastRow = Cells(Rows.count, "C").End(xlUp).Row
    
        Set xRg = Worksheets("source").Range("E3:E" & lngLastRow & i)
    
        On Error Resume Next
        Application.ScreenUpdating = False
    
        With ws1
    
            'Assign name to columns where values will be pasted
            .Range("$B$2").Value = "ID"
            .Range("$C$2").Value = "Status"
            .Range("$D$2").Value = "Description"
            .Range("$E$2").Value = "Type"
            .Range("$F$2").Value = "Folder"
            .Range("$G$2").Value = "Defect ID"
            .Range("$I$2").Value = "Type"
            .Range("$I$3").Value = "Defect"
            .Range("$I$4").Value = "System"
            .Range("$I$5").Value = "Script"
            .Range("$J$2").Value = "Count"
    
        End With
    
        For Each element In myarray
    
            For K = 1 To xRg.count
    
                If CStr(xRg(K).Value) = element Then
    
                    LastRow = ws1.Cells(Rows.count, "B").End(xlUp).Row + 1
                    xRg(K).EntireRow.Copy Destination:=ws1.Range("A" & LastRow)
    
                    J = J + 1
    
                End If
    
            Next
    
            x = Range("E" & Rows.count).End(xlUp).Row
    
            Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    
            count = count + 1
    
        Next element
    
        ws1.Columns("B:J").AutoFit
    
        Application.ScreenUpdating = True
    
    End Sub
    
    编辑:

    很可能值得一提的是,下面的sub本身的工作很好:

    Sub CountIf()
    
        Dim element As Variant
        Dim myarray As Variant
    
        myarray = Array("Defect", "System", "Script")
    
        Dim count As Long
    
        count = 3
    
        For Each element In myarray
    
            Dim x As Long
            x = Range("E" & Rows.count).End(xlUp).Row
            Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    
            count = count + 1
    
        Next element
    
    End Sub
    

    此函数仅单独执行CountIf,并完全按照预期工作。

    这是代码中非常漂亮的一部分:

    Set xRg = Worksheets("source").Range("E3:E" & lngLastRow & i)
    
    它正确设置
    范围
    对象的父工作表,因此VBA知道在哪里查看。然而,由于某些原因,情况并非总是如此。请看以下几行:

    lngLastRow = Cells(Rows.count, "C").End(xlUp).Row
    x = Range("E" & Rows.count).End(xlUp).Row
    Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    
    未设置工作表的位置。因此,它采用
    ActiveSheet
    或工作表(如果代码在工作表中,而不是在模块中)。尝试重写它,遵循代码的漂亮部分,例如定义工作表:

    With Worksheet("SomeName")
        lngLastRow = .Cells(Rows.count, "C").End(xlUp).Row
        x = .Range("E" & Rows.count).End(xlUp).Row
        .Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    End With
    


    作为调试的下一步,请尝试在错误恢复下删除
    ,因为它会忽略应用程序中的错误,并可能因此提供错误结果。

    这是代码中非常漂亮的一部分:

    Set xRg = Worksheets("source").Range("E3:E" & lngLastRow & i)
    
    它正确设置
    范围
    对象的父工作表,因此VBA知道在哪里查看。然而,由于某些原因,情况并非总是如此。请看以下几行:

    lngLastRow = Cells(Rows.count, "C").End(xlUp).Row
    x = Range("E" & Rows.count).End(xlUp).Row
    Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    
    未设置工作表的位置。因此,它采用
    ActiveSheet
    或工作表(如果代码在工作表中,而不是在模块中)。尝试重写它,遵循代码的漂亮部分,例如定义工作表:

    With Worksheet("SomeName")
        lngLastRow = .Cells(Rows.count, "C").End(xlUp).Row
        x = .Range("E" & Rows.count).End(xlUp).Row
        .Range("J" & count) = Application.WorksheetFunction.CountIf(Range("E3:E" & x), element)
    End With
    


    作为调试的下一步,请尝试在错误恢复下删除
    ,因为它会忽略应用程序中的错误,并可能因此提供错误结果。

    在错误恢复下删除
    -它会隐藏您遇到的错误,并使调试成为一个真正的挑战。如果出现错误,这可能是第二次运行时出现所需值的原因。您可能希望更新您的问题,以包括可以重现问题的所有必要数据。请参见下一步删除错误恢复时的
    -它隐藏了您遇到的错误,使调试成为一个真正的挑战。如果出现错误,这可能是第二次运行时出现所需值的原因。您可能希望更新您的问题,以包括可以重现问题的所有必要数据。谢谢你的反馈。我已经删除了错误的恢复下一步,我已经更新了上述代码建议。然而,它仍然在做同样的事情。我也编辑了我的文章,可能会有一些用处。谢谢你的反馈。我已经删除了错误的恢复下一步,我已经更新了上述代码建议。然而,它仍然在做同样的事情。我也编辑了我的文章,这可能会有一些用处。