- ベストアンサー
エクセルでの自動計算と手動計算
4枚のシートからなるファイルがあります。 【シート1】インターフェース(変動要因の数値を入力する) 【シート2】最終的な計算結果を表示する 【シート3】DBその一 【シート4】DBその二 という構造です。 シート1で入力した数値によってシート3を参照し、シート1の次の選択肢が変更され、シート4がそれによって変動し、最終的にシート2に反映されるという構造です。 シート1 ↓ シート3 ↓ シート1 ↓ シート4 ↓ シート2 がフローチャートで全てのシートに関数があります。 関数及びデータが膨大なためファイル容量が3Mほどあり、 選択肢を変動させるのにとても時間がかかって困っています。 そこで、 シート4 ↓ シート2 の部分だけ、自動で計算されずに、 何らかの指令を下してから、 計算されるような制御が可能でしょうか? (マクロ等で) 可能であればどのような方法をとればよいでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Private Sub Worksheet_Change(ByVal Target As Range) からシート4を削除するのはOKです。 Sub ボタン1_Click() にシート4を追加する必要はありません。 Application.Calculate で全部のシートの再計算を行っています。
その他の回答 (3)
- arata
- ベストアンサー率49% (139/279)
ご質問は、 シート1 ↓ シート3 ↓ シート1 ↓ シート4 この流れの間は、計算はさせたいが、 シート4 ↓ シート2 については、シート2の計算をとめておいて、シート4までが確定したところで、シート2の計算を一気にやらせたいということだと解釈したのですが、間違っていたらごめんなさい。 お話の感じだと、現在は、マクロを使用せず、VLookupなどのデータベース関数などで処理を行っているのだと思います。 また、最終的にシート2の結果を見るときは、ボタンなどを用意して、シート2を選択させるのではなく、ご自分でシート2をクリックして見ているのではないでしょうか? これを前提条件として、(うまくいくかどうか、詳しい情報がないため、判断できないのですが、)このようにしてみてはいかがでしょうか 1.このブックを開いたら、自動計算しないようにする。 2.シート1の内容が変わったら、シート1、シート3とシート4の計算を実行させる。 3.シート1にボタンを配置し、全ての選択が終わったらこのボタンを押すことにし、このボタンによって、シート2の計算を実行させる。 4.このブックが閉じるときには、自動計算をする状態に戻す。 まず、対象のブックを開いた状態で、ALTキーを押しながらF11キーを押してください。これでVisual Basic Editorが起動します。 左上のプロジェクトエクスプローラーにあるThisworkbookをダブルクリックして、右側のコードウィンドウを開き、下記を記述します。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.Calculation = xlCalculationAutomatic End Sub Private Sub Workbook_Open() Application.Calculation = xlCalculationManual End Sub これは、最初のが、ブックが閉じるときに、計算の機能を自動にするもの。あとのが、ブックが開いたときに自動計算を手動にするものです。 次に、左上のプロジェクトエクスプローラーのシート1をダブルクリックして、右のコードウィンドウにシート1のモジュールを開き、下記を記述します。 Private Sub Worksheet_Change(ByVal Target As Range) Worksheets("シート1").Calculate Worksheets("シート3").Calculate Worksheets("シート1").Calculate Worksheets("シート4").Calculate End Sub 計算の順番が、問題になるかもしれません。 Visual Basic Editorを閉じて、ブックのシート1にボタンを貼り付けます。 メニューの[表示]-[ツールバー]-[フォーム]にあるボタンを押して、シート上にボタンを貼り付けます。 ボタンを貼り付けるとマクロの登録のダイアログが開くので、[新規作成]のボタンをクリックします。 Sub ボタン1_Click() End Sub こういうのができると思います。これを編集します。 Sub ボタン1_Click() Application.Cursor = xlWait Application.ScreenUpdating = False Application.Calculate ThisWorkbook.Worksheets("シート2").Select Application.ScreenUpdating = True Application.Cursor = xlDefault End Sub マウスカーソルを、砂時計にして、計算速度を上げるため、画面表示の更新を止めて、計算を実行、シート2を選択、画面の更新を行い、マウスカーソルを元に戻す。 ということをやっています。 以上で、終わりです。 シート1、シート2、シート3、シート4は実際のシートの名前に修正してください。 前提条件が間違っていたらまるっきり駄目かもしれません。また、計算の順番で間違った答えがでるかもしれませんので、ご注意ください。
補足
ご丁寧な回答ありがとうございます。 ご指摘のとおり、ひたすらVLOOKUPで引き当てているようなファイルです。 シート2を見るときは、シート1からハイパーリンクでシート2を繋いでみています。 そして、私の表現が悪かったのですが、 シート4とシート2の計算を止めたかったのです。Private Sub Worksheet_Change(ByVal Target As Range) Worksheets("シート1").Calculate Worksheets("シート3").Calculate Worksheets("シート1").Calculate Worksheets("シート4").Calculate のシート4の部分を削除して、 Sub ボタン1_Click() Application.Cursor = xlWait Application.ScreenUpdating = False Application.Calculate ThisWorkbook.Worksheets("シート2").Select Application.ScreenUpdating = True Application.Cursor = xlDefault End Sub に、シート4も計算するというようなことを、 付け加えればよいのでしょうか。
- kj_
- ベストアンサー率39% (9/23)
それでは 先ほどの補足をさせていただきます。 マクロ等で記述した場合、おのおの実行させる関数(ファンクション)を用意しますよね。 その関数の一番初めでよろしいのではないでしょうか? 例) function テスト処理!! '処理を行っている場合だげ、自動計算を行わない Application.Calculation = xlManual ・ ・ (処理) ・ '処理が終了するので自動計算を行う Application.Calculation = xlAutomatic end function また、この命令は、セルの自動計算を手動/自動とするものです。 手動にした場合は、次の自動にする命令がくるまで、ずっと手動になってしまいますのでご注意を・・・・・(また逆も同じ)
お礼
補足をありがとうございました。 参考になりました。ありがとうございます。
- kj_
- ベストアンサー率39% (9/23)
自動計算を止める物ならば、ありますよ '計算方法 => 手動 Application.Calculation = xlManual '計算方法 => 自動 Application.Calculation = xlAutomatic 但し、方法を用いると、全体のセルの自動計算がストップします。
補足
早速のご対応ありがとうございます。 このコマンド? は、どこにどのように書き込めばよろしいでしょうか? マクロやVBAの知識が乏しいもので、 ご教示いただけましたら幸いです。
お礼
arataさん、109111の際もお世話になりました。 詳しい説明により、 アウトラインが見えて来たおかげで、 思うように仕上げられました。 ありがとうございました!