Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA计算方法不更新数组公式;显示为#不适用_Excel_Array Formulas_Vba - Fatal编程技术网

Excel VBA计算方法不更新数组公式;显示为#不适用

Excel VBA计算方法不更新数组公式;显示为#不适用,excel,array-formulas,vba,Excel,Array Formulas,Vba,我在Excel中有一系列的数组公式,它们相互之间相互关联。它们会自动调整大小,以适应通过专有Excel加载项生成的数据范围 但是,每当我的代码将某些数组公式重写为正确的新大小时,单元格都会显示为#N/A,直到您在工作表上编辑另一个不相关的单元格、保存工作表或按F9键 使用诸如Application.Calculate、ActiveSheet.Calculate等代码没有任何效果 但是,使用SendKeys“{F9}”则不会 例如,图纸上有两个公式: ={IF(LEN(INDEX(A:A, ROW

我在Excel中有一系列的数组公式,它们相互之间相互关联。它们会自动调整大小,以适应通过专有Excel加载项生成的数据范围

但是,每当我的代码将某些数组公式重写为正确的新大小时,单元格都会显示为#N/A,直到您在工作表上编辑另一个不相关的单元格、保存工作表或按F9键

使用诸如Application.Calculate、ActiveSheet.Calculate等代码没有任何效果

但是,使用SendKeys“{F9}”则不会

例如,图纸上有两个公式:

={IF(LEN(INDEX(A:A, ROW()))>0,ROW(A:A)+2)}

第一个公式在以编程方式写入一系列单元格后工作良好。它只告诉我包含文本的单元格的行号

第二个公式在以编程方式写入一系列单元格后不起作用。它给出了以前在数字列表中看到的最大行号(这是第一个公式的输出)。如果按F9键,第二个公式将正确更新。如果我在VBA中执行Application.Calculate,则不会发生任何事情。我还尝试了工作表级别的各种其他重新计算方法,但没有成功

以前有人遇到过这样的事情吗

编辑: resize代码本质上可以归结为如下内容(去掉所有支持代码,允许我对其进行更一般化的调用):

首先,我确实:

formula = dataSheet.Cells(startRow, startColumn).formula
随后:

Set DeleteRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(bottomBound, rightBound))
DeleteRange.ClearContents
Set DeleteRange = Nothing
随后:

Set resultRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(startRow + Height - 1, startColumn + Width - 1))
resultRange.FormulaArray = formula
Set resultRange = Nothing

在一个坚果壳中,我复制一个公式,清除范围,然后重写它

我记得还有一个
应用程序。可计算的
方法-有效吗?

如果你不能打败他们,就加入他们

SendKeys "{F9}"

鉴于您已经实施了这种方法,我已经充实了我的上述评论

使用此代码

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
  • xl03给出数字,但需要计算以正确更新单元格
  • xl07给出了“#N/A”(并在状态栏中提出了一个
    Calculate
  • xl10工作正常
正如您所指出的,包括完整依赖关系树重建在内的所有计算选项都不起作用

使用上面我的
RAND
建议确实会强制在xl07中进行更新

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula
OFFSET
是一个易失性函数,请参见(其中包括一个测试易失性的文件)


也许查尔斯·威廉姆斯能对此有所启发,我会在2003年和2007年将他定为一个方阵虫。

公式的一个更简单的旁路是使用范围(“a1:A5”)。公式而不是公式数组,因为=LARGE(OFFSET($J$1,0,0,ROW()),1)不需要是数组公式。修改它们所依赖的范围后,我的单元格也没有刷新。 我还必须手工编辑每一个,让他们重新计算

解决方案:

在公式中使用完全限定的引用。 e、 g.任何类似于
YourFunction(G200:H700)
的公式都应更改为类似于
YourFunction('Your Sheet Name'!G200:H700)


自动刷新现在非常适合我。

谢谢回复。不幸的是,根据我的尝试,
应用程序.CalculateFull
应用程序.calculatefullebuild
都不起作用。我甚至试着先把靶场标记为脏靶场,但它似乎不像我预期的那样有效。(除非我按F9键或手动对单元格进行简单的编辑,否则它仍然显示为“N/A”)。您可以发布完整的代码吗?看到调整大小会很有用,我添加了调整大小代码的基础。没什么特别的;关于如何在线自动调整数组公式的大小,我认为在线讨论有一百零一个?我可以在xl2003中复制您的问题,但有趣的是,它在xl2010中运行良好。我尝试了各种变量来强制计算等。最后,我能找到的唯一方法是立即强制公式自身更新,即使其不稳定,即
strFormula=“=LARGE(OFFSET($J$1,0,0,ROW()),1)+RAND()*0”
+一个有趣的问题。你在xl03工作吗?@brettdj:谢谢你提供的信息!我实际上使用的是2007。我想我在某个地方读到偏移量应该是一个易失函数,但我想不是。。。无论如何,在其中添加RAND()似乎有助于在调用Calculate时更新它。我认为这对我来说是一个合理的解决办法。谢谢你的提示!Excel 2016中仍然存在此问题。。。感谢微软。查尔斯,谢谢你的提示!我认为,为了与我正在使用的其他数组公式保持一致,我将尝试暂时使这些公式不稳定。
Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula