• ベストアンサー

エクセルマクロ中の再計算について

A1 -> 11(初期値) A2 -> if(A1>10,1,2) 上記の様に表にデータが入っている場合に以下のマクロを実行した時に再計算されずにマクロの処理が進み遅くなって再計算が実行されるため正確なマクロが実行されないのですが、どうしたら確実に再計算を実行したあとにマクロが処理を継続するようにさせる事が出来るのでしょうか、よろしくお願いします。なお、実際のマクロ及び関数は違います。 Range("A1").value = 1 Calculate if Range("A2").value = 1 then  msgbox "OK" endif end 以上の場合に『OK』メッセージが表示されるものと理解していますが、表示されずに終了してしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.19

「Yahoo! eグループ」に参加しましたが、 「オーナー/管理者のみが投稿できるグループ」のようで、投稿出来ませんでした。 「Yahoo! eグループ」を紹介しましたが、私もはじめてです。管理者は参加者のアドレスが判るのかな? ならばそちらに送ってみてください。 また、共有フォルダと言うのがあるようなので、該当のファイルをそこに置いても良いです。 ちなみにこちらはExcel97なので、Excel97が読める形式で保存してないと私の方では開けないかもしれません。

list
質問者

補足

「Yahoo! eグループ」にて送信しました。 よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (19)

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.20

#18です。訂正です、間違いが多くてすみません。 > となり、ループが1度しかまわらないから、 となり、ループが1度もまわらないから、 それから#18での補足ですが、新しいシートが出来なかったものが、i2を5に置き換えたことで職場順位5までは出来るようになった、ということでいいのでしょうか。 ならば、ワークシートからi2に入れる数値を得る過程(コード、セル参照、ワークシート関数など)に原因のひとつがあるはずですから、それを探してください。 もうひとつ、 > 「For i = 0 To 26」として処理を行ったところ職場順位8迄は実績があり9は実績が無いがIF文が処理されて、その後、10以降は実績が有っても無くてもIF文が処理されない。 #16の補足のコードによると、Sheets("内訳書") の"A2"に部署番号を入れると、Sheet("実績")の"O5" が数式によって変化するわけですね。 Sheets("内訳書") の Range("A2") に直接1から10までの部署番号を、順に手入力していくと"O5"はどうなりますか。 最初の部署番号が1とするなら、Sheets("内訳書").Range("A2").Value = b2 のb2は、iが1の時に1となっていますか(部署番号は、シート請求先の5行目からで間違いないですか)。 以下のマクロで内訳書のA2と、実績のO5の値を確認してみてください。 Sub test3() Application.Calculation = xlAutomatic For i = 0 To 12 Sheets("内訳書").Select Sheets("内訳書").Range("A2").Value = i Range("A2").Select MsgBox "i=" & i & Chr(13) & Chr(13) & "内訳書 セルA2=" & Range("A2").Value With Sheets("実績").Range("O5") Sheets("実績").Select MsgBox "i=" & i & Chr(13) & Chr(13) & "内訳書 セルA2=" & Sheets("内訳書").Range("A2").Value & _ Chr(13) & "実績   セルO5=" & .Value If .Value = "" Then .Select MsgBox "O5は空白です" End If End With Next End Sub それから、再計算とマクロの進行がズレるというお考えは、もうおやめになったほうがいいのではないでしょうか。 部署番号8までは無事に処理されるというのが、お考えに誤りのある何よりの証拠です。考え方を変えないと、コードや関数式を見直す目が鈍り、いつまでたっても問題が解決できないように思います。 ファイルの受け取りですが、生来が臆病者なので二の足を踏んでしまいます。

list
質問者

お礼

papayukaさんにYahoo! eグループ経由にて、実際にファイルを送信して、見て頂いたところ、半分強引な方法でもありますが、無事出来る様になりました。 papayukaさん、sakenomoさんを含め多数の方にお世話になり有り難う御座いました。 また、papayukaさんもファイルを見て私の言いたい事(データを入れても確実に再計算されない)が少し分かってもらえました。

