
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件)
- 最新から表示
- 回答順に表示
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オブジェクトの生成と比べると無視できるレベル
と言ったところでしょうか。
実験していただいて恐れいります。
まだまだプログラムの組み方がへたくそで、大きなコードをひとまとまりとして、Select文で選択させて実行するようなものしかつくれなくて、もっと勉強してスマートなコードを書けるようになりたいです!
ありがとうございます!
No.4
- 回答日時:
一部には、飛び先を毎回探すので遅くなる、という処理系もあります
昔のBasicでラベルを使ったときに、行番号指定より遅くなる、とか、先頭に書いたラベルへは速く、後に書いたラベルへは遅い、とかがありました。
遅くなるのでコメントは入れない、という技もありました。
しかし、現在の多くの処理系では、実行前処理として飛び先を調べておくので、実行速度への影響はほとんどありません。
コメントも前処理段階で無いものとして扱うので、影響はありません。
最初の例で、Goto Bがあるとエラーにならないのも、前処理の結果、A=A+"あ"の行を実行することが無いことが判明したので削除したのでしょう。
勉強不足ですみません。
「実行前処理」ってのをやってくれるのですね。
それと、Basic時代のお話ありがとうございました!
勉強になりました!
先の質問でのお礼文にもありましたが、
まだまだVBAプログラミングに精進している身で、
自身の注釈コメントがハンパないんですw
でも、シングルクォーテーションでくくられた自身の試行錯誤記録みたいなものが、
処理に関しては影響しないことがわかりました!
ありがとうございました!
No.3
- 回答日時:
インタープリタ・コンパイラの実際のMSの作成者が答えないと十分は判ら無いが、ソースの上でのステップで飛ばすところは実行されないと考えるほか無い。
そんなことはコンパイラの仕組みでも勉強した時に考えた良いでしょう。また今はコンピュターの実行速度が速くなっているので余り考える意味はあまり無い。コンパイラにかかって機械語になると、原形ソースの順序などずたずたに変えられる可能性もある。
知りたい欲望がもたげてくるのはわかるが、そんなことを聞いて回っても答えてくれる人にこんな質問コーナーでは出会わないと考えたほうが良かろう。
少しヒントを得たかっただけなんです。
私はまだ、若輩者で私が作ったコードにも無駄が多数あると思います。
そのコードに何通りかのやり方を考えて、Select Case文で分けて、Timer関数で時間を計ったときに、
Select文の該当しない部分にも演算計測がされていたらイヤだな~なんて思い、
こんな質問をしてしまいました。
興味深いご回答ありがとうございました!
No.2
- 回答日時:
GoToやSelect Caseで実行されなかった命令は処理の速さに影響しません。
なぜなら実行されていないからです。
シングルクォーテーションでコメントにした行も同様です。
また大量のデータ扱う処理や余程無駄の多い処理でない限り、
今のPCのスペックでは処理時間の遅い・速いをなかなか認識できないと思います。
もし処理速度が気になるようでしたら、
オブジェクトアクセス(シートやセルへの書き込みや読み取りなど)を極力減らすことや、
ループ構造を無駄の少ないように見直してみると良いと思いますよ。
やっぱりExcel VBAの処理速度はシートとのやり取りですよね。
できるだけ配列にぶちこんで、結果を出力する際の体裁などは、
なるべく最後にしています。
書式設定もその値を配列にぶちこんで、最後に配列の値からシートに換算する方法でやるようにしました!
ご回答ありがとうございます!
No.1
- 回答日時:
Basicでは、シングルクォートで始まる行は、コメントとして、コンパイル対象になりません。
したがって、「無いのと同じ」で、当然演算時間なんかありません。
gotoで飛ばしただけのコードでは、実際に実行はされなくても、コンパイルしますので、コードが生成されます(最適化処理により、削られる可能性はあるけど)。もちろん実行しないので、時間はかかりませんが。
で、該当しないcase節ですが、当然実行しないので演算処理に影響は出ないはずです。逆にそれが影響しちゃったら、困るでしょう?
現在の制御構文が充実している手続き型言語では、goto文は使わないほうが望ましいとされています。goto文を多用すると、処理の流れが掴みにくく、バグの原因になるし、後々ソースコードを読むときにも、理解を妨げるからです。
ご回答ありがとうございます。
プログラミング自体に慣れていなくて、
やっぱり文字数とかも演算速度に関係あるんだろうか?なんて思っていましたが、
すっきりしました。
なにせまだ日が浅いもので、コメント注釈なんかもフェルマーが言った「足りない余白」は気にならないくらい打ち込んでいるものでしてw
特に、
>逆にそれが影響しちゃったら、困るでしょう?
のあたり、「そうですよねー!」って安心しちゃいました!
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でボタン名を変更しても動く
-
以下のコードを実行しても、オ...
-
〔Excel:VBA〕マクロの実行が異...
-
デザイン時のVisible=Falseは実...
-
VBA ステータスバー DoEvents
-
JavaScriptでショートカットキ...
-
リクエスト結果が一瞬しか表示...
-
2回目のSortメソッドが失敗~20...
-
JSPの処理の途中で、JavaScript...
-
resizeToメソッドが動作しません
-
if(1){...}とはどういうことで...
-
列を非表示にするマクロが実行...
-
VB.netの重複データ数カウント...
-
javascriptでこのコードの意味...
-
JavaScript(ライブラリ)のキ...
-
文字認証の問題
-
VB.NET2003 テキストボックスに...
-
VC#でテキストボックスに変数の...
-
javascript で外部サイトにデー...
-
エクセルVBA/ Formatで文字列が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
JavaScriptでショートカットキ...
-
以下のコードを実行しても、オ...
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
〔Excel:VBA〕マクロの実行が異...
-
VBA ステータスバー DoEvents
-
リクエスト結果が一瞬しか表示...
-
ラベルの色がかわってくれない
-
1つのVBAコードをすべてのコア...
-
VBA SORT Applyでエラー
-
初心者です。gulpでコンパイル...
-
eval()の危険性の具体例を教え...
-
列を非表示にするマクロが実行...
-
PowerPointで時計表示
-
innerHTMLなどの反映タイミング
-
VB.netでタイマーがスタートし...
-
JavaScriptで、実行するたび値...
-
javascriptで最初のところに戻...
おすすめ情報