Windows NTでExcel 2000を使っています。
Excel VBAでユーザー定義関数を作り、いろんな場合分けで計算できるようになったのはいいのですが、自動計算の Application.Volatile を文頭に置いているので操作のたびに再計算をして動作が遅くなってしまいました。この関数を使ったファイルに時間がかかるのは仕方ないことでも使っていないファイルまでたびたび再計算されてしまうのではさすがに困ってしまいます。数値を変更したときなど、自分の都合に合わせて再計算ができるようにならないものでしょうか。
他の方の質問を見たところ、文頭に手動化の文を置いて、最後に自動化の文を置くようアドバイスしてありましたがこれではファイルを閉じない限り再計算されないのではないかと心配になり、質問をしてみました。よろしくお願いします。(この文頭を持ったファイルを複数開いて作業しているのも関係あるのでしょうか?)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

EXcel2000は使ったこと無いのですが、97で私が使用している方法は、次のようなものです。


(1)文頭に Application.Calculation = xlCalculationManual(手動化)を置く。
(2)計算させたい個所に、Application.Calculate(再計算)を置く。
(3)文末に Application.Calculation = xlCalculationAutomatic(自動化)を置く。
これで手動化のまま再計算されるはずです。

この回答への補足

解答ありがとうございます。
ただちょっとわからないのは(2)の「計算させたい個所」とは具体的にどのあたりなのでしょうか?
計算式はIF構文とSelect Case…を組み合わせて作っているのですが
End Selectのたびに(2)を使えばよいのでしょうか?
お手数ですがよろしくお願いします。

補足日時:2001/11/29 10:11
    • good
    • 0

どの時点で再計算が必要になるかによります。



IF構文とSelect Caseをお使いとのことですが、この構文の中でセルに数値を入力する作業をしている場合、それにより変更された計算結果を構文の中で必要としているのでなければEnd Selectの後ろでいいと思います。

計算結果を必要とするまで、むだな再計算を用いなくて済むようプログラミングすることが大切であろうと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。とても参考になりました。
プログラミングについては必要個所だけかじった初心者なので
構文に必要・不必要の判断がまだまだ難しいのですが
これから色々勉強して使えるプラグラムを組めるようになりたいです。

お礼日時:2001/11/29 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルの関数?項目の種類を自動で計算したい

セルに、りんご、なし、みかん、、、、etc.沢山果物の名前が入っていたとします。その種類が全部でいくつあるか知りたいのです。
データの集計を使うとわかるとは思うのですが、その方法でなく、特定のセルにりんご、なし、みかんetc、、、全部で10種類とか出したいのです。
よろしくお願いします。

Aベストアンサー

作業列を作っても構わないのであれば、
A1:A10に果物の名前が入っていたとして、A12に果物の種類の数を入れるとした時、
・B列を作業列としてB1に=IF(COUNTIF($A$1:A1,A1)>1,1,"")といれて以下コピー
・A12に=COUNTA(A1:A10)-SUM(B1:B10)
・B列はB列全体を選択して右クリック→表示しない、で非表示にする
という方法もあります。

QExcelで、VBAのcase文のような使い方のできる関数(セルに入力して使う関数)はないでしょうか。

タイトルの通りなのですが、

たとえば、
A1のセルの値が 1 だったら B1は "仕入先"
A1のセルの値が 2 だったら B1は "得意先"
A1のセルの値が 3 だったら B1は "社員"
のようにしたいのです。

if文を駆使すれば可能なのは理解しているのですが、もう少しスマートに式を書けないかな、と思って質問しました。

Aベストアンサー

条件が少ない場合、
=IF(A1<>"",LOOKUP(A1,{1,2,3},{"仕入先","得意先","社員"}),"")や=IF(A1<>"",CHOOSE(A1,"仕入先","得意先","社員"),"")
条件が多い場合、
=IF(A1<>"",VLOOKUP(A1,$C$1:$D$m,2FALSE),"")
・関係表リストを別に設定します。
 C1(1),D1(仕入先)
 C2(2),D2(得意先)
 C3(3),D3(社員)
 Cn(x),Dm(yyy)

Qエクセル 時刻の計算(小数の計算) ファイルにより計算結果が異なる

時間の計算を15分単位で切下げるためFLOOR関数を使っています。
まったく同じ時間、関数なのにファイルにより計算結果が異なるので困っています。

具体例は

2016/8/04 18:00:00 に対し floor関数で15分単位で切り下げた場合、

Aのファイルは 2016/8/4 18:00:00
Bのファイルは 2016/8/4 17:45:00となります。

計算過程を確認したところ、
Aのファイルは FLOOR(42586.75, 0.010416667) = 42586.75
Bのファイルは FLOOR(42586.75, 0.010416667) = 42586.73958

と全く同じ関数、引数なのに、ファィルにより計算結果がことなっています。(同じPCです)

※上の42586.75 は2016/8/4 18:00:00のシリアル値
  0.010416667は 0:15:00 と入力したセルをC5と参照したところ表示された値です。
  
業務で使うため、計算結果がことなる理由を把握したいです。
どうぞよろしくお願いいたします。

時間の計算を15分単位で切下げるためFLOOR関数を使っています。
まったく同じ時間、関数なのにファイルにより計算結果が異なるので困っています。

具体例は

2016/8/04 18:00:00 に対し floor関数で15分単位で切り下げた場合、

Aのファイルは 2016/8/4 18:00:00
Bのファイルは 2016/8/4 17:45:00となります。

計算過程を確認したところ、
Aのファイルは FLOOR(42586.75, 0.010416667) = 42586.75
Bのファイルは FLOOR(42586.75, 0.010416667) = 42586.73958

