• ベストアンサー

処理速度向上のための小さな努力

VB6+sp6で開発しています。 最近、変数宣言でInteger型よりもLong型の方が処理が早いとか If Trim$(strHoge) = vbNullString then の比較よりも If Len(Trim$(strHoge)) = 0 then の方が早いと教えてもらいました。 実際は何万回も処理が走った時に数秒の差が出る程度だということなのですが ほんとに処理速度向上に効果あるのでしょうか? それと共にこんな小さなコードの書き方の違いで 処理効率が良くなったりする方法が他にもあるのか気になりました。 現場でよく使われているようなポピュラーな手法があったら是非教えてくださいm(_ _)m

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

  • ベストアンサー
回答No.2

>ほんとに処理速度向上に効果あるのでしょうか? Private Sub Form_Load() Dim sngNowtime As Single Dim strHoge As String Dim i As Long i = 0 sngNowtime = Timer Do While i < 1000000 If Trim$(strHoge) = vbNullString Then i = i + 1 DoEvents End If Loop Debug.Print "Trim$(strHoge) = vbNullString :"; Timer - sngNowtime i = 0 sngNowtime = Timer Do While i < 1000000 If Len(Trim$(strHoge)) = 0 Then i = i + 1 DoEvents End If Loop Debug.Print "Len(Trim$(strHoge)) = 0 :"; Timer - sngNowtime End Sub うーん。微差。 1さんのURLの内容と被るかもしれませんが私は ・オブジェクトのTextやCaptionプロパティなどを直接参照しない ・Withを使う ・なるべくFor eachを使う などを意識していますね。普通に。 ファイルアクセスとかDBをあたりに行ったりする明らかに重い動作を重点的にチェックするのが一番効果が目に見えて楽しいかも。

その他の回答 (1)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 いくつか載っているページを紹介します。 http://www.bcap.co.jp/hanafusa/ ([VB6.0関係]→[その他]→[プログラムの最適化]) http://www.mb.ccnw.ne.jp/garger-studio/vbgame/best_idx.html 可読性とのバランスだと思いますが。 あとは、単純なループ処理の場合など、待ち時間の精神的負担の軽減というアプローチもあるでしょう。 (進行インジゲータの表示など。)

参考URL:
http://www.bcap.co.jp/hanafusa/,http://www.mb.ccnw.ne.jp/garger-studio/vbgame/best_idx.html

