Vba 具有多个范围的循环
我正在尝试编写一个代码,确定某些单元格是否为空,然后返回一个集合字符串 细说;我希望代码可以查看单元格B2,确定它是否为空,然后转到C2并确定它是否为非空。如果单元格B2中的两个都正确,则输入“correct”并在范围内继续。然而,我的代码似乎不起作用,因为它只在循环范围内的每个单元格中输入“正确” 我已经在下面发布了我的代码;任何帮助都将不胜感激Vba 具有多个范围的循环,vba,excel,Vba,Excel,我正在尝试编写一个代码,确定某些单元格是否为空,然后返回一个集合字符串 细说;我希望代码可以查看单元格B2,确定它是否为空,然后转到C2并确定它是否为非空。如果单元格B2中的两个都正确,则输入“correct”并在范围内继续。然而,我的代码似乎不起作用,因为它只在循环范围内的每个单元格中输入“正确” 我已经在下面发布了我的代码;任何帮助都将不胜感激 Sub Fill_Rows() Dim X As Range Let Y = Range("C2") For Each X In Range(
Sub Fill_Rows()
Dim X As Range
Let Y = Range("C2")
For Each X In Range("B2:B5000")
If X = "" And Y <> "" Then
X = "Correct"
End If
Y = Y + 1
Next X
End Sub
Sub Fill_Rows()
Dim X As范围
设Y=范围(“C2”)
对于范围内的每个X(“B2:B5000”)
如果X=”和Y“”,则
X=“正确”
如果结束
Y=Y+1
下一个X
端接头
如果您想按每一行(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
Sub Fill_Rows()
暗淡无光
对于iRow=2到5000
如果单元格(iRow,“B”).Value=vbNullString,单元格(iRow,“C”).Value=vbNullString,则
单元格(iRow,“B”).Value=“正确”
如果结束
下一步
端接头
备选方案
增加了两种解决方案:
- [1] 尽可能接近您的示例代码,以及
- [2] 另一种方法是使用数据字段数组演示一种更快的方法,用于更大的数据集
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
进一步说明
- 完全限定图纸或范围引用非常有用(例如,请参见对象变量
)ws
- 每个数组项由一行和一列索引标识李>
- 由于这样的数据字段数组是基于一的(起始索引为1),第1行和第1列中的第一项将由
引用,第2列中的第一项由v(1,1)
引用v(1,2)
- 为了计算行项目的数量,您可以通过
或通过UBound(v,1)
UBound(v)
- 为了计算列数,您可以通过
检查第二维度的上边界(此处参数2是必需的!)UBound(v,2)
- 使用
进行比较是编码到vbNullString
时的首选方法,因为它占用的内存较少(c.f.@PEH的答案)李>“
vbNullString
与“
相同(有些人说vbNullString
占用的内存更少,速度更快:请参阅)。“B”
和“C”
只是列名:cells()
与单元格(行、列)
一样使用。
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