2

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 を実行しても、何も起こりません。ワークシート レベルで利用できる他のさまざまな再計算方法も試しましたが、うまくいきませんでした。

誰もこのようなことに遭遇したことがありますか?

編集: サイズ変更コードは基本的に次のようなものに要約されます (より一般化された呼び出しを可能にするサポート コードをすべて取り除きます):

まず、私は:

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

簡単に言えば、数式のコピーを作成し、範囲をクリアしてから書き直します。

4

5 に答える 5

3

勝てない場合は参加してください。

SendKeys "{F9}"
于 2012-02-06T21:56:41.497 に答える
2

あなたがこのアプローチを実装しているので、私は上記の私のコメントを具体化しました

このコードを使用する

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
  • xl03は数値を示しますが、セルを適切に更新するには計算が必要です
  • xl07は「#N / A」を与えます(そしてCalculateステータスバーに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揮発性関数です。揮発性Excel関数(揮発性をテストするファイルを含む)を参照してください。

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

于 2012-02-08T02:45:17.937 に答える
1

=LARGE(OFFSET($J$ 1,0,0
,ROW( )),1) は配列数式である必要はありません

于 2012-02-08T11:05:18.873 に答える
0

私の記憶では、方法もありますが、それはApplication.CalculateFull機能しますか?

于 2012-02-06T17:01:05.210 に答える