すると、全ての回答が全文表示されます。
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.18

#15です。いただいた補足を読んで、わからなくなってきてしまいました。#5で掲載のコードは、本当にlistさんがお書きになったものでしょうか。 #15の補足は、全て不具合の出るデータで検証したものでしょうか。以下は不具合の出るデータでの結果を前提としています。 #5で掲載のコードから考えられる不具合の原因は、単純なもので3つあります。 A 変数i2の値がおかしい。    i2を取得するコード、セル参照、ワークシート関数など。 B 変数bの値がおかしい。    bを取得するコード、セル参照。 C Sheets("合計")など各シートのワークシート関数。   及び各シートへのセル参照。 マクロ実施の前後でシートの数式に間違いが無い、ということなので、Cは問題ないと思えます。 その上で、 >> For i = 0 To 5 などとした 5で実行した場合には、1~5迄は実績のある部署であり問題なく終了しました。 ならば、CとBは問題なさそうです。残るはAで、原因はi2の設定に問題があると思うのですが。 For i = 0 To i2 で、不具合がでて、 For i = 0 To 5 で、1~5迄は実績のある部署であり問題なく終了、ならば、どう考えても原因はi2だと思いませんか。 変数i2に値が代入されていない、つまり0で、 For i=0 to 0 となり、ループが1度しかまわらないから、Range("A1").ClearContents されるだけで、Range("AD46").Value が <> "" になりようがない訳です。 i2を取得するコードを見直してください、ということで、原因が分かってメデタシといきたいのですが、わからないのは、listさんは >> i2とbの変数の確認 msgbox で直接変数及び条件選択を実施しているセルを指定し確認しました。 と書いていらっしゃいます。 i2の値には異常がなかったのでしょうか。無かった、ということだと残念ながら、僕にはもうアドバイスできることはありません。 #15で伺ったイベントやFunctionプロシージャなどについては、それらがセルや変数などに影響を及ぼしているのかもしれないと考えたからです。しかしながら、i2を5に代えたら異常なし、ということであれば杞憂だったようです。 あと、 >実績の無い部署番号となった時に、「Exit Sub」を実行さるように、IF文を・・以下略 ですが、どんな関数が入れられているのかわかりませんし、>左下に「再計算」の表示はされなかった・・・の意味もよく分かりません。 再計算とマクロの進行のズレがIf Range("AD46").Value <> "" Then の処理をおかしくしているのならば、なぜi2を5にするだけで問題なく終了するのでしょう。

list
質問者

補足

