在vba 2010中将公式声明为变量

时间:2017-11-29 17:04:46

标签: excel excel-vba variables excel-formula excel-2010 vba

我已经绞尽脑汁2天了解我为什么不能这样做,所以经过多年的搜索,我发布了第一个问题。

我将公式存储在工作簿的表中。该表名为Adjustments。在同一工作簿中的另一个工作表中,我根据贷款编号查找公式。在我复制工作表并将其另存为单独的文档之前,我想用查找的公式替换查找公式,并将其保留为活动公式,而不仅仅是它计算的值。

目前在单元格E6中的查找公式是: =(INDEX(调整,MATCH(Loan_No,调整[贷款号],0),COLUMN(调整[GPR Adj])))

引用的公式是:

= IF(AND(COM_GPR_ACT<> 0,OR([@ [Vacancy Assumption]] + COM_OCC_ACT< = 100%,IFERROR(((COM_VAC_RPTD / COM_GPR_RPTD)> [@ [Vacancy Assumption]]),FALSE ))),0,(COM_RENTS_ACT * COM_NRSF-COM_GPR_ACT))

我想将索引/匹配公式替换为它正在查找的单元格中的公式。

以下是我尝试使用的代码。

Dim GPR As String
GPR = [INDEX(Adjustments,MATCH(Loan_No,Adjustments[Loan No],0),COLUMN(Adjustments[GPR Adj]))].Formula
Range("E6").Formula = GPR

当我使用它时,我得到运行时错误' 1004':应用程序定义或对象定义错误。

我已经尝试将评估应用程序更改为.Value但是这给了我两个公式的最终值。似乎如果我有Excel 2013,我可以使用[FormulaText(GPR)]。

我正在努力避免复制和粘贴公式,因为我想要替换大约25个单元格而且我不想减慢宏,因为这只是运行的几个子单元中的一个。它似乎应该是一个简单的答案,但我还没有发现它。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

如果它是单元格E6中的有效公式,这应该有效,所以我怀疑公式存在问题。

可能错误的是您正在使用不合格的结构化表格引用,如[@ [Vacancy Instruction]] - 尝试使用表名为它们添加前缀。

答案 1 :(得分:1)

好的,那里有非常时髦的要求。一种方法是执行以下操作。

  1. 转到“菜单”,然后选择“文件” - >“选项”,然后选择“公式”选项卡。
  2. 选中R1C1参考样式的复选框,然后单击确定以调低对话框。
  3. 在工作表上,从“公式”功能区中选择“名称管理器”。
  4. 在名称管理器中定义名为“ToMyLeft”的名称,并在“引用”框中输入= Sheet1!RC [-1]
  5. 现在您已经定义了一个相对名称,该名称始终指向使用其中的单元格左侧的单元格!放弃时髦。花一些时间来吸收它。

    现在你可以写这样的公式了

    =ADDRESS(ROW(ToMyLeft),COLUMN(ToMyLeft))
    

    这将给出左边的单元格地址,这是一个单元格地址。因此,当在单元格F7中执行时,返回$ F $ 6。这应该给你一个最终公式的家的钩子。你仍然需要一些VBA函数来执行它,例如。

    Option Explicit
    
    Function FunkyIndirectFunctionEval(ByVal sCellAddress As String)
    
        Dim ws As Excel.Worksheet
        Set ws = ActiveSheet '<--- if you workbook spans several sheets you'll need to handle the sheets, second param?
    
    
        Dim rng As Excel.Range
        Set rng = ws.Range(sCellAddress)
    
        Dim vEval As Variant
        FunkyIndirectFunctionEval = Application.Evaluate(rng.Formula)
    
    End Function
    

    但这会产生公式背景问题,因为人们正在从其上下文中剥离公式。我没试过这个,我说成功的几率是25%!

    不要忘记在选项对话框中将RC参考更改回A1参考。