2015-05-04 161 views
1

我一直在试图让一个宏在我构建的电子表格中为我创建一个新列。它将从列K中选择是或否,并根据是或否来使用待定或管道填充新列。Excel中的IF语句VBA

下面是我一直使用的代码 - 但这恰恰标志着一切,管道:

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

看来问题在于你从M2复制的最后。

您使用的是if 函数,即设置M2 =if(K2="NO";"Pipeline";"Pending"),然后粘贴值。

Range("M2").Value = "=IF(K2=""No"",""Pipeline"",""Pending"")"

+0

嗨, 本来我尝试了以下,但我得到一个编译“No”上的错误: Range(“M2”)。FormulaR1C1 =“= IF(K2 =”No“,”Pipeline“,”Pending“)”' 'Range(“M2”)。 :=范围(“M3:M”&KR)' –

+0

哦,您只需要使用引号转义引号内的引号: '范围(“M2”)。值=“= IF(K2 =”“否”“”“管道”“”,“”待定“”)“' – JBiserkov

+0

非常感谢你 - 这个公式现在已被识别,但我遇到了另一个问题:将公式中的单元格保留为K2不会将其链接到表格中的K2。 我已经在宏中使用以下代码连接了一个月份公式,但我忘记了RC [-1]的来源。 'Dim MR As Long' 'MR = ActiveSheet.Range(“C”&Rows.Count).End(xlUp).Row' 'Range(“D2”)。FormulaR1C1 =“= TEXT(RC [ 1“,”“mmmm”“)”' '范围(“D2”)复制目标:=范围(“D3:D”&MR)' –

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

的,如果你正在使用的语句在VBA代码运行时使用的是这样的价值输入到单元格M2的内容只是“管道”或“待定”。因此,当您复制行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