• 締切済み

どうやっても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に飛ぶと、無くなってしまうのでしょうか? 何を言っているのか分からないなどございましたら、ご指摘ください・・・;; 以上、よろしくお願いします。

みんなの回答

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.6

> for roop + 2 To sheets("シート1").cells(7,4) これでは、他の記述も疑ってかからないと ^^; 一応、他のコード(引数など)が正しく書かれているものとして モジュールの先頭に 「Option Explicit」 は書かれていますか? 無ければ追加してください。 訳のわからない動作が減る可能性はあります。 あとは、ここに転記されていないコードでエラーが発生して、 エラーで止まらないような設定(あるいはコード)のため エラー処理のない一番上位のプロシージャで 抜けてしまっている、 などの場合に、こんなことになるかも。 とにかくコードを書きたい というお気持ちもわかりますが 「急がば回れ」です。 まずはVBAの基礎から勉強しましょう。

kumainu555
質問者

お礼

ご回答が遅くなり申し訳ありませんでした。 ご指摘頂きありがとうございました。 「Option Explicit」のおかげで記述ミスをしている箇所を見つけました…。 ありがとうございました。 >とにかくコードを書きたい >というお気持ちもわかりますが >「急がば回れ」です。 >まずはVBAの基礎から勉強しましょう。 ですね…。 まだ1週間も経ってないので、本でも買って基礎を身につけたいと思います。

noname#184106
noname#184106
回答No.5

こんにちわ。 まだ解決に至っていないものと考え、投稿いたします。 おそらく、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 ナイスぼけです。

kumainu555
質問者

お礼

ご返事が遅くなり申し訳ありませんでした。 昨日からネットがおかしくなりオフラインで作業しておりました。 質問内容ですが、記述ミスがあった箇所を見つけて解決いたしました…。 わざわざご回答頂きありがとうございました。 >roopはLoopですよね!(^-')b ナイスぼけです。 その通りですね。 なんたってVBA初めて4日くらいで、しかも英語の成績1ですからね。 そんなもんです。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

とりあえず 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") の方が分かりやすくないですか?

kumainu555
質問者

お礼

ご回答頂きありがとうございました。 Debug.Print roop call sample2 Debug.Print roop これ便利ですね;; 今後有効活用させてもらおうと思います! >ところで >cells(7,4) >より >Range("D7") >の方が分かりやすくないですか? たしかに;; セルの値を変数に置き換えない箇所は、出来る限りRange()とするようにします;; 慣れてる人は良いと思いますが…;;

  • bluelake
  • ベストアンサー率32% (64/197)
回答No.3

変数の扱いをどうしているのか判りませんが、2つの関数でroopを共通にするのはよくありませんよ。 Sample2()の冒頭で、 roop2 = roop などを行ない、置き換えたらどうですか? 尚、Sample2()の中の roop + 1 は何でしょうか? roop = roop + 1 なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。

kumainu555
質問者

お礼

ご回答頂きありがとうございました。 >尚、Sample2()の中の >roop + 1 >は何でしょうか? >roop = roop + 1 >なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。 ご指摘の通り、ココもミスっていました…。 まだ超が付くほどの初心者なので、Do文というものを知りませんでしたw 基礎から出直してきます…;; ありがとうございました!

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.2

’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)
回答No.1

そもそもFOR文の文法が間違ってます。 FOR 変数=初期値 TO 終了値 でなければいけません。 FOR ROOP+2 TO 100 ではエラーで動かないと思いますが……。

kumainu555
質問者

補足

ご回答頂きありがとうございます>< あ、、、タイプミスです;; Sample1のFor文ですが、「roop = 2」となっております;; ごめんなさい…。 ご指摘ありがとうございました。

関連するQ&A