Excel VBA Calculateメソッドは配列の数式を更新しません。 #N/Aとして表示

私はお互いのキーをオフにExcelで一連の配列の数式を持っています。これらは、独自のExcelアドインを使用して生成された一連のデータに合わせて自動的にサイズが変更されます。

しかし、私のコードが配列式のいくつかを正しい新しいサイズに書き換えるときは、シート上の別の無関係なセルを編集するか、シートを保存するか、またはF9を押すまで、セルはすべて#N/Aとして表示されます。

Application.Calculate、ActiveSheet.Calculateなどのコードを使用しても効果はありません。

ただし、SendKeys "{F9}"を使用しています。

例として、これらはシート上の2つの式です。

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

そして

={LARGE(OFFSET($J$1,0,0,ROW()),1)}

最初の数式は、セルの範囲にプログラムで書き込んだ後で正常に動作します。それは、単にテキストが入っているセルの行番号を伝えます。

2番目の式は、セル範囲にプログラムで書き込んだ後は機能しません。これは、以前に番号リスト(最初の数式の出力)に表示されていた最大の行番号を私に与えます。 F9キーを押すと、2番目の式が正しく更新されます。 VBAでApplication.Calculateを実行すると、何も起こりません。私はまた、ワークシートレベルで利用可能なさまざまな他の再計算メソッドも試しましたが、運はありません。

誰かが前にこのような何かを遭遇しましたか?

edit: The resize code essentially boils down to something like this (stripping out all of the support code that allows me to make more generalized calls to it):

まず、私は:

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

ナットシェルでは、数式のコピーを作成し、範囲をクリアしてから書き直します。

2
あなたは完全なコードを投稿することはできますか?
追加された 著者 brettdj,
私はxl2003であなたの問題を複製することができますが、興味深いことに、xl2010ではうまくいきました。私は計算などを強制するための変種を試しました。結局、強制的に式を強制的に強制的に強制的に強制的に強制的に揮発性にする唯一の方法は、である。興味深い質問の場合+1。あなたはxl03で働いていますか?
追加された 著者 brettdj,
私はサイズ変更コードの基礎を追加しました。特別なものではありません。配列の数式をオンラインで自動的にサイズ変更する方法については、オンラインで100回以上のディスカッションが行われていると思いますか?
追加された 著者 acee,
@brettdj:情報ありがとう!私は実際に2007を使用しています。私はどこかでOFFSETが揮発性の関数であると考えられていたと思っていましたが、そうは思いません...とにかく、RAND()を追加すると、Calculateが呼び出されたとき。私はそれが私の目的にとって合理的な回避策だと思う。ヒントをありがとう!
追加された 著者 acee,
まだExcel 2016でこの問題があります。
追加された 著者 American Luke,

5 答え

あなたがそれらを打ち負かすことができない場合、それらに参加してください。

SendKeys "{F9}"
3
追加された

私はあなたがこのアプローチを実装しているという前提で上記のコメントを完成させました

このコードを使用する

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
  • xl03は数字を与えますが、セルを正しく更新するにはcalcが必要です。
  • xl07は "#N/A"を返します(ステータスバーに計算を表示します)。
  • xl10はうまく動作します

完全な依存関係ツリー再構築作業を含む計算オプションのどれも指摘していないので

上記の RAND の提案を使用するとxl07で強制的に更新されます

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula

OFFSET is a volatile function see Voltatile Excel Functions (which includes a file that tests volatility)

おそらく、チャールズ・ウィリアムズはこれについていくつかの光を放つことができます、私は彼にpingします

2
追加された

2003年と2007年のFormulaArrayのバグのようです。
式を単純化すると、Range( "a1:A5")を使用することになります。= LARGE(OFFSET($ J $ 1,0,0、ROW())、1)配列式

1
追加された
先端に感謝、チャールズ!私が使用している他の配列の式と一貫性を保つと思いますが、私はそれらの式を当面は揮発性にすることを試みます。
追加された 著者 acee,

私の思い出は、 Application.CalculateFull メソッドもあるということです。

0
追加された
返信いただきありがとうございます。残念ながら、私が試したことから、 Application.CalculateFull Application.CalculateFullRebuild のどれも動作しません。私は最初にDirtyとしてRangeをマークしようとしましたが、予想通りに動作していないようです。 (F9を押すか手動でセルを簡単に編集しない限り、まだ#N/Aとして表示されます)。
追加された 著者 acee,

私の細胞は、彼らが頼っている範囲が変更された後も元気ではなかった。 私はまた、それぞれを編集し直して再計算する必要がありました。

溶液:

数式内で完全修飾参照を使用します。 例えばこの YourFunction(G200:H700)のような式は、この YourFunction( 'Your Sheet Name'!G200:H700)のように変更する必要があります。

自動リフレッシュは私にとって完璧に機能するようになりました。

0
追加された