> #5で掲載のコード > #15の補足は、全て不具合の出るデータで検証 実際に検証しているのは下記のマクロです。同じ処理をしているので掲載していませんでした。 この件がsakenomoさんを訳分からなくさせたのですよね? 参照している値が違うから・・・と、お叱りをいただくものかなと、今現在、思っています。 申し訳ありませんでした。 結果的に 私には、意味不明なのですが、#5で掲載したマクロは上手く出来て、下記のマクロは上手く出来ません。 > For i = 0 To 5 私の説明不足で勘違いされているみたいで申し訳ありません。 私の思った通りに処理された訳ではありません。 登録している職場数が26ですので、「For i = 0 To 26」として処理を行ったところ職場順位8迄は実績があり9は実績が無いがIF文が処理されて、その後、10以降は実績が有っても無くてもIF文が処理されない。 結果として、「For i = 0 To 26」としても「For i = 0 To i5」としても同じだけループしました。 なぜ、ループしているか判断したかと言うと、画面を見てのみで無く、下記のマクロよりも分かってもらえると思いますが、Msgboxにより確認しました。 > 左下に「再計算」の表示 私みたいな初心者でないので表示の意味ではないのですよね? 再計算と表示されるのは、エクセルが再計算を行わないと、正確な値が表示されていないと意志表示しているのですよね? そこで、再計算が表示されていないのなら計算は完全に終了しているとの事ですよね? でも、今回の場合に、シート上の状況を判断しても再計算されていないと思われることから上記の様な表現をしました。 > C Sheets("合計")など各シートのワークシート関数。 マクロが終了して、直接手動にてシート名「内訳書」のA1及びA2を訂正すると、問題なく表示されますので、シート上での関数の間違えはないと理解していますが、それだけでは間違いないと言い切れないものでしょうか? > どんな関数 Sheets("実績")のA列 -> 連番の数字(1~1000) Sheets("実績")のB列 -> 実際のデータ(納品か回収の文字と職場番号と品目番号と日付が入力) Sheets("実績")のD列 -> B列のデータより納品日を抽出して日付データとして入力 Sheets("実績")のE列 -> B列のデータより職場番号を抽出 Sheets("実績").Range("M5")=IF(D5="","",IF(OR(内訳書!A$2="",内訳書!A$2=E5),IF(MONTH(D5)=内訳書!$A$1,G5,""),"")) Sheets("実績").Range("N5")=IF(M5="","",IF(COUNTIF(M$5:M5,M5)=1,M5,"")) Sheets("実績").Range("O5")=IF(ISERROR(SMALL(N$5:N$596,A5))=TRUE,"",SMALL(N$5:N$596,A5)) なお、行5からデータがある行まで関数がコピーされています。(M,N,O列をマクロで作成する時にB列の行数を計算してその行数文だけコピーしています。) 以上で全ての項目に対して、補足していると思いますが、不足している事や勘違いしているところがあれば申し訳ありませんが指摘して下さい。 それと、コンピュータ関係の予備校の講師をしている友人に先日、送信してみてもらったところ、理由は分からないと言われてしまいました。 なお、本人いわく、最近はVBを使用していないので、VBは忘れたっていっていましたけど・・・

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.17

#6です。 不愉快という訳では無いので誤解しないで下さい。 「早く返事をしなくちゃ」と言う思いで返信される気持ちは解かりますが、アドバイスや補足要求に答えてもらえないうえで「上手く行かない」では解決のしようがないのです。 > シートを移動させるマクロが実行されたところで、表中の数字が変動しました。 Excel画面の表示更新を目で追っただけではダメです。 #15さんも言ってますが、ステップ中にVBE画面の変数等にマウスポインタを充てると変数に代入された(ている)値を確認出来ます。代入式を通りすぎる前と通りすぎた後の値をステップしながら確認してみてください。 また、これも前に出てますが、どういう不具合なのかどこにも書いてないし、答えてもいません。 「AD46が空白 = AD46の合計が 0 の場合は、コピーを作らない」ハズなのにマクロ実行すると、条件分岐がされずに「AD46が空白」のシートもそれ以外のシートも全部出来てしまう。 問題にしている点はこれで間違いないですか?

list
質問者

お礼

「Yahoo! eグループ」に登録してみました。 http://www.egroups.co.jp/group/list777 それと、品名、職場名、単価を隠し文字等で代用して送信可能なファイルを作成しました。 > 変数等にマウスポインタを充てると変数 Msgboxでの確認を含めて、実施したのですが、実績があるか無いかの条件選択より前までは、特段問題ないと思うのですが・・・ > どういう不具合 実際のデータでは、逆の現象となっていますが、当然、同様の事も言えるのかなって思っています。 #8の補足にまとめたツモリですが、理解していただけたでしょうか? 以上、よろしくお願いします。

list
質問者

補足

「Yahoo! eグループ」に登録してみました。 http://www.egroups.co.jp/group/list777 それと、品名、職場名、単価を隠し文字等で代用して送信可能なファイルを作成しました。 > 変数等にマウスポインタを充てると変数 Msgboxでの確認を含めて、実施したのですが、実績があるか無いかの条件選択より前までは、特段問題ないと思うのですが・・・ > どういう不具合 実際のデータでは、逆の現象となっていますが、当然、同様の事も言えるのかなって思っています。 #8の補足にまとめたツモリですが、理解していただけたでしょうか? 以上、よろしくお願いします。

