循环多个范围

时间:2018-08-08 13:47:07

标签: excel vba excel-vba

我正在尝试编写代码,确定某些单元格是否为空,然后返回设置的字符串。

详细说明;我希望代码能检查单元格B2,确定它是否为空,然后转到C2,确定它是否为非空。如果在单元格B2中都正确,则将输入“正确”并在范围内继续。但是,我的代码似乎不起作用,因为它只是在循环范围内的每个单元格中输入“正确”。

我在下面发布了我的代码;任何帮助将非常感激。

Tk

2 个答案:

答案 0 :(得分:1)

如果您要按(B2和C2)然后按(B3和C3)逐行检查,则可以这样做。

Sub Fill_Rows()
    Dim iRow As Long
    For iRow = 2 To 5000
        If Cells(iRow, "B").Value = vbNullString And Cells(iRow, "C").Value <> vbNullString Then
            Cells(iRow, "B").Value = "Correct"
        End If
    Next iRow
End Sub

答案 1 :(得分:0)

替代

添加了两个解决方案:

  • [1]尽可能接近您和
  • 的示例代码
  • [2]一种使用数据字段数组的替代方法,用于展示更大数据集的更快的方法

[1]与您的代码接近的示例

不需要使用第二个变量Y,而且显然您未声明它,这总是会引起问题(类型不匹配,没有范围对象等)。 因此,请始终在代码模块的声明头中使用Option Explicit来强制自己声明所使用的所有变量类型。

现在,您也可以简单地使用现有单元格的1列偏移量来检查相邻单元格。

Option Explicit   ' declaration head of your code module (obliges to declare variables)

Sub Fill_RowsViaRangeLoop()
Dim X As Range, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("MySheet")  ' << replace with your sheet name
For Each X In ws.Range("B2:B5000")
    If X = "" And X.Offset(0, 1) <> "" Then  ' column offset 1 checks next cell in C
         X = "Correct"
    End If
Next X
End Sub

[2]使用数据字段数组的示例代码

在更大范围内循环不是很快,您可以通过以下方法来加快操作速度 将范围值分配给变量数据字段数组v,遍历接收到的数组项,更正第1列中找到的项,并将其写回到工作表中。

Option Explicit   ' declaration head of your code module (obliges to declare variables)

Sub Fill_RowsViaArray()
   Dim v As Variant, i As Long, ws As Worksheet
   Set ws = ThisWorkbook.Worksheets("MySheet")  ' << replace with your sheet name
 ' Assign values to a 2-dim array
   v = ws.Range("B2:C5000")             ' or better: v = ws.Range("B2:C5000").Value2
 ' Check criteria looping over all rows (=first array dimension)
   For i = 1 To UBound(v)               ' data field arrays are one-based, i.e. they start with 1
       If v(i, 1) = vbNullString And v(i, 2) <> vbNullString Then v(i, 1) = "Correct"
   Next i
 ' Write edited array back to original range (adapt the range size to the array boundaries in both dimensions)
   ws.Range("B2").Resize(UBound(v, 1), UBound(v, 2)) = v
 End Sub

更多说明

  • 这是对表格或范围引用进行完全限定的好方法(例如,参见对象变量ws
  • 每个数组项都由行和列索引标识。
  • 由于这种数据字段数组基于一个(起始索引为1),因此第1行和第1列中的第一项将由v(1,1)引用,在第2列中将由v(1,2)引用。
  • 要计算行项目的数量,请通过UBound(v,1)检查其第一维度的上边界,或者通过Ubound(v)甚至更短的行来检查
  • 要计算列数,请通过UBound(v,2)(此处的参数2是必需的)检查其第二维的上边界
  • 使用vbNullString进行比较可能会比使用""进行编码更好,因为它占用的内存更少(参见@PEH的答案)。