Excel VBA-某些数据仅在第二次运行后可见
以下代码执行以下操作:Excel VBA-某些数据仅在第二次运行后可见,excel,vba,Excel,Vba,以下代码执行以下操作: 从“源”工作表复制特定行 粘贴“目标”工作表中的行 对“类型”(E列)进行计数,并将计数插入J列 我的问题是第三步。宏应该做的是: 第一列第3-5行-->插入列标题“缺陷”, “系统”、“脚本” 对中的每个条件执行E列的CountIf函数 第一栏 将J列中的值(计数数)以相应的方式输出 列I旁边的行 例如: 第I列第3行-->缺陷 第J列第3行-->中出现“缺陷”的次数计数 E列 然而,似乎正在发生的是: 列I填充了正确的标准 执行CountIf(看起来正确)并插入
- 第I列第3行-->缺陷
- 第J列第3行-->中出现“缺陷”的次数计数 E列
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
作为调试的下一步,请尝试在错误恢复下删除,因为它会忽略应用程序中的错误,并可能因此提供错误结果。在错误恢复下删除,
-它会隐藏您遇到的错误,并使调试成为一个真正的挑战。如果出现错误,这可能是第二次运行时出现所需值的原因。您可能希望更新您的问题,以包括可以重现问题的所有必要数据。请参见下一步删除错误恢复时的-它隐藏了您遇到的错误,使调试成为一个真正的挑战。如果出现错误,这可能是第二次运行时出现所需值的原因。您可能希望更新您的问题,以包括可以重现问题的所有必要数据。谢谢你的反馈。我已经删除了错误的恢复下一步,我已经更新了上述代码建议。然而,它仍然在做同样的事情。我也编辑了我的文章,可能会有一些用处。谢谢你的反馈。我已经删除了错误的恢复下一步,我已经更新了上述代码建议。然而,它仍然在做同样的事情。我也编辑了我的文章,这可能会有一些用处。