すると、全ての回答が全文表示されます。
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.16

#15です、訂正です。 >Sheets("合計").Select >If i2=1 Then Exit Sub >※2 If Range("AD46").Value <> "" Then If i=1 Then Exit Sub でした。 (^_^.)

list
質問者

補足

すみません #18の補足の追加です。 Application.Calculation = xlAutomatic Sheets("請求先").Select Calculate i5 = Range("A5").Value MsgBox "職場数" & i5 & "件(=変数i5)"  'Range("A5")は職場数をカウントしている関数が入っています。 ' Sheets("実績").Select a = Range("K2").Value '入力されているデータのうち一番古い月(4月を1、3月を12として入力) b = Range("K3").Value '入力されているデータのうち一番新しい月(4月を1、3月を12として入力) ' For i2 = a To b Sheets("内訳書").Select If i2 > 9 Then i3 = i2 - 9 Else i3 = i2 + 3 End If Sheets("内訳書").Range("A1").Value = i3 'i3 = Range("A5")を4月なら4、3月なら3とした値を入力 MsgBox i3 & "月分のデータを処理(=i3)" Calculate ' For i = 0 To 26 Sheets("内訳書").Select If i = 0 Then Sheets("内訳書").Range("A2").ClearContents Calculate MsgBox "総合計を処理(=i=0とif文が処理)" Else i6 = i + 4 'シート名「請求先」にある請求先の表の一番上のセルの行番号 a2 = "B" & i6 Calculate b2 = Sheets("請求先").Range(a2).Value 'b2 = 職場番号を変数b2へ Calculate Sheets("内訳書").Range("A2").Value = b2 Calculate MsgBox "これより、部署番号" & b2 & "(=b2)を処理します。" End If ' ' ' 'Sheets("実績").Range("O5")は選択した、月の職場番号に対し実績のある品目番号の初の値い MsgBox "当該部署の実績のある最初の品目番号" & Sheets("実績").Range("O5").Value & "(=O5)の値に対して、これよりIF文を処理します。" If Sheets("実績").Range("O5").Value <> "" Or i = 0 Then Sheets("内訳書").Select Sheets("内訳書").Copy After:=Sheets("内訳書") Calculate x = Range("A1").Value & "月計" & Range("A5").Value Sheets("内訳書 (2)").Name = x If x = Range("A1").Value & "月計『総合計』" Then Sheets(x).Move Before:=ActiveWorkbook.Sheets("実績") Else Sheets(x).Move Before:=ActiveWorkbook.Sheets("品名等") End If Sheets(x).Select Cells.Select Selection.Copy Selection.PasteSpecial xlValues Columns("A:A").Delete Columns("AC:AK").Delete Range("A1").Select End If Next Next

すると、全ての回答が全文表示されます。
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.15

#7,13です。 判断材料は文章だけなので、くどいかもしれませんが。 >同じマクロを活用して、別のデータを処理しても、私の思っている回数分ループしていますので、 不具合の生じるデータでも、i2に必要な値が入ることを確認しましたか。また、For i = 0 To 5 などとした場合どうなりますか。 >部署番号を参照しているのですが、デバッグ-ステップインで確認しても、順番通りに動作していますので これは確認になっていません。b = Range(a).Value のbに、ループ毎にきちんと部署番号が入っているかを確認してください。 >マクロが終了後に手入力にて、職場番号等を入力すると問題なく数値を表示しますし、問題なくマクロが動作して作成されたシートも問題ありません。 マクロ実行前も実行後も、A1に部署番号を入れるとAD46に値が入るということでしょうか。 マクロ実行で不具合が生じた直後、AD46の値はどうなっていますか。また、A1へ入力するとどうなりますか。#5で掲載したコードの最後に Exit Sub をいれて、AD46の値を確認してください。 あと、マクロ中で自作のFunctionプロシージャを使ったり、ブック、シートのイベント処理をしていませんか。また、UserFormからマクロを実行しているのですか。 >結果として、このセルがそれ以前のセルの関数も含めて、IF文以前に職場番号に対して、問題なく完全に計算されていれば問題が生じないと思っていますが・・・ 僕の立場は#14さんと同じで、エクセルの再計算が終わらないと、マクロに制御が戻ってこないと思っています。listさんの私見どおりなら、不具合の出るデータで、 Sheets("合計").Select If i2=1 Then Exit Sub ※2 If Range("AD46").Value <> "" Then とした場合、マクロは終了する一方で再計算は続けられているわけですから、A1には最初の部署の番号が入り、AD46には合計金額がでているはずですが、どうなりますか。

