- 締切済み
どうやってもFor文を抜けてしまいます…(VBA)
いつもお世話になっております。 VBAで作業をしていたところ、とある箇所でずっと詰まってしまい、 また皆様のお力を借りたいと思い・・・。 おそらく、基礎中の基礎かもしれませんが、お付き合い頂ければ助かります;; 【質問内容】 Functionが2つあったとします。 現在のFunctionから、別のFunctionに飛んで、また元のFunctionに戻ってきた際に、 Forでループ中でも抜けてしまうのでしょうか? おそらく、何を言ってるか分からないと思いますので、以下にコード例を記載します。 _________________________________ 【コード例】 function sample1() Dim roop as Long ’シート1のCell(7,4)には「100」と入力されており、「roopが2~100」の間ループさせます。 for roop + 2 To sheets("シート1").cells(7,4) 処理2 ’特定条件を満たしたら、「sample2」に飛びます。 if 条件 then call sample2 End If next End function _________________________________________________________________________________________ function sample2() ’sample1()で使用していたroop変数をそのまま使用します for roop + 1 To 50 処理2 roop + 1 next ’処理が終わりsample1()のnextに戻ります。 ’roopには、仮に50が格納されているとします。 End function _________________________________________________________________________________________ 上記のコードとなります。 最初はSample1()で処理を行い、特定条件を満たしたらSample2()に移行。 Sample2()の処理が終わったら、元のSample1()に戻る。 2つのFunction内で使用していた「roop」変数は、まだ80にも関わらず、 Sample1()のFor文を抜けてしまいます。 Sample1()のForのループ条件は「2~100」としていますが、 これは別のFunctionに飛ぶと、無くなってしまうのでしょうか? 何を言っているのか分からないなどございましたら、ご指摘ください・・・;; 以上、よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- m3_maki
- ベストアンサー率64% (296/460)
> for roop + 2 To sheets("シート1").cells(7,4) これでは、他の記述も疑ってかからないと ^^; 一応、他のコード(引数など)が正しく書かれているものとして モジュールの先頭に 「Option Explicit」 は書かれていますか? 無ければ追加してください。 訳のわからない動作が減る可能性はあります。 あとは、ここに転記されていないコードでエラーが発生して、 エラーで止まらないような設定(あるいはコード)のため エラー処理のない一番上位のプロシージャで 抜けてしまっている、 などの場合に、こんなことになるかも。 とにかくコードを書きたい というお気持ちもわかりますが 「急がば回れ」です。 まずはVBAの基礎から勉強しましょう。
こんにちわ。 まだ解決に至っていないものと考え、投稿いたします。 おそらく、Sample2の最初のところは Sub Sample2(roop as integer) のように記述されているかと思いますので、これを Sub Sample2(byval roop as integer) としてみていただけますか。 そうするとSample1に戻った時にFor文を抜けないはずです。 http://homepage1.nifty.com/CavalierLab/lab/vb/byvalbyref.html roopはLoopですよね!(^-')b ナイスぼけです。
お礼
ご返事が遅くなり申し訳ありませんでした。 昨日からネットがおかしくなりオフラインで作業しておりました。 質問内容ですが、記述ミスがあった箇所を見つけて解決いたしました…。 わざわざご回答頂きありがとうございました。 >roopはLoopですよね!(^-')b ナイスぼけです。 その通りですね。 なんたってVBA初めて4日くらいで、しかも英語の成績1ですからね。 そんなもんです。
- kmetu
- ベストアンサー率41% (562/1346)
とりあえず roop の値を call sample2 の前後で確認してみましょう。 Debug.Print roop call sample2 Debug.Print roop でイミディエイトウィンドウに値が表示されます。 ちなみに現状質問のコードの状態でしたら、Sample1()とSample2()で利用しているroop変数は別々のものでSample2()から戻ったときにSample1()のroop変数に変化は無いはずです。 また実際 シート1のセルD7 に100と入力されているのかも確認してみましょう。 ところで cells(7,4) より Range("D7") の方が分かりやすくないですか?
お礼
ご回答頂きありがとうございました。 Debug.Print roop call sample2 Debug.Print roop これ便利ですね;; 今後有効活用させてもらおうと思います! >ところで >cells(7,4) >より >Range("D7") >の方が分かりやすくないですか? たしかに;; セルの値を変数に置き換えない箇所は、出来る限りRange()とするようにします;; 慣れてる人は良いと思いますが…;;
- bluelake
- ベストアンサー率32% (64/197)
変数の扱いをどうしているのか判りませんが、2つの関数でroopを共通にするのはよくありませんよ。 Sample2()の冒頭で、 roop2 = roop などを行ない、置き換えたらどうですか? 尚、Sample2()の中の roop + 1 は何でしょうか? roop = roop + 1 なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。
お礼
ご回答頂きありがとうございました。 >尚、Sample2()の中の >roop + 1 >は何でしょうか? >roop = roop + 1 >なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。 ご指摘の通り、ココもミスっていました…。 まだ超が付くほどの初心者なので、Do文というものを知りませんでしたw 基礎から出直してきます…;; ありがとうございました!
- masatsan
- ベストアンサー率15% (179/1159)
’sample1()で使用していたroop変数をそのまま使用します まーそんなことあまりやらないですけど。 roop変数はグローバル変数なんですか? (変数はなんでもよいけど普通はスペルはloopですね) sample2のfor文は for roop=1 to 50 ですか? しかも roop=roop+1 をfor文内でやるんですか?意味不明。 sample2でroopが50になってsample1に戻るので抜けてしまうどころか永久に1のforは抜けませんよ。 コードを正確に書いてください。 無駄な改行は入れずに。
- okgoripon
- ベストアンサー率44% (1141/2548)
そもそもFOR文の文法が間違ってます。 FOR 変数=初期値 TO 終了値 でなければいけません。 FOR ROOP+2 TO 100 ではエラーで動かないと思いますが……。
補足
ご回答頂きありがとうございます>< あ、、、タイプミスです;; Sample1のFor文ですが、「roop = 2」となっております;; ごめんなさい…。 ご指摘ありがとうございました。
お礼
ご回答が遅くなり申し訳ありませんでした。 ご指摘頂きありがとうございました。 「Option Explicit」のおかげで記述ミスをしている箇所を見つけました…。 ありがとうございました。 >とにかくコードを書きたい >というお気持ちもわかりますが >「急がば回れ」です。 >まずはVBAの基礎から勉強しましょう。 ですね…。 まだ1週間も経ってないので、本でも買って基礎を身につけたいと思います。