• 締切済み

GoTo文とかSelect文の処理の仕方に関して

Excel VBAに関しての質問です。 コードを書いていてGoTo文とかSelect Case文を使いますが、 例えば、GoTo文で飛ばされた間のコードは処理時間に影響するのでしょうか? また、Select Case文で該当しなかった命令文は処理時間に影響するのでしょうか?? 以下の命令文があります。 Sub TEST() Dim A As Long For i = 1 To 10 Cells(i, 1) = A A = A + 1 Next i GoTo B For i = 1 To 10 Cells(i, 2) = A A = A + "あ" Next i B: End Sub これ、GoTo文で飛ばさないと、「型がちがうよ!」って怒られてしまいます。 (もちろん、例えとしてで、こんなコードは、いまでは書かなくなりましたが(汗)) ということは、GoTo文で飛ばされたコードはシングルクォーテーションで くくられたことと同じになるんでしょうか? GoTo B 'For i = 1 To 10 'Cells(i, 2) = A 'A = A + "あ" 'Next i B: そもそも私のイメージでは、シングルクォーテーションで囲まれた範囲は、 演算処理とは関係なく無視されるみたいにイメージしていたんですけど、 いくら、シングルクォーテーションで囲んだとしても、その範囲が膨大に大きく多い文字数だと、 やっぱり処理時間に影響するものなのでしょうか?? Select Case文を使うときに、 Select Case 条件式 Case 条件1 すんごく長いコード Case 条件2 すんごく長いコード ・ ・ ・ End Select って、続くとします。 条件に一致していないところは演算処理に影響を及ぼさないのでしょうか?? もちろん、長いコードを書けば、ファイルのサイズは大きくなるでしょうが、演算処理の速さに影響するものなのかな??ってのがとても気になりました。 ご存じの方おりましたら、ご指南くださいませ。 ちなみに、私はまだVBAを勉強し始めてまだ間もない若輩者でして、GoTo文などは、とりあえず「ここ要らないかも」って思ったところに使用するくらいで、高度な使用の仕方はしておりません。 それと、私はExel VBAしかプログラミング言語を知らないので、VBAではこうだけど、別の言語の似た命令だと、影響したり、しなかったり。。。するよ。みたいなお話も聞けたら幸いです。 どうぞ、よろしくお願いいたします。

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.5

実際にEXCEL VBAで試してみました 一方は sub macro1() Dim i as Long for i=0 to 1000000 goto b A=A+1 (以下A=A+1が合計千行) b: Next End Sub もう一方は sub macro2() Dim i as Long for i=0 to 1000000 Next End Sub 実行結果は Macro1: 1.46874429947099E-02 秒 Macro2: 1.01247155736052E-02 秒 なお、MinGWのgccで同様のコードをコンパイルすると実行時間はほとんど一緒、-O3(最大最適化)するとどちらもゼロになりました。 考察ですが、 ・goto文の間に長い実行文がある場合、ある程度実行時間に差が出る。 ・ただし、その差はわずかであり、DBアクセスやCOMオブジェクトの生成と比べると無視できるレベル と言ったところでしょうか。

SURAGOTAPI
質問者

お礼

実験していただいて恐れいります。 まだまだプログラムの組み方がへたくそで、大きなコードをひとまとまりとして、Select文で選択させて実行するようなものしかつくれなくて、もっと勉強してスマートなコードを書けるようになりたいです! ありがとうございます!

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

一部には、飛び先を毎回探すので遅くなる、という処理系もあります 昔のBasicでラベルを使ったときに、行番号指定より遅くなる、とか、先頭に書いたラベルへは速く、後に書いたラベルへは遅い、とかがありました。 遅くなるのでコメントは入れない、という技もありました。 しかし、現在の多くの処理系では、実行前処理として飛び先を調べておくので、実行速度への影響はほとんどありません。 コメントも前処理段階で無いものとして扱うので、影響はありません。 最初の例で、Goto Bがあるとエラーにならないのも、前処理の結果、A=A+"あ"の行を実行することが無いことが判明したので削除したのでしょう。