list
質問者

補足

> i2とbの変数の確認 msgbox で直接変数及び条件選択を実施しているセルを指定し確認しました。 > For i = 0 To 5 などとした 5で実行した場合には、1~5迄は実績のある部署であり問題なく終了しました。 > マクロ実行前も実行後 その通りです。 > If i2=1 Then Exit Sub 実績の無い部署番号となった時に、「Exit Sub」を実行さるように、IF文を挿入して確認したところ、再計算されていませんでした。 どうしてその様な判断をしたのかは、データが無いはずの部署で終了させたので、データが有ってはいけないのに、表示されていた。また、表示されていたデータは、当該部署の前のデータが残っていた。なお、左下に「再計算」の表示はされなかった。そこで、関連関数を再入力したところ実績なしとして表示されました。 よって、実績の無い部署で再計算処理を実行したあと終了させても、実績の有る部署のデータが表示されている事は再計算がされていないと解釈しました。 > マクロ中で自作のFunctionプロシージャ 私自身、自作のFunctionプロシージャが理解出来ていません。 > ブック、シートのイベント処理 マクロ画面のプロジェクトのシートをダブルクリックすると出てくるところの事でしたらシートのみ処理しています。 > UserFormからマクロを実行しているのですか。 フォームでメニュー画面を作成して、全て、メニュー画面より起動する様にしています。 以上、全ての項目に対して補足していると思いますが不足点があれば指示して下さい。また、判断項目に誤りがあれば指摘して下さい。

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.14

#6です。 こちらの提示したいくつかのテストの実行もされず、結果も提示しない。 実行すれば Excel.exe が問題なのか、該当ファイルだけの問題なのか、切り分け出来るでしょう? 補足要求にも明確に答えていないという姿勢ではどうにもなりません。 > シートを複写し移動した時に再計算していました。 この判断はどうして出来るのでしょう? 複写されたシートのAD46が空白だったってこと? AD46の計算結果が小数点以下のため書式設定の関係で「見た目は "" や 0 に見える」だけって事はないですか? (セルの書式が「#,###,」とかだと F46 に 0.1 とか入っても見た目は""に見えます) あと、AD46の関数は 0 なら 空白 にしてますが、単純な SUM関数にしてマクロ側を   If Range("AD46").Value > 0 Then にすれば良いだけに思いますが、、、 最後にアップローダーで探せば沢山出てきます。 ただ「アプロダにと」言ったものの、誰でもダウンロード出来てしまうので具合が良くないかも。 使った事ないので詳細な判断は出来ませんが「Yahoo! eグループ」とかの方が無難かな。 http://www.egroups.co.jp/

list
質問者

お礼

papayukaさん #17の補足が上手く投稿出来ないと思い「お礼」に登録させてもらったら同じ内容を「補足」と「お礼」に同じ内容を投稿していまいました。 重複して同じ内容が投稿されてしまい申し訳ありませんでした。

list
質問者

補足

