我正在尝试编写代码,确定某些单元格是否为空,然后返回设置的字符串。
详细说明;我希望代码能检查单元格B2,确定它是否为空,然后转到C2,确定它是否为非空。如果在单元格B2中都正确,则将输入“正确”并在范围内继续。但是,我的代码似乎不起作用,因为它只是在循环范围内的每个单元格中输入“正确”。
我在下面发布了我的代码;任何帮助将非常感激。
Tk
答案 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]与您的代码接近的示例
不需要使用第二个变量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
)v(1,1)
引用,在第2列中将由v(1,2)
引用。UBound(v,1)
检查其第一维度的上边界,或者通过Ubound(v)
甚至更短的行来检查UBound(v,2)
(此处的参数2是必需的)检查其第二维的上边界。vbNullString
进行比较可能会比使用""
进行编码更好,因为它占用的内存更少(参见@PEH的答案)。