アプリ版:「スタンプのみでお礼する」機能のリリースについて

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ではこうだけど、別の言語の似た命令だと、影響したり、しなかったり。。。するよ。みたいなお話も聞けたら幸いです。

どうぞ、よろしくお願いいたします。

A 回答 (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オブジェクトの生成と比べると無視できるレベル
と言ったところでしょうか。
    • good
    • 1
この回答へのお礼

実験していただいて恐れいります。

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

ありがとうございます!

お礼日時:2011/05/16 21:55

一部には、飛び先を毎回探すので遅くなる、という処理系もあります



昔のBasicでラベルを使ったときに、行番号指定より遅くなる、とか、先頭に書いたラベルへは速く、後に書いたラベルへは遅い、とかがありました。
遅くなるのでコメントは入れない、という技もありました。

しかし、現在の多くの処理系では、実行前処理として飛び先を調べておくので、実行速度への影響はほとんどありません。
コメントも前処理段階で無いものとして扱うので、影響はありません。


最初の例で、Goto Bがあるとエラーにならないのも、前処理の結果、A=A+"あ"の行を実行することが無いことが判明したので削除したのでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/16 21:43

インタープリタ・コンパイラの実際のMSの作成者が答えないと十分は判ら無いが、ソースの上でのステップで飛ばすところは実行されないと考えるほか無い。

そんなことはコンパイラの仕組みでも勉強した時に考えた良いでしょう。また今はコンピュターの実行速度が速くなっているので余り考える意味はあまり無い。
コンパイラにかかって機械語になると、原形ソースの順序などずたずたに変えられる可能性もある。
知りたい欲望がもたげてくるのはわかるが、そんなことを聞いて回っても答えてくれる人にこんな質問コーナーでは出会わないと考えたほうが良かろう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/16 21:42

GoToやSelect Caseで実行されなかった命令は処理の速さに影響しません。


なぜなら実行されていないからです。
シングルクォーテーションでコメントにした行も同様です。

また大量のデータ扱う処理や余程無駄の多い処理でない限り、
今のPCのスペックでは処理時間の遅い・速いをなかなか認識できないと思います。

もし処理速度が気になるようでしたら、
オブジェクトアクセス(シートやセルへの書き込みや読み取りなど)を極力減らすことや、
ループ構造を無駄の少ないように見直してみると良いと思いますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/16 21:39

Basicでは、シングルクォートで始まる行は、コメントとして、コンパイル対象になりません。


したがって、「無いのと同じ」で、当然演算時間なんかありません。
gotoで飛ばしただけのコードでは、実際に実行はされなくても、コンパイルしますので、コードが生成されます(最適化処理により、削られる可能性はあるけど)。もちろん実行しないので、時間はかかりませんが。


で、該当しないcase節ですが、当然実行しないので演算処理に影響は出ないはずです。逆にそれが影響しちゃったら、困るでしょう?

現在の制御構文が充実している手続き型言語では、goto文は使わないほうが望ましいとされています。goto文を多用すると、処理の流れが掴みにくく、バグの原因になるし、後々ソースコードを読むときにも、理解を妨げるからです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/16 21:37

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