>こちらの提示したいくつかのテストの実行もされず、結果も提示しない。 >実行すれば Excel.exe が問題なのか、該当ファイルだけの問題なのか、切り分け出来るでしょう? 「Sub TEST」については、私のマクロを簡素化していただいたと理解しましたので、今度の休日(土曜日)に当該マクロや外の方の回答に掲載していただいたマクロを参考に、せめて当該マクロとその関連している関数を見直そうと思っていました。 また、計算に時間の掛かるテストマクロについては、本日実行して、お礼にてアップする予定でした。 すみません、それ以外について、#6さんが言わんとする事を私が理解出来ていない所もあるかもしれませんので、その所があれば、指摘して頂ければ、テストを実行します。 > シートを複写し移動した時に再計算していました。 > 複写されたシートのAD46が空白だったってこと? シート名「合計」のAD46は合計金額欄ですが、その表中に品目及び納入日別の数量と金額が入力されていますので、#6さんに指示された通りに、マクロ画面とシートの画面を横に並べて、マクロを1行づつ実行し、シート上のその数字の変化をみたので結果が空白だから計算されていないと理解したものではありません。 実際、シートを移動させるマクロが実行されたところで、表中の数字が変動しました。 なお、AD46はこの表中の関数で得られた値を元にして、計算していますので、同表中の数字が変更しないから、AD46も変更していない、だから、シートが移動しないと再計算が実行されないと勝手に解釈していました。 また、今度の土曜日の見直し後に、#6さんに言われた通りにマクロを1行づつ実行して表示されるシートの結果だけで判断するのではなく、念には念をいれて、同時に各所にIF分で条件選択させるための計算結果のセルの値をMsgboxを使用して確認したいと思っていますが、その処理方法でも、まだ、正確に再計算されたかを判断するには、不十分なのでしょうか?もし、不十分と言うのであるなら、外の方法を教えて頂ければ、土曜日にその方法にて実行したいと思います。 >AD46の計算結果が小数点以下のため書式設定の関係で「見た目は "" や 0 に見える」だけって事はないですか? 金額欄である以上、0か整数であり、小数点以下の数字が表示される事は考えられないと(こごの単価は全て1円以上であるし)、勝手に解釈していました。 >あと、AD46の関数は 0 なら 空白 にしてますが、単純な SUM関数にしてマクロ側を「If Range("AD46").Value > 0 Then」にすれば良いだけに思いますが、、、 言われてみると、合計金額が0円(Range("AD46")=0)の職場の場合には、新規シートを作成しないのであるから、表示がどのようなものであれ問題ないために、余計な計算式を外すように、単純に計算式を変更します。 それ以前にエクセルの場合には、関数計算された値が表面上0であっても0.0001とかの値が生じている事があったので、同様にマクロ及び関数を変更する事によって、この事への対応が可能となるのですよね?(その事を言っていたのですかね?その通りであるなら理解不足で申し訳ありませんでした。) >最後にアップローダーで探せば沢山出てきます。 すみません、アプロダと言われたので、そのまま、「アプロダ」で検索していましたので、どっかの会社のホームページしか出てきませんでした。 >「Yahoo! eグループ」とかの方が無難かな。 > http://www.egroups.co.jp/ すみません、今から確認します。 文書だけであるので、自分の気持ちをもっと表現しないと相手には伝わらない事は分かっているツモリでしたが、不愉快の思いをさせ、また、表現上問題もあり申し訳ありませんでした。 こんな私ではありますが、再度、お願いできるものであれば、よろしくお願いします。また、文脈に不明な点、誤字脱字、実施状況に不明な点があれば、注意していただければ、改善したいと思っていますので、指摘して頂けませんか。 よろしくお願いします。 なお、#6さんを含め、今回の私の質問に対して、ご尽力をいただいている方々に、この場をお借りして、お詫びします。 申し訳ありませんでした。

すると、全ての回答が全文表示されます。
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.13

どういう不具合なのか、明確にはどこにも書いておられませんが、If Range("AD46").Value <> "" Then ~ End If 間が動かないということでいいのでしょうか。   Range("AD46").Valueが、"" 以外になれば、制御は中に入り、否応無しに頭に"年間計"が付いた名前のシートが出来るはずですが、出来ませんか。 ならばRange("AD46").Valueが、<>"" にならない理由を捜すべきではないでしょうか。 >For i = 0 To i2 i2に、希望する値は入っていますか。 >i3 = i + 4 >a = "B" & i3 Sheets("請求先")への、セル参照は間違っていませんか。 セルAD46の数式が参照しているセルF46,H46,J46,L46,N46,P46,R46,T46,V46,X46,Z46,AB46の中に入っている数式、あるいはその数式が参照しているセルの数式に間違いはないですか。 他の回答者の方々のアドバイスも参考に、じっくり見直したほうがよさそうです。

