数组范围和IsEmpty如果然后语句VBA。 覆盖一切,而不是有select地插入

我是VBA的全新人物。 到目前为止,我的腰带已经有四个星期了。 这是完成数据清理和分析报告的macros列表的最后一部分。 也许这不是最好的办法吗? 我还是新来的,所以我打开其他的build议。 但它需要是一个macros观的。 这基本上是什么样子(高亮显示的字段填充了查找,这就是为什么我有两个不同的数组,因为它们不是连续的):

链接到工作表的剪切

行数取决于报告。 有时它的4000行,有时更多,有时更less。 但是我确定每一列都是一样的。 我们试图尽可能地自动化,以便我们能够让一些技术较差的人能够贯穿整个过程。 我第一次经历这个过程花了6个小时(尽pipe我也是在记笔记)。 对于这里的高级人员来说,每个人大概需要2个小时。 在年底之前,我们有大约300个这样的地方。

无论如何,这个代码的作品,但它覆盖了我插入的所有iferror / vlookup结果。 我猜我的“For If If Then”是错误的。 但是我已经在这里工作了几天,尝试了不同的方式来实现这个目标,而且这是我最接近的。 任何帮助将不胜感激。 我确定它的东西超级简单

Sub AutomateAllTheThings6() Dim arr3() As String Dim arr11() As String Dim rng3 As Range Dim rng11 As Range Dim sourcerng As Range Dim lastRow As Long Call OptimizeCode_Begin lastRow = Range("D1:D" & Range("D1").End(xlDown).Row).Rows.Count Set rng3 = ActiveSheet.Range("BH2:BJ2" & ":BH" & lastRow) Set rng11 = ActiveSheet.Range("BL2:BV2" & ":BL" & lastRow) Set sourcerng = ActiveSheet.Range("BE2:BF2" & ":BE" & lastRow) arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") For Each cell In sourcerng If IsEmpty(cell) Then rng3.Value = arr3 rng11.Value = arr11 End If Next Call OptimizeCode_End End Sub 

你指的是整个范围:

rng3.Value = arr3

所以当任何发现空白的整个范围被设置,而不仅仅是那一行。 我们可以用Intersect来做那一行

 Intersect(rng3, ActiveSheet.Rows(cell.Row)).Value = arr3 

此外,您的范围是错误的

Set rng3 = ActiveSheet.Range("BH2:BJ2" & ":BH" & lastRow)

将涉及范围BH2:BJ2:BH100

增加到:

 Set rng3 = ActiveSheet.Range("BH2:BJ" & lastRow) 

所以:

 Sub AutomateAllTheThings6() Dim arr3() As String Dim arr11() As String Dim rng3 As Range Dim rng11 As Range Dim sourcerng As Range Dim lastRow As Long Call OptimizeCode_Begin lastRow = ActiveSheet.Range("D1").End(xlDown).Row Set rng3 = ActiveSheet.Range("BH2:BJ" & lastRow) Set rng11 = ActiveSheet.Range("BL2:BV" & lastRow) Set sourcerng = ActiveSheet.Range("BE2:BF" & lastRow) arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") For Each cell In sourcerng If IsEmpty(cell) Then Intersect(rng3, ActiveSheet.Rows(cell.Row)).Value = arr3 Intersect(rng11, ActiveSheet.Rows(cell.Row)).Value = arr11 End If Next Call OptimizeCode_End End Sub 

你也可以在数组中使用这样的版本。 尽pipe在我的代码中,结果并没有粘贴到数组中,但是计算是基于它们来完成的,代码执行的速度比在范围内的单元格上运行得快得多。

 Option Explicit Option Base 1 Sub AutomateAllTheThings6() Dim arr3() As String, arr11() As String Dim rng3 As Range, rng11 As Range, sourceRng As Range Dim vSource As Variant Dim nCounter1 As Long, nCounter2 As Long, lastRow As Long Call OptimizeCode_Begin Const firstRow As Long = 2 With ActiveSheet lastRow = .Range("D1:D" & Range("D1").End(xlDown).Row).Rows.Count Set rng3 = .Range("BH" & firstRow & ":BJ" & lastRow) Set rng11 = .Range("BL" & firstRow & ":BV" & lastRow) Set sourceRng = .Range("BE" & firstRow & ":BF" & lastRow) End With vSource = sourceRng arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") For nCounter1 = LBound(vSource) To UBound(vSource) 'loop through all rows in source range For nCounter2 = LBound(vSource, 2) To UBound(vSource, 2) 'loop through all columns in the row If IsEmpty(vSource(nCounter1, nCounter2)) Then 'if cell is empty rng3.Rows(nCounter1) = arr3 rng11.Rows(nCounter1) = arr11 Exit For End If Next nCounter2 Next nCounter1 Call OptimizeCode_End End Sub