用于创建公式的 Excel 宏工作正常。复制和粘贴公式的宏离开#Values

Posted

技术标签:

【中文标题】用于创建公式的 Excel 宏工作正常。复制和粘贴公式的宏离开#Values【英文标题】:Excel Macro to create formula works fine. Macro to copy and paste formula leaves #Values 【发布时间】:2017-07-27 16:57:01 【问题描述】:

我编写了一个用户定义函数来获取单元格的颜色。

Function GetFillColor(Rng As Range) As Long
    GetFillColor = Rng.Interior.ColorIndex
End Function

函数有效。

我编写了一个宏来在电子表格上使用该函数:

    Sub Macro5()

     Macro5 Macro                 
        Windows("KobeCurrent2.xlsm").Activate
        Sheets("Direct").Select
        Range("AP2").Select
        ActiveCell.FormulaR1C1 = "=NUMBERVALUE(GetFillColor(RC[-26]))"
        Range("AP2").Select
        Dim LR As Long
     LR = ActiveSheet.UsedRange.Rows.Count
    Range("AP2").Select
    Range("AP2").AutoFill Destination:=Range("AP2:AP" & LR)

End Sub

Cell AP2 显示单元格颜色的值。 AP 列中的其余单元格显示#Value! 直到我双击#Value!,然后它变为单元格颜色的值。

我尝试将单元格乘以 1,使用数据文本到列,但是当通过 excel 宏执行时,我仍然得到 #Value!而且还是需要双击才能解决。

任何帮助将不胜感激。谢谢。

【问题讨论】:

您必须小心依赖于 Range 的非值方面的 UDF。特别是,在这里,您可能只需要强制重新计算即可获得更新。使用CTRL+ALT+F9 最容易做到这一点,它将更新所有单元格。通常,Excel VBA 交互不支持在发生非值更改时更新引用。因此,更新单元格颜色,公式不会为依赖单元格触发,因为 Excel 不会将其视为更改。要处理此问题,您通常将 UDF 标记为 Application.Volatile 作为 UDF 的第一行。 【参考方案1】:

我测试了您的脚本,但出现#NAME 错误,因此我对其进行了修改以将值放在 AP2 等中,而不是公式中。这可能不是您想要的,但很容易修改。希望这有助于或让您朝着正确的方向前进。

Sub Macro5() ' ' Macro5 Macro '

Dim LR As Long
LR = ActiveSheet.UsedRange.Rows.Count


Windows("KobeCurrent2.xlsm").Activate

For x = 2 To LR Step 1

    Range("AP" & x).Value = Range("A" & x).Interior.ColorIndex

Next x
 ' I left these in here for reference.
 'ActiveCell.FormulaR1C1 = "=GetFillColor(RC[-15])"    
 'Range("P2").AutoFill Destination:=Range("P2:P" & LR)
End Sub

【讨论】:

这当然解决了将ColorIndex 放入单元格的问题,但没有解释为什么UDF 最初会失败。 @Byron Wall 你当然是正确的,它失败的原因超出了我的理解范围,所以我只是把这个问题放在一边,寻找一个“可行的”解决方案。我相信大多数优秀的程序员都会称之为“黑客”。被指控有罪:)

以上是关于用于创建公式的 Excel 宏工作正常。复制和粘贴公式的宏离开#Values的主要内容,如果未能解决你的问题,请参考以下文章

Excel公式复制和粘贴具有相同列字母的单元格,但在粘贴时将行数增加7

插入行以及复制和粘贴值

插入公式后的宏延迟问题 - Excel

Excel 宏不会将工作表复制到新工作簿

怎么在复制excel格式时使其公式完全不变

用于将数据粘贴到新表行中的 VBA 宏 - Excel