list
質問者

補足

回答有り難うございます。 不具合の内容は、シート名「合計」の職場ごとの合計金額欄(Range("AD46").Value)が再計算されないために、IF文が機能しなく、IF文内の処理を実行したり、逆に実行されてしまう。 > 否応無しに頭に"年間計"が付いた名前のシートが出来るはずですが、出来ませんか。 出来ません。 >i2に、希望する値は入っていますか。 同じマクロを活用して、別のデータを処理しても、私の思っている回数分ループしていますので、問題ないと思っています。 勿論、Msgboxでも確認はしました。 >Sheets("請求先")への、セル参照は間違っていませんか。 部署番号を参照しているのですが、デバッグ-ステップインで確認しても、順番通りに動作していますので問題ないと思っています。 >セルAD46の数式が参照しているセル マクロが終了後に手入力にて、職場番号等を入力すると問題なく数値を表示しますし、問題なくマクロが動作して作成されたシートも問題ありません。 >Range("AD46").Value 結果として、このセルがそれ以前のセルの関数も含めて、IF文以前に職場番号に対して、問題なく完全に計算されていれば問題が生じないと思っていますが・・・それが原因で大勢の方にご迷惑を掛けているのですが・・・ 以上の通りです。また、よろしくお願いします。

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.12

#6です。 新規ブックで下記のマクロを実行し、再計算に時間が掛かる場合の実験をしてみました。 結果、どんなに時間が掛かってもメッセージは出ます。 試して見てください。 Sub Test01() '↓ここを増やすと再計算により時間が掛かる Const LRow = 1000  '※1 この処理で D1 は必ず 0 になっている----------  Application.Calculation = xlCalculationAutomatic  Cells.Clear  Range("D1") = "=SUM(B1:B" & LRow & ")"  Range("B1:B" & LRow) = 0  '※1 ここまで------------------------------------  '※2 この処理で D1 は LRow になる----------  Application.Calculation = xlCalculationManual  Range("A1:A" & LRow) = "=Vlookup(B1,C:C,1,0)"  Range("C1:C" & LRow) = 1  Range("D1") = "=SUM(B1:B" & LRow & ")"  Range("B1:B" & LRow) = 1  Calculate  '※2 ここまで------------------------------------  '※3 シート再計算に時間が掛かると処理が飛ばされるなら  '   下記メッセージは出ないハズ  If Range("D1").Value > 0 Then    MsgBox "再計算終了:" & Range("D1").Value  End If  '※3 ここまで------------------------------------  Application.Calculation = xlCalculationAutomatic End Sub > =IF(SUM(F46,H46,J46,L46,N46,P46,R46,T46,V46,X46,Z46,AB46)=0,"", > SUM(F46,H46,J46,L46,N46,P46,R46,T46,V46,X46,Z46,AB46)) A1との関連がなく、これまた不明です。 私見としては、どこかに勘違いがあると思います。 間違ってないと確信しているlistさんと、どこかが間違っていると思っている私では、アプロダにでもファイルを上げてもらわないと、少ない情報の中でこれ以上は難しいですね。 Excel画面とVBE画面を並べて表示し、デバッグ-ステップイン-F8キーでステップ実行しならが変数にカーソルをあて値や動きを確認しては?

list
質問者

お礼

「Sub Test01() 」は問題なく実行できました。 もしよろしければ、引き続きよろしくお願いします。 昨日より体調も良くないため、sakenomoさんの指摘されている内容に対する補足も土曜に実施したいと思っています。 折角、回答いただいているにもかかわらず無視しているのではありませんのでご了承願います。

