プロが教えるわが家の防犯対策術!

いつもお世話になっております。
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に飛ぶと、無くなってしまうのでしょうか?


何を言っているのか分からないなどございましたら、ご指摘ください・・・;;

以上、よろしくお願いします。

A 回答 (6件)

> for roop + 2 To sheets("シート1").cells(7,4)



これでは、他の記述も疑ってかからないと ^^;

一応、他のコード(引数など)が正しく書かれているものとして

モジュールの先頭に

「Option Explicit」 は書かれていますか?

無ければ追加してください。
訳のわからない動作が減る可能性はあります。

あとは、ここに転記されていないコードでエラーが発生して、
エラーで止まらないような設定(あるいはコード)のため
エラー処理のない一番上位のプロシージャで
抜けてしまっている、
などの場合に、こんなことになるかも。

とにかくコードを書きたい
というお気持ちもわかりますが
「急がば回れ」です。
まずはVBAの基礎から勉強しましょう。
    • good
    • 1
この回答へのお礼

ご回答が遅くなり申し訳ありませんでした。

ご指摘頂きありがとうございました。
「Option Explicit」のおかげで記述ミスをしている箇所を見つけました…。
ありがとうございました。

>とにかくコードを書きたい
>というお気持ちもわかりますが
>「急がば回れ」です。
>まずはVBAの基礎から勉強しましょう。

ですね…。
まだ1週間も経ってないので、本でも買って基礎を身につけたいと思います。

お礼日時:2013/08/26 01:51

こんにちわ。


まだ解決に至っていないものと考え、投稿いたします。
おそらく、Sample2の最初のところは
Sub Sample2(roop as integer)
のように記述されているかと思いますので、これを
Sub Sample2(byval roop as integer)
としてみていただけますか。
そうするとSample1に戻った時にFor文を抜けないはずです。
http://homepage1.nifty.com/CavalierLab/lab/vb/by …

roopはLoopですよね!(^-')b ナイスぼけです。
    • good
    • 0
この回答へのお礼

ご返事が遅くなり申し訳ありませんでした。
昨日からネットがおかしくなりオフラインで作業しておりました。

質問内容ですが、記述ミスがあった箇所を見つけて解決いたしました…。
わざわざご回答頂きありがとうございました。

>roopはLoopですよね!(^-')b ナイスぼけです。
その通りですね。
なんたってVBA初めて4日くらいで、しかも英語の成績1ですからね。
そんなもんです。

お礼日時:2013/08/26 01:48

とりあえず 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")
の方が分かりやすくないですか?
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございました。

Debug.Print roop
call sample2
Debug.Print roop

これ便利ですね;;
今後有効活用させてもらおうと思います!

>ところで
>cells(7,4)
>より
>Range("D7")
>の方が分かりやすくないですか?

たしかに;;
セルの値を変数に置き換えない箇所は、出来る限りRange()とするようにします;;
慣れてる人は良いと思いますが…;;

お礼日時:2013/08/26 01:52

変数の扱いをどうしているのか判りませんが、2つの関数でroopを共通にするのはよくありませんよ。



Sample2()の冒頭で、
roop2 = roop
などを行ない、置き換えたらどうですか?

尚、Sample2()の中の
roop + 1
は何でしょうか?
roop = roop + 1
なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございました。

>尚、Sample2()の中の
>roop + 1
>は何でしょうか?
>roop = roop + 1
>なら、Do ~ loopでは使いますが、For ~ next では使わないと思います。

ご指摘の通り、ココもミスっていました…。
まだ超が付くほどの初心者なので、Do文というものを知りませんでしたw
基礎から出直してきます…;;

ありがとうございました!

お礼日時:2013/08/26 01:55

’sample1()で使用していたroop変数をそのまま使用します


まーそんなことあまりやらないですけど。
roop変数はグローバル変数なんですか?

(変数はなんでもよいけど普通はスペルはloopですね)
sample2のfor文は 
for roop=1 to 50
ですか?
しかも roop=roop+1 をfor文内でやるんですか?意味不明。

sample2でroopが50になってsample1に戻るので抜けてしまうどころか永久に1のforは抜けませんよ。
コードを正確に書いてください。
無駄な改行は入れずに。
    • good
    • 0

そもそもFOR文の文法が間違ってます。



FOR 変数=初期値 TO 終了値

でなければいけません。

FOR ROOP+2 TO 100

ではエラーで動かないと思いますが……。

この回答への補足

ご回答頂きありがとうございます><

あ、、、タイプミスです;;

Sample1のFor文ですが、「roop = 2」となっております;;
ごめんなさい…。

ご指摘ありがとうございました。

補足日時:2013/08/25 05:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A