VBA excel:如何遍历一列,并根据条件更改偏移列

我正在尝试将单元格6列更改为我的迭代的右侧。 下面的vba似乎没有出现任何错误,但是当我运行Sub时,没有任何更新。 有任何想法吗?

Sub RemoveDate() Dim state Dim dat Dim cell As Range Dim LastRow As Long Sheets("RawData").Select LastRow = Range("A" & Rows.Count).End(xlUp).Row 'If cell in column J is = state then change the cell 6 columns to right For Each cell In Range("J1" & LastRow).Cells state = cell.Value dat = cell.Offset(0, 6).Value If state = "Pending" Then dat = "TBD" ElseIf state = "Under Review" Then dat = "TBD" ElseIf state = "BRD Refinement" Then dat = "TBD" ElseIf state = "On Hold" Then dat = "TBD" End If Next End Sub 

只是因为有不止一个项目错误,这结合了我和FindWindow的注释:

 Sub RemoveDate() Dim state Dim dat As Range Dim cell As Range Dim LastRow As Long Sheets("RawData").Select LastRow = Range("A" & Rows.Count).End(xlUp).Row 'If cell in column J is = state then change the cell 6 columns to right For Each cell In Range("J1", Range("J" & LastRow)).Cells state = cell.Value Set dat = cell.Offset(0, 6) If state = "Pending" Then dat = "TBD" ElseIf state = "Under Review" Then dat = "TBD" ElseIf state = "BRD Refinement" Then dat = "TBD" ElseIf state = "On Hold" Then dat = "TBD" End If Next End Sub 

dat = cell.Offset(0, 6).Value你正在设置variablesdat到单元格的内容。 然后用if语句replacevariables中的值而不是单元格。

通过将variables设置为一个范围,并使用Set关键字,它将声明单元格本身,并用if语句中设置的值replace单元格中的内容。

只要注意Select Case,使用多个elseif就更容易。 用这个replace整个循环:

 For Each cell In Range("J1", Range("J" & LastRow)).Cells Select Case cell.Value 'because all the values result in the same outcome Case "Pending", "Under Review", "BRD Refinement", "On Hold" cell.Offset(0, 6) = "TBD" Case Else End Select Next 

为什么不这样:

 Sub RemoveDate() Dim state As String, cell As Variant, LastRow As Long LastRow = Sheets("RawData").Cells(Rows.Count, 1).End(xlUp).Row For Each cell In Sheets("RawData").Range("J1:J" & LastRow).Cells state = cell.Value If state = "Pending" Or state = "Under Review" Or state = "BRD Refinement" Or state = "On Hold" Then cell.Offset(0, 6).Value = "TBD" End If Next End Sub 

当做很多细胞时,它可能会很慢,所以我会更像这样做:

 Sub RemoveDate() Dim getRng As Variant, putRng As Variant, i As Long i = Sheets("RawData").Cells(Rows.Count, 1).End(xlUp).Row Set getRng = Sheets("RawData").Range("J1:J" & i).Value Set putRng = Sheets("RawData").Range("P1:P" & i).Value While i > 1 If getRng(i, 1) = "Pending" Or getRng(i, 1) = "Under Review" Or getRng(i, 1) = "BRD Refinement" Or getRng(i, 1) = "On Hold" Then putRng(i, 1) = "TBD" End If i = i - 1 Wend Sheets("RawData").Range("P1:P" & Ubound(putRng)).Value = putRng End Sub 

如果P还有公式,那么用.Formulareplace.Value就更好了。
第二个代码只是简单地将范围的所有值检查并更改为variables。 然后使用i作为地址来获取variables中的值来比较/更改(从最后一项到第一项)。 用真实细胞做这个要快得多。 然而,你的For Each ...在第一种方式中是一样的,但是.Offset的需求有点杀死它。 作为最后一个动作,它将输出值的整个范围返回到您的工作表。 一步完成大量细胞的操作也要快得多,只能对一些细胞一个接一个地进行。 这样它也覆盖没有改变它们旧值的单元格(作为一个有趣的事实:这比离开它们还要快)