list
質問者

補足

度々有り難う御座います。 先ほど、デバッグ-ステップインにて実行したところ、シートを複写し移動した時に再計算していました。 それと、先ほど、下記を挿入したところ問題なく処理されたのですが、実はもう1箇所同じ様な処理する箇所があり同箇所も同様に出来ず、また、下記と同様の処理をしても無理でした。 前回の補足で記載しました「=IF(SUM(・・・」は「Range("AD46")」の関数です。 それと、アプロダとは、YAHOOで検索しても出なかったけど、どこのサイトですか?(明日も早いので細かく確認していないので掲載されていれば申し訳ありません) もし、確認して問題ないサイトで、投稿すれば、お願いできますでしょうか? 以上、よろしくお願いします。 End If Sheets("実績").Select Calculate DoEvents Sheets("合計").Select Range("AD46").FormulaR1C1 = "=IF(SUM(RC[-24],RC[-22],RC[-20],RC[-18],RC[-16],RC[-14],RC[-12],RC[-10],RC[-8],RC[-6],RC[-4],RC[-2])=0,"""",SUM(RC[-24],RC[-22],RC[-20],RC[-18],RC[-16],RC[-14],RC[-12],RC[-10],RC[-8],RC[-6],RC[-4],RC[-2]))" Calculate DoEvents Calculate DoEvents DoEvents If Range("AD46").Value <> "" Then

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.11

回答補足が複雑になってもう私なぞついていけません。私などアマでエラそうなことは言えませんが (1)Selectの過剰多用(マクロの記録のコードからの影響か) (2)If文の2個並列(Elseが使えるのに) (3)Calculateの過剰多用 (4)シート.SelectとRange.Select    の過剰多用    シート1.Range(・・)=シート2.Ran   ge(・・)が使えます。 を見なおしされては。 コード文字数が約半分になり、見とおしがよくなると私は思います。 コードの公開を求めたものの、コンピュターはプログラムとデータです。データが回答する側の手許に無い以上、デバッグは非常に困難なことが判りました。 なぜCaluculateが必要なのか理解できません。 そもそも自動化が目的であるVBAではほとんど必要ないのでは。 思ったようにデータがセット・演算されてないと言った簡単なことが原因だと思います。

list
質問者

補足

>私などアマで 私のがアマアマです。エクセルでマクロを初めて1年くらいですし・・・ >(1)Selectの過剰多用(マクロの記録のコードからの影響か) >(2)If文の2個並列(Elseが使えるのに) >(3)Calculateの過剰多用 >(4)シート.SelectとRange.Selectの過剰多用 マクロを覚えたのは、自動記録をさせて、記録されたマクロを見ながら覚えたので無駄なものが一杯あることは分かっていますが・・・ >データが回答する側の手許に無い 当初より、なぜ、上手くいかないものかと思っていたので#6さんの言われる通りに、どこか問題があるのかもしれませんけど・・・ まあ、簡単な物であれば今まで問題なく動作していたから、なんで・・・って思っていますけど・・・ どちらにしても、データが無くテスト出来ない事は回答して頂いている方にとっても私が質問している事を回答する事が難しいものかなって思ってはいましたけど・・・

すると、全ての回答が全文表示されます。
  • suzusan7
  • ベストアンサー率64% (22/34)
回答No.10

こんばんわぁ。 伝えたいことはわかるのですが、例やマクロの一部を出したのは 再現性がないため、かえって伝わりにくいかもしれませんね。 きっと、同じような状況にならないと理解はできないかもしれません。 msgboxをひとつ入れて思うとおりの結果が得られたということなので、 マクロは思い通りのものができているが、マクロの実行と再計算のタイミングが一致していないので、 うまく動いていないということですよね。 Calculateの後ろに DoEvents DoEvents とDoEventsを2つ入れて試してみてください。

list
質問者

補足

回答有り難う御座います。 DoEventsを数個入力しても駄目でした。

すると、全ての回答が全文表示されます。

関連するQ&A