SURAGOTAPI
質問者

お礼

勉強不足ですみません。 「実行前処理」ってのをやってくれるのですね。 それと、Basic時代のお話ありがとうございました! 勉強になりました! 先の質問でのお礼文にもありましたが、 まだまだVBAプログラミングに精進している身で、 自身の注釈コメントがハンパないんですw でも、シングルクォーテーションでくくられた自身の試行錯誤記録みたいなものが、 処理に関しては影響しないことがわかりました! ありがとうございました!

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

インタープリタ・コンパイラの実際のMSの作成者が答えないと十分は判ら無いが、ソースの上でのステップで飛ばすところは実行されないと考えるほか無い。そんなことはコンパイラの仕組みでも勉強した時に考えた良いでしょう。また今はコンピュターの実行速度が速くなっているので余り考える意味はあまり無い。 コンパイラにかかって機械語になると、原形ソースの順序などずたずたに変えられる可能性もある。 知りたい欲望がもたげてくるのはわかるが、そんなことを聞いて回っても答えてくれる人にこんな質問コーナーでは出会わないと考えたほうが良かろう。

SURAGOTAPI
質問者

お礼

少しヒントを得たかっただけなんです。 私はまだ、若輩者で私が作ったコードにも無駄が多数あると思います。 そのコードに何通りかのやり方を考えて、Select Case文で分けて、Timer関数で時間を計ったときに、 Select文の該当しない部分にも演算計測がされていたらイヤだな~なんて思い、 こんな質問をしてしまいました。 興味深いご回答ありがとうございました!

  • inadomez
  • ベストアンサー率40% (9/22)
回答No.2

GoToやSelect Caseで実行されなかった命令は処理の速さに影響しません。 なぜなら実行されていないからです。 シングルクォーテーションでコメントにした行も同様です。 また大量のデータ扱う処理や余程無駄の多い処理でない限り、 今のPCのスペックでは処理時間の遅い・速いをなかなか認識できないと思います。 もし処理速度が気になるようでしたら、 オブジェクトアクセス(シートやセルへの書き込みや読み取りなど)を極力減らすことや、 ループ構造を無駄の少ないように見直してみると良いと思いますよ。

SURAGOTAPI
質問者

お礼

やっぱりExcel VBAの処理速度はシートとのやり取りですよね。 できるだけ配列にぶちこんで、結果を出力する際の体裁などは、 なるべく最後にしています。 書式設定もその値を配列にぶちこんで、最後に配列の値からシートに換算する方法でやるようにしました! ご回答ありがとうございます!

回答No.1

Basicでは、シングルクォートで始まる行は、コメントとして、コンパイル対象になりません。 したがって、「無いのと同じ」で、当然演算時間なんかありません。 gotoで飛ばしただけのコードでは、実際に実行はされなくても、コンパイルしますので、コードが生成されます(最適化処理により、削られる可能性はあるけど)。もちろん実行しないので、時間はかかりませんが。 で、該当しないcase節ですが、当然実行しないので演算処理に影響は出ないはずです。逆にそれが影響しちゃったら、困るでしょう? 現在の制御構文が充実している手続き型言語では、goto文は使わないほうが望ましいとされています。goto文を多用すると、処理の流れが掴みにくく、バグの原因になるし、後々ソースコードを読むときにも、理解を妨げるからです。

SURAGOTAPI
質問者

お礼

ご回答ありがとうございます。 プログラミング自体に慣れていなくて、 やっぱり文字数とかも演算速度に関係あるんだろうか?なんて思っていましたが、 すっきりしました。 なにせまだ日が浅いもので、コメント注釈なんかもフェルマーが言った「足りない余白」は気にならないくらい打ち込んでいるものでしてw 特に、 >逆にそれが影響しちゃったら、困るでしょう? のあたり、「そうですよねー!」って安心しちゃいました! ありがとうございました!

関連するQ&A

専門家に質問してみよう