- ベストアンサー
エクセルのマクロでループ処理
エクセルのマクロで、ループを使っています 下の様な感じです。 sub TEST() a: re=re+1 if ○○=○▲ THEN GOTO b: 処理・・・ goto a: b: end sub() ですが、これの書き方はDo WhileやDo Untilを使った方が 早く処理できるのでしょうか? また、書き方等もお教え下されば助かります。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 変な回答をしてしまったようですね。申し訳ありません。 またもや的外れっぽいの承知で書かせていただきます。 >早く処理できるのでしょうか? 現在の処理速度を遅いと感じているのですか? でしたら参考URLを参考にしてみるとちょっと改善されるかもしれません。 While文とFor文の違いなんてミリ秒単位じゃないですかね。 初心者の方が気にするほどの差ではないと思いますが…。 あと、先ほども書きましたが、GoToは見づらいです。 先ほどのお礼に書いてあったサンプルですら「Bってどこよ?あれ、Aって?ないじゃん」という感じです。 これでコードがもっと長くなったら探すのが嫌になります。 naopon2000さんも今はいいかもしれませんが、将来メンテナンスしようとしたら大変なことになるかもしれませんし…。 なるべく早く「ラベルでループ制御」からは卒業しましょう。
その他の回答 (8)
- hana-hana3
- ベストアンサー率31% (4940/15541)
#2 です。 提示されたコードの不明点が多々ありますが、ループ処理する場合にセルの挿入や削除を行うには、コードの動作が理解できていないと予期しない結果を招く事になります。 また、挿入や削除はそれなりに処理に負担が掛るので、実行速度が低下する要因になります。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 私は、#1 のBASICのようなコードがなかなか読めませんでした。何とか、VBEditor で読み直しましたが、基礎的な部分で、VBAをご存知ない方だと思います。ただ、あえていうと、GOTO を使う、とか使わないとかいうのは、今の段階では関係ないです。 問題点があるとすれば、こういう部分にあると思います。 >Cells(2, 2).Activate >Selection.Delete Shift:=xlUp つまり、セルの位置が動いていないということです。これは、初級レベルの問題ですから、できましたら、教本で確かめてください。失礼かもしれませんが、いきなり、掲示板でVBAのコードを出して質問するレベルではないと思います。入門2週目ぐらいのレベルです。今は、記録マクロに頼ってしまったほうが良いかもしれません。 実践向きのコードは、あまり早く手をつけないほうがよいです。混乱してきます。また、私自身のアドバイスとしては、VBAでセル(Cells-Range)を扱うのは、本当にややこしいです。 「こういうつもりのコードではない」という返事もいただきそうな気がします。「番号」が降順になってほしいというリクエストもあろうかとは思いますが、あえて、今は、たたき台のサンプルです。 Sub Sample1() Dim 番号 As String Dim FILE1 As String Dim MyPath As String MyPath = "C:\テスト\" i = 1 '初期値 Do While Cells(i + 1, 2).Value <> "" 番号 = Cells(1 + i, 2).Value If Dir(MyPath & 番号 & "a.jpg") <> "" Then FILE1 = Dir(MyPath & 番号 & "a.jpg") Cells(i, 1).Value = FILE1 Else Cells(i, 3).Value = 番号 End If i = i + 1 Loop End Sub
お礼
適切なご意見ありがとうございます。 いえいえ、今は色々なコードを参照していきたいので勉強になります。 また、いろいろなマクロを参照して見易いマクロ作成を心掛けたいと思います。
- zap35
- ベストアンサー率44% (1383/3079)
#03です。#01さんの回答の補足を見ていますが、ラベルaが書かれていませんね。Sub TEST()の次になるのでしょうか? だとしても変なロジックに思います。なんかループしそうな… (B2に書かれているのはフォルダ名(番号)ですね。このフォルダにa.jpgがあれば2行目に行挿入して、FILE名を書き込み、If文の後で行削除しているようにみえる。B2が空白じゃなかったら延々と繰り返しませんか) むしろ何をやりたいのか書いてください。 例)B2~Bnセルに書かれているフォルダに*.jpgファイルがあったらファイル名をA列、フォルダ名をB列に書きだしたい。 ただしこの例のような場合は別シートに書きだす方が一般的だと思いますが…
- uro_tan
- ベストアンサー率15% (6/40)
1) GoToは使わない方が良いです。 If 番号 = "" Then GoTo B: ↓ If 番号 = "" Then Exit Sub 2) 全箇所共通ですが、Activateは不要です。処理も遅くなります。 Cells(2, 1).Activate Selection.Insert Shift:=xlDown ↓ Cells(2, 1).Insert Shift:=xlDown 3) 「A」とはどこですか?GoToを使うとコードが分かりにくくなります。 GoTo A: ↓ ???
- zap35
- ベストアンサー率44% (1383/3079)
一般的なものを3パターン書きます。(もっとありますが) Sub Macro1() Re = 1 Do While ○○ <> ○▲ 処理 Re = Re + 1 Loop End Sub ------------------------------- Sub Macro2() Re = 1 Do If ○○ = ○▲ Then Exit Do Else 処理 Re = Re + 1 End If Loop End Sub ------------------------------- Sub Macro3() For Re = 1 To 10000 If ○○ = ○▲ Then Exit For Else 処理 End If Next Re End Sub プログラミング手法にもいろいろありますが、「プログラムの下から上へGoto文で制御を飛ばすのは好ましくない」と覚えてください。Goto文は On Error Goto文のようにエラーを引っかける場合か、Loopや処理を抜ける場合に限り使用する方が良いと思います。(Exit文がある場合はGoto文より、そちらを優先して使用する) これは後からプログラムをデバッグするために見やすくするためです。下から上へのGoto文を使用するとプログラムが動かないという意味ではありません。
- ham_kamo
- ベストアンサー率55% (659/1197)
Goto文はできるだけ使わない方がいいです。 ある回数だけ処理を繰り返す場合は、 For i = 1 to 10 処理 Next とFor~Nextを使いますが、ループの終了条件が○○=○▲というような場合は、 sub TEST() Do While ○○<>○▲ re = re + 1 処理… Loop End Sub または、 sub TEST() Do Until ○○=○▲ re = re + 1 処理… Loop End Sub と書くのがよいでしょう。
お礼
どうもご返答ありがとうございます! 上記の処理を試してみます。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>早く処理できるのでしょうか? 処理時間の問題ではありません。 近年のプログラミングでは『GOTO文 排除』が普通です。 理由は、読みやすい(理解しやすいのでミスを減らせる)プログラムにできるからです。 エラートラップなどを除いてラベル(Goto)は使っていません。 (エクセル)VBAの速度アップは、構文の組立てではなくて、記録マクロを模倣しない事などいくつもの基本があります。 xxxx.Select Selection.xxxxx xxxxx.Activete などの記述を極力減らすだけでもかなり違って来ます。 Sub TEST() Do While ○○ <> ○▲ re = re + 1 '処理・・・ Loop End Sub
お礼
なるほど、そうでしたか、GOTO文 排除とは・・・ 確かにgoto使わずにいけそうですね。 もう一度組み直してみます。 ありがとうございます。
- yukika-37
- ベストアンサー率39% (26/66)
処理速度以前に可読性に問題があるような…。 もしif文の条件でreの値を評価しているなら、For文とかどうでしょうか。 例えばですが… sub TEST() a: re=re+1 if re=10 THEN GOTO b: 処理・・・ goto a: b: end sub() ↓ sub TEST() For re = 1 To 10 処理・・・ Next end sub() とか。
補足
早速のご返答ありがとうございます。 質問の出し方が不適切でした。申し訳ありません。 if文の条件でreの値を評価してなく、厳密に記入しますと、 B2から下へ特定の番号が入ってます(数は不定期)。 SUB test() 番号 = Cells(2, 2) If 番号 = "" Then GoTo B: FILE1 = Dir("C:\テスト\" & 番号 & "a.jpg", vbNormal) If FILE1 <> "" Then Cells(2, 1).Activate Selection.Insert Shift:=xlDown Cells(2, 1).Activate Cells(2, 1) = FILE1 Else: Cells(2, 3).Activate Selection.Insert Shift:=xlDown Cells(2, 3) = 番号 End If Cells(2, 2).Activate Selection.Delete Shift:=xlUp GoTo A: B: End Sub の様な感じです。二度手間で申し訳ありません。
補足
適切なご回答いたみいります。 確かにどんどん追加していくと見づらい面が多々あります。 この機会に挑戦してみたいと思います。 どうもありがとうございました!