• ベストアンサー

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

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

  • list
  • お礼率50% (206/408)

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

  • ベストアンサー
  • 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/17068)
回答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

  • Excelのセルの比較について

    Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

  • エクセルマクロでの計算について(2007)

    エクセルマクロ初心者です。 試行錯誤しながら作成しています。 セルB1には直接計算式を入れており(=(480+(A1)*10)/480*I1) その結果次第(70以下)でセルC1に計算結果(=(75-B1)*.48)をいれて 70より大きければセルC1に"-"を入れたいのですが上手く計算してくれません。 この処理を約65個のセルにしようと思っています。(セルの列はバラバラです) どうすればよいかご教示ください。 ちなみに現在作成している文は Private Sub 計算_Click() Worksheets("sheet2").Select If Range("B1").Value <= 70 Then Range("C1").Formula = "=(75 - (B1)) * 0.48" Else: Range("C1").Value = "-" End If End Sub よろしくお願いいたします。

  • エクセルVBA記述誤りの解決お願い

    A1~A20のセルに入力データが一切無い場合に、入力を促すメッセージを表示させるマクロを作りましたが,「実行時エラー13  型が一致しません」のエラー表示が出ます。 デバックすると下記マクロの「If Range("A1:A20").Value = "" Then」の部分でストップしていました。 いろいろとやってみましたが、うまくゆきません。 If Range("A1:A20").Value = "" Then MsgBox ("参加マークーを入力ください") Exit Sub End If 記述上の誤りがあるようですので、ご教示いただけましたら幸いです。

  • マクロif文での条件式について

    マクロ初心者です。Excel2003を使用しています。 仕事上で使用しているエクセル表より、ある値以上の項目を抽出し、その値を用いて計算結果を出すためのマクロを作成いたしました。いろいろなサイトを参考にして自分なりに書いてみたのですが、どうしてもうまくいきません。 表は簡単なもので、以下のようなものです。 1 9 2 24 3 45 4 67 1列目は使用濃度、2列目は測定値です。この測定値が30より大になった項目を抽出し、計算式にその値を代入し計算結果として出したいのです。また、全ての測定値が30以下だった場合は、計算結果の欄に”<30”とのように表示をさせたいと考えています。 以下のようにマクロを書いてみました。 Sub Macro1() For i = 1 to 4 if Worksheets("sheet1").cells(i , 2).value <=30 then Range("A5")=0 '測定値が=<30だった場合は計算をしないので、フラグとして値を入力 Elseif Worksheets("sheet1").cells(i , 2).value > 30 then Range("A5")=Cells(i , 1) Range("B5")=Cells(i , 2) Exit for Endif if Worksheets("sheet1").Range("A5").value > 0 then Range("A6").Formula ="=(50-B5) / A5" Elseif Worksheets("sheet1").Range("A5").value = 0 then Range("A6") ="<30" Else Endif Next i End Sub >30だった項目の抽出まではできたのですが、計算値をだすところがどうしてもうまくいかず、A6セルにはどんな値でも”<30”と入力されてしまいます。 マクロの基本的なルールなどがまだまだ未熟なので、基本的な構文も書けていないと思います。 全然方向性が違うかもしれないので、そういった点も含めてご教示いただけたら幸いです。 分かりにくいかもしれませんが、どうぞよろしくお願いいたします。

  • Excelのマクロで質問です

    セルに関数で文字が入った時にマクロを実行させる方法を教えて下さい。 今回行いたいのは、C9~C19セルにNGと表示された場合にメッセ―ジを表示したいです。 Private Sub Worksheet_Change(ByVal Target As Range) '変化のあったセルがA1セルか? If Intersect(Target, Range("C9:C19")) Is Nothing Then Exit Sub '条件判定:A1セルの値は 1 か? If Target.Value = "NG" Then MsgBox "NGです" End If End Sub このような場合C9~C19セルにNGと打ち込めばメッセ―ジが表示されるのですが あらかじめ、関数で =IF(M9="","",IF(Q9<M9,"OK","NG")) というような式がそれぞれのC9、C10、C11・・・・セルに入ってしまっています。 これだと、例えばC9セルにNGと表示されてもマクロは起動せず、メッセージが表示されません。 関数をマクロに盛り込むか、このままでもマクロが起動できるような書き方があるか 教えてください。 すみません。補足でQ9セルには =IF(I9="","",I9+"07:01")のような関数が 入力されています。

  • エクセルのマクロについて

    エクセルのマクロ実行についてですが、 例えば、 E1セルの値が1ならばこうする(マクロ名 E1セル1) E2セルの値が2ならばこうする(マクロ名 E1セル2) E3セルの値が3ならばこうする(マクロ名 E1セル3) というマクロを別々に作りました。 これをボタンで実行する時に、 If Range("E1").Value = 1 Then ElseIf Range("E1").Value = 2 Then 2行目には作ったマクロを全部貼り付けないといけないのでしょうか? それとも簡単にこの場合は、マクロ名E1セル1を実行するという命令することができるのでしょうか? できるのであれば、入力方法を教えてください。 質問が分かりにくいと思いますが、よろしくお願いします。

  • エクセルのマクロを利用して

    マクロ初心者でです。 いろんなサイトから引用させて頂き次のようなマクロを作成しました。 実行すると、日付と担当者氏名(A1)がファイル名となるものです。 そこで教えて頂きたいのですが、実行すると保存先がマイドキュメントに なるのですが、これを例えば「C:\日報」というフォルダが指定されるようにしたいのですが、 自分なりに、いろいろ試したのですが全くできません。 宜しくお願い致します。 Sub 名前をつけて保存() Dim SaveFileName As String, re As Variant With Sheets("sheet1").Range("A1") If .Value = "" Then MsgBox "名前が入力されていません", vbExclamation Exit Sub Else SaveFileName = Format(Now, "yyyymmdd") & "_" & .Value End If End With re = Application.GetSaveAsFilename(SaveFileName) If re = False Then MsgBox "保存を中止しました", vbExclamation Else MsgBox "日報をを保存しました", vbInformation End If End Sub

  • エクセルでセルに文字が入力されたらマクロを実行

    前回どなたかが質問されて回答を見せてもらったら私のやりたいことと同じだったので実行してみましたが出来なかったのでもう一度質問をさせてください。 1.実行したのですが、なにも実行されません。 2.実行したらメッセジBOXだけは実行するのですが、後のコマンドが実行されずにエラーになります。 もう一度詳しく教えてください。 マクロ初心者ですよろしくお願いします。 1.【シートモジュールで条件判定し、マクロを起動する】 通常はこちらの方法が使われます。 Private Sub Worksheet_Change(ByVal Target As Range)   '変化のあったセルがA1セルか?   If Target.Address = "$A$1" Then      '条件判定:A1セルの値は 1 か?     If Target.Value = 1 Then       MsgBox "A1セルは条件を満たしました"     End If   End If End Sub 2.【ワークシート上で条件判定し、マクロを起動する】 処理内容にもよっては不向きな場合もありますが、こんな方法も あります。 マクロを Sub ではなく、Function 、、つまり関数にしてしまいます。 Function TestMacro() '<-- Sub を Function に替える   MsgBox "A1セルは条件を満たしました"   TestMacro = "" '戻り値はなし End Function そして、ワークシートの B1 セルに次の式を入力します。()は必須 です。  =IF(A1=1,TestMacro(),"")

  • エクセルのマクロのコード(?)を教えてください!

    マクロ初心者……どころか今日初めて触った者です。 なんだか楽しかったので、エクセルでスペルクイズを作ってみようかなーといじっています。(`・ω・´) が、何も知らないので何も進みません(汗) スペルを打って、 合ってたら黒で「OK!」 間違ってたら赤で「Miss!」と表示させたいです。 それから、間違ってたらMiss!の右側のセルに正しい答えを表示したいです。 今判るのは、例えばdoctorが答えのときだと↓だけです…… If Range("c4").Value = "doctor" Then Range("d4").Value = "OK!" Else Range("d4").Value = "Miss!" End If Miss!の字を赤くする方法と e4セルに正答を表示させる方法を教えてください。 どこに何と書けばいいでしょうか? 入門者すぎる質問ですみません! どなたかよろしくお願いいたしますm(_ _)m

  • マクロの自動実行

    Private Sub Worksheet_Calculate() Range("b1").Value = Range("b1").Value + Range("a1").Value End Sub このマクロをA1セルの数値が変わるたびに自動で実行するには どうすればいいでしょうか?

専門家に質問してみよう