「夫を成功」へ導く妻の秘訣 座談会

お世話になっております。
現在、EXCEL2000を使用しております。

ツール>オプション>計算方法 を「手動」にし、VBAで
任意に再計算を行っています。
このとき、計算方法が「自動」の時の再計算中と同じよ
うに、再計算の進捗状況をタスクバーに表示させたいの
ですが、どうしたらよいかご存知の方いらっしゃいまし
たら教えてください。
宜しくお願いします。

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

A 回答 (3件)

Aplication.ScreenUpdating = Falseから、trueにしてもだめだったということですが、ステータスバーに関しては、ScreenUpdating = Falseを一度実行してしまった場合は、trueにしても元に戻らなかったように思います。



ScreenUpdating = falseを最初からやめれば、進捗の%は表示されるようになると思います。

ただ、この箇所以外にも(前の処理で)ScreenUpdating=Falseを実行していて、外せない場合もあると思います。
このような場合には、再計算の前にブックを保存してやると、うまくいくようになると思います。


あまり自信がありません。間違っていたらすみません。

この回答への補足

すみません、「お礼」に書いたコメントの補足なのですが、
全てのScreenUpdatingの操作を止めなくても、教えて頂いた
内容の後半部分にあった様に、再計算を行う箇所の直前に
保存して、その部分だけScreenUpdatingの操作を止めたら、
再計算の進捗が表示されました。

どうもありがとうございました。

補足日時:2004/01/05 10:17
    • good
    • 0
この回答へのお礼

全てのScreenUpdatingの操作をコメントアウトして、
あと、ステータスバーへのコメントの表示も止めたら、
再計算の進捗が表示されるようになりました。

でも、複数のシートを使っている為に見た目
(エクセルOPEN時の動き等)が悪くなってしまいました。
全体の処理を見直したいと思います。

どうもありがとうございました。

お礼日時:2004/01/05 10:05

> 上記の部分をコメントにして行ってもやはり



コメントにしないで True にすれば、どうなりますか。

あとは、コードを提示しないと何とも言えないと思います。

この回答への補足

やはり何も表示されませんでした。
ちなみにコードは下記のようなものです。

With Application
.ScreenUpdating = False
Worksheets("○○統計").Calculate
.ScreenUpdating = True
End With

補足日時:2003/12/24 18:58
    • good
    • 0

例えば、ブック全体を再計算させる場合



Application.Calculate

と実行すると F9 を押したときと同じように、タスクバーではありませんが、
左側に「コマンド」と表示されている「ステータスバー」に進捗が % で表示
されますが、出ませんか?

それともExcelに無い機能を付加したい ということでしょうか。

この回答への補足

出来ませんでした...

Aplication.ScreenUpdating = False
にしてから再計算させている所為かと思い、
上記の部分をコメントにして行ってもやはり進捗は表示されませんでした。

>それともExcelに無い機能を付加したい ということでしょうか。

そんなことありません。
Excelにある機能で行いたいと思っています。

補足日時:2003/12/24 16:25
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qエクセル2003 リソース不足

ご質問です。

エクセルのマクロ実行中に下記エラーが出ます。
「リソース不足のため、このタスクを完了することができません。選択データを少なくするか、他のアプリケーションを終了して再度試してください。」
しかし、現在このエクセルのみを実行しています。
ただ、このエクセルファイルが5Mほどある大きなものです。
これが影響していますか?

もし、対処の方法がありましたら
お教え下さい。

よろしくお願い致します。

Aベストアンサー

こんにちは。

私は、アドバイスにも至らないけれど、スタック不足なら分かるけれど、リソース不足というのは、マクロのコード自体の問題ですが、たぶん、根本的なものです。おそらくは、コード全体を書き換えないと、直すことは不可能だと思います。私自身は、ブックのトラブル以外は、それは出しませんが、相談は以前受けたことがあります。残念ながらお断りしました。手が付かなかったのです。記録マクロではうまく行かないわけで、作り上げる前に、ある程度の設計をしないとダメなのです。

1.ループの中にRange 型のオブジェクト変数を置き、それを溜めて解放しない。
2.モジュールの中に、数式を数百も置き、それを、Formula プロパティで、それぞれ、セルに埋め込む。
この2点に限るように思います。

1.は簡単に直るけれども、2.は簡単ではありません。R1C1方式に慣れていれば、統一式が見出せるのですが、A1方式では、別々のものに見えてしまいます。それで、中身は同じ数式をいくつもマクロの中に書いてしまう例が多いです。まず、ダブりを省くことを考えます。

おそらく、コードを公開しない理由としては、コードが長すぎて、ここには書けない、ということではありませんか?

私の経験でお話を書かせていただきましたが、違っていましたら、ご容赦ください。

プロシージャは、基本的に、長くても100行程度を目処にします。そして、構造化していきます。また、モジュールは標準モジュールを使いわけます。ローカルモジュールには、あまり大きなものは入れない、というぐらいを、今は書いておきます。

こんにちは。

私は、アドバイスにも至らないけれど、スタック不足なら分かるけれど、リソース不足というのは、マクロのコード自体の問題ですが、たぶん、根本的なものです。おそらくは、コード全体を書き換えないと、直すことは不可能だと思います。私自身は、ブックのトラブル以外は、それは出しませんが、相談は以前受けたことがあります。残念ながらお断りしました。手が付かなかったのです。記録マクロではうまく行かないわけで、作り上げる前に、ある程度の設計をしないとダメなのです。

1.ループの中...続きを読む

Q【Excel】短時間で再計算をすませる方法

たくさんの計算式が入ったシートを保存しようとすると、再計算に入ってとても時間がかかることがあります。
設定で、手動で再計算にしちえるのですが少しでも計算を短くする方法があれば教えてください。

Aベストアンサー

計算式を(もちろん結果は同じになるよう)変える、配列数式を使わない、代入で出来るところは同じような式は入れない、などは出来ても、実際問題として、式を組み変えることは、質問とは別問題でしょうね。
だから式を今のままにして、計算だけ、エクセルの設定などで、早めることは、できるはずが無い。シートの式が決まれば、エクセルの同じプログラムが一気に走るはず。
ーー
ただその瞬間のそのパソコンの内部メモリやディスクの空き状態が影響するかもしれないというのは、ミクロで考えられるが、その場に即してのことを、我々がはっきりいえるだけの知識も持ってないでしょう。
ーー
VBAでプログラムをやれるなら、関数ーー>プログラムに組み替えて、早くなるケースはあるように思う。
計算速度ではないが、このコーナーの質問で、関数では式が長く思いつきにくい式だが、VBAでやると素直なロジックでやれるものも多いと思う。これも計算速度に影響すると思う。
ただ関数とVBAで実行速度はどちらが速いかは前もって、計算できるようなものではないとおもう。
やってみるしかない。
ーーー
VBAでは、ScreenUpdating=Falseという、画面更新について、計算の都度は、毎セルについて表示を行わないセルの設定も出来る。

計算式を(もちろん結果は同じになるよう)変える、配列数式を使わない、代入で出来るところは同じような式は入れない、などは出来ても、実際問題として、式を組み変えることは、質問とは別問題でしょうね。
だから式を今のままにして、計算だけ、エクセルの設定などで、早めることは、できるはずが無い。シートの式が決まれば、エクセルの同じプログラムが一気に走るはず。
ーー
ただその瞬間のそのパソコンの内部メモリやディスクの空き状態が影響するかもしれないというのは、ミクロで考えられるが、その場...続きを読む


人気Q&Aランキング