我一直试图在我正在构建的电子表格中为我创建一个新列。它将从列K
中获取“是”或“否”,并且根据是否为“是”,将使用“待定”或“管道”填充新列。
以下是我一直使用的代码 - 但这只是将所有内容标记为Pipeline:
Dim KR As Long
KR = ActiveSheet.Range("K" & Rows.Count).End(xlUp).Row
Range("M1").EntireColumn.Insert
Range("M1").Select
ActiveCell.FormulaR1C1 = "Status"
If Range("K2").Value = "No" Then
Range("M2").Value = "Pipeline"
ElseIf Range("K2").Value = "Yes" Then
Range("M2").Value = "Pending"
End If
Range("M2").Copy Destination:=Range("M3:M" & KR)
我哪里出错?
答案 0 :(得分:1)
您在VBA和Excel公式之间混淆了一些概念。您的VBA代码If Then Else
语句未转换为Excel中的IF()
公式。因此,您最终只根据If
语句设置第一个单元格值,然后复制此值。
如果您想使用Excel公式,可以在VBA中设置M列,如下所示:
Range("M2:M" & KR).Formula = "=IF(K2=""No"", ""Pipeline"", IF(K2=""Yes"", ""Pending"", """"))"
如果要在不使用公式的情况下使用VBA在M列中设置值,则需要在VBA中循环遍历单元格,并在循环中使用您在代码中使用的If
,如下所示:
For i = 2 To KR
If Range("K" & i).Value = "No" Then
Range("M" & i).Value = "Pipeline"
ElseIf Range("K" & i).Value = "Yes" Then
Range("M" & i).Value = "Pending"
End If
Next
答案 1 :(得分:1)
您正在使用的if语句正在您正在使用的VBA代码中运行,因此输入到单元格M2的值只是“Pipeline”或“Pending”。因此,当您复制行Range("M2").Copy Destination:=Range("M3:M" & KR)
上的单元格时,会将相同的结果复制到每个单元格(而不是条件公式)。
要纠正最简单的方法就是替换
If Range("K2").Value = "No" Then
Range("M2").Value = "Pipeline"
ElseIf Range("K2").Value = "Yes" Then
Range("M2").Value = "Pending"
End If
使用:
Range("M2").Formula = "=IF(K2=""No"",""Pipeline"",""Pending"")"
这意味着当您的代码复制单元格时,它会将公式复制下来。
但是,如果您希望避免使用excel公式,则可以选择使用循环,这意味着您的代码将变为:
Dim KR As Long, x As Long
KR = ActiveSheet.Range("K" & Rows.Count).End(xlUp).Row
Range("M1").EntireColumn.Insert
Range("M1").Select
ActiveCell.FormulaR1C1 = "Status"
For x = 0 To (KR - 2)
If Range("K2").Offset(x, 0).Value = "No" Then
Range("M2").Offset(x, 0).Value = "Pipeline"
ElseIf Range("K2").Offset(x, 0).Value = "Yes" Then
Range("M2").Offset(x, 0).Value = "Pending"
End If
Next x
答案 2 :(得分:0)
似乎问题是从M2复制值的最后。
您使用的是if 功能,设置为M2 =if(K2="NO";"Pipeline";"Pending")
,然后粘贴值。
Range("M2").Value = "=IF(K2=""No"",""Pipeline"",""Pending"")"