関連するQ&A

  • マクロの処理速度向上

    教えてください。マクロ初心者です。以下のようなマクロを組みました。 Sub 処方箋一覧() Dim vbOK As Integer Set WS1 = Worksheets("sheet1") Set WS7 = Worksheets("sheet7") WS7.Select Range("b2").Select Selection.End(xlDown).Select ActiveCell.Offset(1, -1).Select ActiveCell.Offset(0, 1) = WS1.Range("B3") ActiveCell.Offset(0, 2) = WS1.Range("h3") ActiveCell.Offset(0, 3) = WS1.Range("q3") ActiveCell.Offset(0, 4) = WS1.Range("v3") ActiveCell.Offset(0, 5) = WS1.Range("y3")         ~中略~ ActiveCell.Offset(0, 167) = WS1.Range("w75") ActiveCell.Offset(0, 168) = WS1.Range("x75") vbOK = MsgBox("入力完了!!", vbOKOnly, "処理確認") If vbOK = 1 Then Worksheets("sheet1").Activate End If End Sub 合計で167のセルを違うシートに転記するマクロです。 動作するのですが、速度が非常に遅くて困っています。 処理速度を向上させるようなマクロの組み方を調べているのですが、わからず困っています。どなたか、教えていただけると助かります。 よろしくお願いいたします。

  • ループ中でのmy宣言と処理速度

    こんにちは、Perl入門者ですがよろしくお願いします。 質問内容はループ中にmy宣言をいちいちすると処理速度は落ちてしまうのかということです。 ソースを例に挙げると まず、$lenをループの外に書く方法と my $i; my $len; for( $i=0 ; $i<1024 ; $i++){ $len = length($str[$i]; } $lenをループの中に書く方法 my $i; for($i=0 ; $i<1024 ; $i++){ my $len; $len = length($str[$i]); } の2種類です(その他の変数については特に言及していません) 使いやすさでいえば、ループ内で宣言をした方が自動的に初期化されるのでうれしいのですが ふと、いちいちメモリの解放と確保を行っているわけですからOS(?)に負荷がかかって遅くなっているのではと考えました。 Perlで処理速度を測ることもできるようですが恥ずかしいながらスキル不足です。すいません。 どなたかご存知の方、自分なりの考えがある方はご教授頂きたく存じます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

  • VBAで変数定義を変更する方法

    Data_Typeという変数の中に文字列doubleが入っていたら、 AIyyという変数をdoubleで定義、 longが入っていたらlongで定義するというプログラムを作りたいのですが If Data_Type = "double" Then Dim AIyy As Double ElseIf Data_Type = "long" Then Dim AIyy As Long End If と書くと、定義が重複しているというエラーが表示されてうまくいきません。 これはどうすれば良いでしょうか? それと一度integerで定義した変数をlongなどに定義を変更したい場合どのようにすれば良いでしょうか?

  • マクロの処理速度を上げたい

    例えば"A1"から"Z100"までランダムに数字が入っている場合に、 次の処置をしたいのです。  処理A:10以下の数値を0に置き換える。 "A1"から始まるのはほぼ決まっているのですが、 最後のセルが決まっていません。 いろいろなときに使えるように下記マクロを作りましたが、 データ量が多いのか、処理に時間がかかってしまいます。 (本番データは200×3000件くらいあり、処理も例より複雑です) 処理は行えているみたいなので、速度を上げるのにいい方法はないか 相談させてください。 プログラムの知識は基本情報処理試験のC言語を勉強していた くらいです。マクロは本を見ながら作っているので、調べきれて いない部分もあるかもしれませんが、よろしくお願いいたします。 参考にしている本は、C&R研究所のEXCEL VBAハンドブックです。 ====ここから==== sub テスト() '使用する変数  dim LastColNum as integer  dim i as integer  'A1をアクティブにします  range("A1").select  '最後の列の行番号を調べます  LastColNum=range("A1").end(xlToRight).column  'アクティブなセルが空白になるまで処理を続けます  Do Until activecell.value=""   '行数分処理を続けます   for i=0 to LastColNum-1    '10未満だったら処理をします    if activecell.offset(0,i).value<10 then     '10未満のセルに0を入力します。     activecell.offset(0.i).value=0    end if   next   '次の行をアクティブにします   activecell.offset(1,0).activate  Loop end

  • プログラムのイベント処理中断方法

    VB2008のイベンド中止処理についてお教え頂けませんでしょうか。 Formにボタンが1つあり、クリックするとCSVファイルが出力される処理をしたいです。 やりたい処理: 1. 「CSVファイル出力しますか?」というメッセージを出す。YESなら処理続行。Noなら処理中止。 2. CSVファイル出力処理。 3. 「CSVファイルを出力しました。」 (プログラム自体を終了したいわけではありません) VBAだと下記のようなコードを書きたいです。 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end end if 'CSV出力処理~~~ end sub VBにendというステートメントがあれば、良いのですが無さそうです・・・ 何か上手な処理はあるでしょうか?VBAのコードになってしまいますが、下記のような処理方法しかないでしょうか? '''''''''''''''''1 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end else 'CSV出力処理~~~ end if end sub ''''''''''''''''2 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then goto here end if 'CSV出力処理~~~ here: end sub

  • メッセージBOXの「はい」「いいえ」の処理について

    お世話になっております。 エクセルマクロで処理を行うときに メッセージBOXにて「はい」か「いいえ」のボタンを押して 実行か中断の処理を行なっていたいのですが、 「いいえ」を押しても処理が実行されてしまいます。 以下で作成しております。 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub IP呼び出し() Dim keizoku As Integer Dim rc As Long rc = MsgBox("処理を続けますか?", vbYesNo + vbQuestion) If rc = vbYes Then MsgBox "処理を続けます", vbInformation Else MsgBox "処理を中止します", vbCritical End If Dim Wsh, wExec, cmd, rRes, i, j Dim sBuf() As String Set Wsh = CreateObject("WScript.Shell") For i = 2 To Cells(Rows.Count, 3).End(xlUp).Row Set wExec = Wsh.exec("%ComSpec% /c nslookup " & Cells(i, 3)) Do While wExec.Status = 0 DoEvents Loop Sleep 1 rRes = wExec.StdOut.ReadAll 'MsgBox rRes sBuf = Split(rRes, vbCrLf) For j = 0 To UBound(sBuf) If Left(sBuf(j), 5) = "Name:" Or Left(sBuf(j), 3) = "名前:" Then Cells(i, 18) = Trim(Right(sBuf(j), Len(sBuf(j)) - 5)) End If Next j Next i MsgBox "ドメインを確認して下さい。", vbOKOnly, "マクロが終了しました" End Sub Excel2010で行なっております。 ご教授の程、よろしくお願いいたします。

  • VB6で最後に$が付く変数名に付いて

    VB6で質問です。 変数名の宣言で以下のように$が最後に付いた変数が宣言されているプログラムを 見ることになりました。 Dim x1$ ネットで調べたのですが、有効な情報がなく、ご存知の方がいましたら、 教えていただければと思います。 調べた限りでは以下のような動作をするため、 「何か意味があるのでは?」と考えているのですが、分からない状態です。 分かっている現象 Dim x1$ '←OKとなる Dim x1$ as Integer '←構文エラーとなる Dim x$1$ '←構文エラーとなる ほかにも同様に、変数名の後ろに付く文字として、 "%"もあるのですが、同様な状態です。 ご存知の方がいましたら、 教えていただければと思います。

  • VBAについて教えてください。

    職場のエクセルのVBAを見ていたら、下記のように書かれていました。VBAを勉強し始めたばかりで何が書かれているのか解りません。 お手数ですが教えてください。よろしくお願いします。 Function F_Crypt(Data As Long, Seed As String) As Long Dim i As Long, j As Integer, act1 As Long, act2 As Long, iSeed As String If Len(Seed) > 3 Then j = 3 Else j = Len(Seed)

  • FindWindowについて

    APIにFindWindowってありますよね。 MSDNには、Windowが見つからなかったらNULLを返すとありますが、以下のソースではNULL(0)が返ってきません。この理由を教えてください。 '宣言部 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'コード内 Dim ret As Long   ret = FindWindow(vbNullString, "テスト")   If ret = 0 Then     MsgBox("なし")   End If でret =767863736466669568になる。 ちなみに「テスト」というウィンドウなんてありません。 環境は、XP、VB.net2003です。 困っています。よろしくお願いいたします。

専門家に質問してみよう