Vba 具有多个范围的循环

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(

我正在尝试编写一个代码,确定某些单元格是否为空,然后返回一个集合字符串

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

我已经在下面发布了我的代码;任何帮助都将不胜感激

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] 另一种方法是使用数据字段数组演示一种更快的方法,用于更大的数据集
[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
进一步说明

  • 完全限定图纸或范围引用非常有用(例如,请参见对象变量
    ws
  • 每个数组项由一行和一列索引标识
  • 由于这样的数据字段数组是基于一的(起始索引为1),第1行和第1列中的第一项将由
    v(1,1)
    引用,第2列中的第一项由
    v(1,2)
    引用
  • 为了计算行项目的数量,您可以通过
    UBound(v,1)
    或通过
    UBound(v)
  • 为了计算列数,您可以通过
    UBound(v,2)
    检查第二维度的上边界(此处参数2是必需的!)
  • 使用
    vbNullString
    进行比较是编码到
    时的首选方法,因为它占用的内存较少(c.f.@PEH的答案)
无需检查循环中的Y,只需检查一次。你有没有仔细检查代码,看看发生了什么?有时一个单元格可能看起来是空的,但里面可能有东西。@wildesbare-请允许我说一句话,因为您已经问了六个不可接受的问题:在堆栈溢出时,通过将其标记为已接受来识别一个好的或有帮助的答案是很有用的,因此您可能可以查看它们-请参阅;您可以在以下位置找到更多提示:-)谢谢您提供接受答案的提示。我不知道我能做到这一点。对不起,我对VBA还很陌生。。。。请务必解释一下vbNullString是什么,以及“B”和“C”在cells函数中是如何工作的
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