と全く同じ関数、引...続きを読む

Aベストアンサー

あまり、大勢の人があれこれ違うことを言ってもしょうがない話ですが、この現象を、浮動小数点(丸め)誤差といいます。

ある意味では、時間丸め誤差といっても過言ではないのは、一般の浮動小数点誤差にはない現象が含まれます。

この浮動小数点誤差は、簡単にいえば、Excelは、2進で計算されているからということになるのですが、ベテランの人でも、なかなか気が付きにくい話なのです。

対策自体は、すでに出ている内容ですが、
一体、どうしてこうなったか、それが問題ですよね。

・2016/8/4 18:00:00 この表示されている日付時間はどうやって作ったか?
ドラッグコピーなどで作りませんでしたか?

時間の元の数字というのは、10進からすると無限小数でできていて、それをExcelでは時間表示で人間に分かるように、時間・分・秒で表示されます。その時に丸めているのですが、これを「時間丸め」といって、浮動小数点丸め誤差とは若干違う問題が含まれています。

おそらく、単独で入力したときには、間違いは出ないはずです。ところが、ドラッグコピー(フィルハンドルでドラックして連続した数字を出すこと)したり、時間値の無限小数を足し算・引き算を含め四則演算(今回のFLOOR関数も含めます)をすると、誤差が生じてしまいます。

元の数値の"18:00:00" は、若干数字が足りなくても、18:00:00と出てしまうのです。だから、[割り切れない数値]の時間値をドラッグコピーしてはいけないのです。

割り切れる数(0.5=30分,0.25=15分)

なお、日付は、整数ですから、問題は発生しません。

それでも、ドラッグコピーをしなくては大変だという時もあります。

画像でも分かるかとは思いますが、
=DATEVALUE("2016/8/4")+TIME(8,1*(ROW(A1)-1),0)
こんな数式を考えてみました。

他にも、値をコピーして、上書きにした後に、区切り位置で、改めて数値にする方法など、さまざまです。

もちろん、単独の場合は、皆様のご指摘の通り、時間文字列に、TIMEVALUE関数 や、"8:00"*1 でも、時間の数値になります。

プログラミングでは、整数法や小数点固定法(文字列にして数値に戻す)などがありますが、Microsoftでは、ROUND関数を勧めているような気がします。桁数は、必要に応じてですが、私は、昔の経験値で時間に対しては、小数点6桁を丸めるようにしています。

B4:
2016/8/4 08:02:00

=ROUND(B4,5) 42586.334720000000000  01:59.8  足りません。
=ROUND(B4,6) 42586.334722000000000  01:20.0

と差が出てしまいますが、今回のFLOOR関数では、その問題は出ません。

添付画像では、1分ごとで、1時間中に、正しいのは2つしかありません。後は、全部違ってしまいました。

何かのお役に立てれば幸いです。

あまり、大勢の人があれこれ違うことを言ってもしょうがない話ですが、この現象を、浮動小数点(丸め)誤差といいます。

ある意味では、時間丸め誤差といっても過言ではないのは、一般の浮動小数点誤差にはない現象が含まれます。

この浮動小数点誤差は、簡単にいえば、Excelは、2進で計算されているからということになるのですが、ベテランの人でも、なかなか気が付きにくい話なのです。

対策自体は、すでに出ている内容ですが、
一体、どうしてこうなったか、それが問題ですよね。

・2016/8/4 18:00:00 ...続きを読む

Qエクセルファイルをオープンしたときの再計算について

エクセルファイルをオープンすると自動的に再計算がされます。VBAを使って、Workbook_Open()で、再計算を止めると、当然、ブックを開いた時全てで再計算が停止してしまいます。
で、質問ですが、あるブックから他のブックを開いた時には、再計算を行なわない(あるブックにVBAを組み込んで・・(イベントは、ボタンにからめてもok!)にして、手動で他のブックを開いた時は、再計算を行なうようなことが出来るのでしょうか?
VBA初心者の僕として、精一杯考えたのは、親となるブックから、他のブックを開いた時に、他のブックのWorkbook_Open()イベントが始る前にWorkbook_Open()を書き込めればできると思うのですが?そんなこと無理なのでは?って思います。どなたか?詳しい方いませんでしょうか?宜しくお願い致します。

Aベストアンサー

こんにちは。KenKen_SP です。

> 他のブックのWorkbook_Open()イベントが始る前にWorkbook_Open()
> を書き込めればできると思うのですが?

VBA コードを VBA から書き込むのは可能なのですが、禁じ手ですし、
今後不可能になるかもしれません。

Workbook_Open ではなく、Activate イベントすれば、このコードが
書かれたブックだけで動作しますが、どうですか?

Private Sub Workbook_Activate()
  Application.Calculation = xlManual
End Sub

Private Sub Workbook_Deactivate()
  Application.Calculation = xlCalculationAutomatic
End Sub

QExcelで自動再計算されないようにしたいのですが。

セルE1に
「=A1:C1」または「=A1+B1+C1」
と入力した後、セルD1に数字を入力すると、セルE1の式が、自動で
「=A1:D1」または「=A1+B1+C1+D1」
に書き換えられてしまいます。
これを変更されないようにする方法は、何かあるのでしょうか?
オプションなど、一通り見てみたのですが、見つけられませんでした。
そこまで深刻な状況ではありませんが、それなりにちょっと困っています。
どなたか、分かる方がいらっしゃいましたら、ぜひ教えてください。

Aベストアンサー

以下の通り行って下さい。
・ツール→オプション→編集→リスト形式及び数式拡張するをチェックオフ
以上


このカテゴリの人気Q&Aランキング

おすすめ情報