エクセル2010を使っておりますが、あるエクセルファイルにおいてSUMIFS関数を何万個と使っており、非常に重かったため、その関数を全て組み直しました。
INDEX、MATCHを組み合わせて(「INDEX(○○!$A:$G,MATCH($B14&N$1,○○!$A:$A,0),7)」というように組んであります)、SIMIFSやVLOOKUPを使わないようにしたのですが、それが原因なのかはっきりしないのですが、さらに重くなってしまいました。
SUMIFSを何万個と使っていたころは、ファイルを開くときは普通の動きで、フィルタやソートをかけたり編集したりするときにものすごく遅かっただけなのですが、今回の修正後は、開いた時点で「再計算 ○%」と表示されて、それが100%になって普通に開くところまでいくのに数分かかってしまいます。
また、どこかのセルをクリックしただけでも、同じく「再計算 ○%」と表示されてしまったり、保存するだけでも、同じく再計算が始まったりで、全く使い物にならない状態です。
(開くだけで再計算が始まるあたりも不思議です)
どうすれば軽くなるのか、ご教示願います。
No.3ベストアンサー
- 回答日時:
VLOOLUPとINDEX/MATCHの計算速度は、ほとんど変わらない。
ただし、MATCHを作業列に置くことで速度向上を図れる。
ちなみに、
>INDEX(○○!$A:$G,MATCH($B14&N$1,○○!$A:$A,0),7)
は
INDEX(○○!$G:$G,MATCH($B14&N$1,○○!$A:$A,0))
とすることが可能。
SUMIFSとSUMPRODUCTを使った数式は圧倒的にSUMIFSの方が早い。
問題のSUMIFSとINDEX/MATCHだが、比較対象になりえなかったので比較していない。
一般的にはINDEX/MATCHの方が早いはずだが、、、。
>どうすれば軽くなるのか、ご教示願います。
もし、すべてのシートにおいて、[Ctrl]+[End]で最終セルの位置を確認てみる。1048576行だったら問題あり。
名前の定義でエラーがあるものがない確認してみる。
揮発性関数を多用していないか確認してみる
RAND、NOW、TODAY、OFFSET、CELL、INDIRECT、INFO
※INDEX、ROWS、COLUMNS、AREASは揮発性関数ではありません
[Alt]+[Ctrl]+[Shift] +[F9] 完全な再計算(時間がかかると思う)を一度実行して、保存し閉じる。
とか
Excel97-2003形式で(別名で)保存してみる
その後、現形式で変換(ファイル - 変換)してみる
図のリンク貼り付けがあると遅くなる傾向にある
ありがとうございます。
開いた時点で再計算が始まってしまう件ですが、ファイルが壊れていたのかもしれません。新規でファイルを作って、内容をすべてコピペし、関数を修正して軽くすると再計算はなくなりました。
INDEXの作業列に置く件ですが、だいぶ軽くなりました。
勉強になりました。
No.4
- 回答日時:
#2の回答者です。
『Excel 2010 のパフォーマンス: 計算パフォーマンスの強化』
https://msdn.microsoft.com/ja-jp/library/office/ …
こちらの内容は、ちょっとややこしいですが、実に、興味深い内容です。
「計算に 1 ~ 10 秒かかるようになると、ユーザーは確実に手動計算に切り替えます。ユーザーのエラーが増え始め、不愉快になります。特に、その傾向は反復的な作業で顕著に見られ、思考の流れを保つのが困難になります。」
再計算時には、次の再計算のみが行われます。
「•変更された、または要再計算としてフラグが設定されたセル、数式、値、または名前。
•再計算が必要なセル、数式、名前、または値に依存しているセル。
•揮発性関数と条件付き書式。」
どうやらすべてではないらしいです。
揮発性関数のこともここで出てきます。
「RAND()、NOW()、および TODAY() 、OFFSET()、CELL()、INDIRECT()、および INFO() 」
以前は揮発性関数として記載されていたが、「INDEX()、ROWS()、COLUMNS()、および AREAS()」は揮発性関数ではなくなっている、ということです。
#2の書き込みで、
「INDEX(○○!$A:$G,MATCH($B14&N$1,○○!$A:$A,0),7)」
は、よく見たら配列を使っていませんでしたし、配列数式に換えても、ほとんどスピードは変わらなかったです。ただ、参照範囲が大きいか小さいかの違いは影響あるように思えます。
私が言いたいのは、一列全部とかいっても、2003では、全部は読まなかったようですが、今は、読んでいるという記憶があったからです。
上記のサイトでは、こう書いてあります。
「•配列数式や関数で使用する範囲のサイズを最小にします。」
「•配列数式やメガ関数は、別の補助的な列や行に分割します。」
「SUM や SUMIF などの関数で使用するセル数を最少にします。計算時間はセルの使用数に比例します (未使用のセルは無視されます)。」
ここらは、#3さんも一部ご指摘していただいているようですが、実証するには、ご質問者さんが試していただくのが一番早いような気がします。
返信遅くなって申し訳ありません。
再計算がされる条件など、大変勉強になりました。
詳しく教えていただいてありがとうございました。
No.2
- 回答日時:
こんにちは。
気にはしていたのですが、私は、マクロが専門で、数式の話にはややこしい話が多いのですが、たまたまですが、Microsoft でこんな内容を見つけました。なんとなく聞いていたのですが、Excel 2003以前と仕様が変わったという所がポイントだと思います。
私の話がわけが分からないのだったら、リンクだけでもみてください。
アプリ側で対処する方法としては、以下があります。
・Excel 大きなデータモデルの操作を取り消す機能を無効にする。
時間がかかる操作が発生したときに警告を表示する。
次の数(単位:1000個)以上のセルを処理する場合(U): 33,554
(今、試してみないので、ここの単位が良くわからないです。33,554 × 1,000 かもしれない)
『Excel 2010 のパフォーマンス: パフォーマンスの問題を最適化するヒント』
https://msdn.microsoft.com/ja-jp/library/office/ …
「全列および全行の参照」
「代替アプローチとして、全列の参照を使用することもできます ($A:$A など)。たとえば、この参照は列 A の行をすべて返します。したがって、データをどれだけ追加しても、追加したデータは必ず参照に含まれます。」
「•Excel 2007 よりも前のバージョンの配列数式は全列の参照を処理できません。Excel 2007 の配列数式は全列の参照を処理できますが、列のすべてのセル (空白セルを含む) が計算されるため、計算が遅くなることがあり、特に行数が 100 万を超えると、計算速度は低下します。」
という内容は、逆に、Excel 2007以降は、すべてを参照するということ?
そうしたら、かなりまずいですね。
「•Excel の多数の組み込み関数 (SUM、SUMIF) は、列内の最後に使用された行を自動認識するので、全列の参照を効率的に計算します。一方で、SUMPRODUCT などの配列計算関数は、全列の参照を処理することも、列内のすべてのセルを計算することもできません。」
これも、全部参照するということですよね。これもまずい、ということですね。
それでこういう数式に変わったのだろうと思いますが、
>「INDEX(○○!$A:$G,MATCH($B14&N$1,○○!$A:$A,0),7)
これもINDEX関数側が、配列ですから、結果的には、最後まで読んでいるわけですよね。配列数式は揮発性ですから、値を留めておくことができません。値をその都度求めようとするので、再計算が始まってしまいます。
プログラム的解決する(非VBA)
そこで、ユーザー定義関数(非同期のユーザー定義関数)が書かれていますが、この前も別の場所で書きましたが、今のところ、それはVBAではありませんので、ちょっと、実現するには時間がかかりそうです。
『非同期のユーザー定義関数』
https://msdn.microsoft.com/ja-jp/library/office/ …
ありがとうございます。
「Excel の多数の組み込み関数 (SUM、SUMIF) は、列内の最後に使用された行を自動認識するので、全列の参照を効率的に計算します。」の部分は弁筐になりました。
適当に参照の終わりがはっきりしないでも、A:Aのように書いても自動で認識されるということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Excel(エクセル) この関数の誤りを教えて下さい。 3 2023/08/08 07:36
- Excel(エクセル) エクセルで値ではなく関数を参照する方法 6 2023/03/19 00:50
- Excel(エクセル) この関数の間違いを教えて下さい 2 2023/08/07 22:40
- Excel(エクセル) エクセルでIF関数中にIFERROR関数を使いたいのですが???? 5 2022/04/08 13:24
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Excel(エクセル) エクセル 条件に合う日付に入力された時間数の合計したい 4 2022/06/17 22:18
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Excel(エクセル) エクセルのSUM関数について 4 2023/04/18 10:37
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルについて質問です。
-
エクセルの「入力規則」のプル...
-
VBAについての質問です
-
関数の説明
-
Excelについて
-
Excelにいついて質問です。
-
[オプション]の[アクセスビリテ...
-
一つのセルに(例えばA1)入力...
-
エクセルで特定のセルに入力が...
-
【マクロ】名前を保存する際に...
-
Excelの関数について教えてくだ...
-
UNIQUE関数が使えないバージョ...
-
エクセル共有したが、アクセス...
-
エクセルファイルがファイルの...
-
Excelで縦軸の書式を0:00形式の...
-
エクセル vbaについて教えてく...
-
【Excel】数字を3倍にし、なお...
-
エクセルVBA、別ブックへ転記す...
-
エクセルであるセルに数字を入...
-
エクセル マクロ チェックボックス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報