【问题标题】:How to place IF statement in next available column in Excel VBA?如何将 IF 语句放在 Excel VBA 的下一个可用列中?
【发布时间】:2017-08-09 14:34:59
【问题描述】:

我正在尝试将 IF 语句放置在第 2 行的下一个可用列(动态)中。一旦 IF 语句位于该单元格中,我想从该单元格中添加最后使用的行(动态)中的值柱子。我一直无法将 IF 语句编码到 VBA 中。我还需要对其进行编码的帮助,以便使用 IF 语句将列中的最后一行添加到单元格中。到目前为止,这是我的代码:

Sub vlookupF5()
Dim SourceLastRow As Long
Dim OutputLastRow As Long
Dim sourceSheet As Worksheet
Dim outputSheet As Worksheet

Dim NextColumn As Long
Dim ColumnStr As String
Dim ColumnStr2 As String
Dim ColumnStr3 As String
Set sourceSheet = Worksheets("Actuals")
Set outputSheet = Worksheets("Pivot")
With sourceSheet
    SourceLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

With outputSheet
    NextColumn = .Cells(2, Columns.Count).End(xlToLeft).Column + 1
    If NextColumn + 1 < 27 Then
        ColumnStr = Chr(64 + NextColumn + 1)
    Else
        ColumnStr = Chr(64 + Int((NextColumn + 1) / 26)) & Chr(64 + ((NextColumn + 1) Mod 26))
    End If
    If NextColumn - 1 < 27 Then
        ColumnStr3 = Chr(64 + NextColumn - 1)
    Else
        ColumnStr3 = Chr(64 + Int((NextColumn - 1) / 26)) & Chr(64 + ((NextColumn - 1) Mod 26))
    End If
    If NextColumn < 27 Then
        ColumnStr2 = Chr(64 + NextColumn)
    Else
        ColumnStr2 = Chr(64 + Int((NextColumn) / 26)) & Chr(64 + ((NextColumn) Mod 26))
    End If
    OutputLastRow = .Cells(.Rows.Count, "D").End(xlUp).Row - 1
    Worksheets("Pivot").Activate
    .Range(Cells(2, NextColumn), .Cells(2, NextColumn)).Formula = _
    "=IF(R3C5=""Feb"",Actuals!R133C22,IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600),IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24),IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25),IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26),IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27),IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28),IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29),IF(R3C5=""Oct"",SUM" & _
                                                                  "!R133C22:R133C30),IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31),IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32),"""")))))))))))" * .Cells(OutputLastRow, NextColumn)
End With
End Sub

我一直在努力

“错误 13:类型不匹配”

对于这一行:

"=IF(R3C5=""Feb"",Actuals!R133C22,IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600),IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24),IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25),IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26),IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27),IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28),IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29),IF(R3C5=""Oct"",SUM" & _
            "!R133C22:R133C30),IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31),IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32),"""")))))))))))" + .Cells(OutputLastRow, NextColumn)

谁能帮忙??

【问题讨论】:

  • 您是否尝试过在您的月份周围使用单引号而不是双引号?以您的方式进行操作会导致 VBA 认为 Feb 是某种未正确连接的变量。
  • 你能详细说明你的脚本是如何没有按预期工作的吗?
  • @nbayly 我已经更新了这个问题。我收到错误 13:当我尝试将 if 函数放入时类型不匹配
  • 这样......"=IF(R3C5='Feb',A
  • 您需要使用另一组双引号对公式中的双引号进行转义。例如。 SomeCell.Formula = "=IF$E$3=""Feb"",RestOfFormulaHere"

标签: vba excel if-statement


【解决方案1】:

您正在尝试将数值添加到字符串文字中,但这是行不通的:

