【问题标题】:vba - worksheet references in formulavba - 公式中的工作表引用
【发布时间】:2015-08-03 08:53:28
【问题描述】:

我想不通。我试图让我的公式更加动态。但它总是说找不到prev,但我将prev设置为工作表。 PrevSheetName 返回上一个工作表的名称(有效)。 请帮助我,在我的其他代码中,我一直尝试使用“ActiveSheet.Previous”,但它似乎不适用于公式。

Set prev = Worksheets(PrevSheetName)
Set rng = ActiveSheet.Range("D3")
rng.FormulaR1C1 = "=SUMIF(prev!C[1],RC[-2],prev!C[5])"
Range("D3").Copy Range("D4:D" & lRow)

这是我的第一个代码并且有效

Set rng = ActiveSheet.Range("D3")
rng.FormulaR1C1 = "=SUMIF('Projekt 1'!C[1],RC[-2],'Projekt 1'!C[5])"
Range("D3").Copy Range("D4:D" & lRow)

这是我的 PrevSheetName,已将名称放入 " "

Function PrevSheetName(Optional ByVal WS As Worksheet = Nothing) As String
    Application.Volatile True
    Dim S As String
    Dim Q As String
    If IsObject(Application.Caller) = True Then
        Set WS = Application.Caller.Worksheet
        If WS.Index = 1 Then
            With Application.Caller.Worksheet.Parent.Worksheets
                Set WS = .Item(.Count)
            End With
        Else
           Set WS = WS.Previous
        End If
        If InStr(1, WS.Name, " ", vbBinaryCompare) > 0 Then
            Q = "'"
        Else
            Q = vbNullString
        End If
    Else
        If WS Is Nothing Then
            Set WS = ActiveSheet
        End If
        If WS.Index = 1 Then
            With WS.Parent.Worksheets
                Set WS = .Item(.Count)
            End With
        Else
            Set WS = WS.Previous
        End If
        Q = vbNullString
    End If
    PrevSheetName = Q & WS.Name & Q
End Function

我只想将“Projekt 1”与上一张表交换

【问题讨论】:

  • 如我所见,您使用“prev”作为公式的一部分,就像您在 Excel 工作表中键入它一样,而不是作为 VBA 变量。试试这个:用"=SUMIF(" & prev.name & "!C[1],RC[-2]," & prev.name & "!C[5])" 替换"=SUMIF(prev!C[1],RC[-2],prev!C[5])" 您在vba 中执行的过程与手动将公式输入Excel 单元格相同。这意味着工作表的名称必须是单元格值的一部分,而不是变量名。
  • 谢谢,但是我该如何解决呢?
  • 我很早就提交了评论 ;-) 现在已经修复了
  • 尝试在 excel 表中手动获取此公式一次,然后使用 vba 重建它。使用 watch-object 来找到 prev-object 的正确值

标签: excel vba reference worksheet-function worksheet


【解决方案1】:

如果您的工作表名称包含空格和连接,则需要在公式中的名称周围添加 ',例如 "=SUMIF('" & PrevSheetName & "'!C[1],RC[-2], '" & PrevSheetName & "'!C[5])"

【讨论】:

    【解决方案2】:

    prev 是公式的文字部分。它正在寻找名为“prev”的工作表。您需要连接公式:"=SUMIF(" & PrevSheetName & "!C[1],RC[-2]," & PrevSheetName & "!C[5])"

    【讨论】:

    • 你实际上需要prev.Name和公式的两个部分。
    • PrevSheetName 给我一个字符串(例如“sheet1”)
    • 嗯,还是不行。该公式仍会搜索名为 PrevSheetName 的工作表,而不是此函数返回的名称
    • @Anneh,你确定你输入了提供的公式吗?在第一个 llok 上,它也必须工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多