.Range(Cells(2, NextColumn), .Cells(2, NextColumn)).Formula = _
    "=IF(R3C5=""Feb"",Actuals!R133C22,IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600),IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24),IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25),IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26),IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27),IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28),IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29),IF(R3C5=""Oct"",SUM" & _
                                                                  "!R133C22:R133C30),IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31),IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32),"""")))))))))))" + .Cells(OutputLastRow, NextColumn)

让我们分解一下:

Dim sLongFormula$
sLongFormula = "=IF(R3C5=""Feb"",Actuals!R133C22,IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600),IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24),IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25),IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26),IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27),IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28),IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29),IF(R3C5=""Oct"",SUM" & _
                                                                  "!R133C22:R133C30),IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31),IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32),"""")))))))))))"

所以你最终得到的是:

.Range(Cells(2, NextColumn), .Cells(2, NextColumn)).Formula = sLongFormula  + .Cells(OutputLastRow, NextColumn)

You simply can't add numeric values to a string in VBA(不过,使用 &amp; 连接器而不是 + 会执行数字 => 字符串的隐式类型转换)。

我认为你真正需要的是:

.Range(.Cells(2, NextColumn), .Cells(2, NextColumn)).Formula = _
    sLongFormula & "+" & .Cells(OutputLastRow, NextColumn)

注意在.Cells(2, NextColumn) 中添加前导. 以前,您会得到一个1004,因为您刚刚激活了数据透视表,但是您在With 块内定义了一个范围,这是不可能的构建一个包含跨越多个工作表的单元格的范围。

__

你的公式看起来很可疑,如果你用更多的换行符来分解它,你有:

sLongFormula = "=IF(R3C5=""Feb"",Actuals!R133C22,
            IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600), _
            IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24), _
            IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25), _
            IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26), _
            IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27), _
            IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28), _
            IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29), _
            IF(R3C5=""Oct"",SUM" & _
                                    "!R133C22:R133C30), _
            IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31), _
            IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32), _
            """")))))))))))"

所以你缺少一个左括号和Actuals Oct 条件:

sLongFormula = "=IF(R3C5=""Feb"",Actuals!R133C22,
            IF(R3C5=""Mar"",SUM(Actuals!R133C22:R133C600), _
            IF(R3C5=""Apr"",SUM(Actuals!R133C22:R133C24), _
            IF(R3C5=""May"",SUM(Actuals!R133C22:R133C25), _
            IF(R3C5=""Jun"",SUM(Actuals!R133C22:R133C26), _
            IF(R3C5=""Jul"",SUM(Actuals!R133C22:R133C27), _
            IF(R3C5=""Aug"",SUM(Actuals!R133C22:R133C28), _
            IF(R3C5=""sep"",SUM(Actuals!R133C22:R133C29), _
            IF(R3C5=""Oct"",SUM(Actuals!R133C22:R133C30), _
            IF(R3C5=""Nov"",SUM(Actuals!R133C22:R133C31), _
            IF(R3C5=""Dec"",SUM(Actuals!R133C22:R133C32), _
            """")))))))))))"

我还注意到,三月是 C600,但所有其他月份都是从 24 开始索引的,等等。奇怪的是,二月根本不是 Sum 函数。对于您的用法,这两个怪癖可能正确,但它们在我看来不一致。

您也可以使用某种查找或SumIf/SumIfs 函数来简化这个可怕的函数。

【讨论】:

  • 我其实不是故意放 * 的,我把它改成了加号。我正在尝试使用 if 函数将该列最后使用的行中的值添加到单元格中。
  • 喜欢这个? ....Formula = sLongFormula &amp; "+" &amp; .Cells(OutputLastRow, NextColumn)
  • 是的,完全一样...假设 if 语句是正确的,这是我遇到的另一件事。
  • 请注意,您可能还可以使用某种索引/匹配/查找或 SumIf/SumIfs 来简化该 longass 公式。
  • 我无法为您提供If 功能。你应该在工作表本身上弄清楚这一点,一旦你让它(手动)工作,然后将它移入你的 VBA 代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2017-11-30
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2016-04-25
相关资源
最近更新 更多