[[20150523114036]] 『Callステートメントについて』(ぴょん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Callステートメントについて』(ぴょん)

質問です。

Callした後の文の中でもう一度Callすることは可能なのでしょうか?
一部抜粋なのですが、これだとCallで飛んだ先で「同じ適用範囲内で宣言が重複しています」とでます。
おそらく変数をすべて違うものにすればいけるとは思うのですが、ただでさえ多い変数をこれ以上増やしたくないので、もしいい案があれば教えて頂けないでしょうか?

ちなみに変数iはFor文のカウントで使用しており、他は数字やら文字列が入っています。
LoopIfIfの後も何度かCallでサブに飛ばしております。

If v = 3501 And v = a Then

  Call LoopIf(i, m, c, d, e, i, w, x, y, z, sh1, sh2)

Sub LoopIf(i, m, c, d, e, i, w, x, y, z As Variant, sh1, sh2 As Worksheet)

  If c = "" Then
   sh2.Range("C" & m & "") = sh1.Range("E" & i & "")
   c = x
   d = ""
   Call LoopIfIf(d, y, e, m, i, e, z, w, sh1, sh2)

  ElseIf c <> "" And c <> x Then
   m = m + 1
   sh2.Range("C" & m & "") = sh1.Range("E" & i & "")
   c = x
   d = ""
   Call LoopIfIf(d, y, e, m, i, e, z, w, sh1, sh2)

  ElseIf c = x Then
   Call LoopIfIf(d, y, e, m, i, e, z, w, sh1, sh2)

  End If

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 >Sub LoopIf(i, m, c, d, e, i, w, x, y, z As Variant, sh1, sh2 As Worksheet) 

 i が2つあります。
 また、sh1 は As Variant が省略されたものとみなされます。
(cai) 2015/05/23(土) 12:18

 >>Callした後の文の中でもう一度Callすることは可能なのでしょうか? 

 いわゆる再帰処理というもので、可能かどうかといえば可能です。
 「再帰処理」あるいは「再帰呼出し」といった語句で検索すると参考ページがでてきますので
 目を通されたらよろしいかと思いますが、この仕組みをしっかりと理解したうえで使う必要があります。
 とんでもない結果になることも多いですし、無限ループに陥ることもあります。

 提示のコードがOKかどうかは、要件がわからないので何とも言えません。
 要件を言葉で説明いただければ、皆さんからアドバイスがあると思います。もしかしたら、こういう組み方ではなく
 もっとスッキリした組み立て方の提言もあるかもしれません。

 変数の定義については、(cai)さんからコメントがある通りです。

 処理に必要な変数の受け渡しは、それが必要なのでしょうから、必須でしょうね。
 でも、これが多くなると、いずれ保守フェーズで、何が何だかわからなくなってしまうことになりますから
 工夫が望まれますね。ただ、具体的な要件がわからないので、これについてもアドバイスしにくいです。

 せめて、変数が何を指しているのか、目で見てわかりやすいネーミングにしておくことは考えられたらいいのでは?

 m とか d とか、そういう名前だと、これ何? と、わかりにくくなりますね。

 ところで、アップされたプロシジャ名は LoopIf ですけど、この中で呼び出しているのが LoopIfIf。
 別のプロシジャですよね?

(β) 2015/05/23(土) 12:36


本当ですね・・・そんなしょうもないことだったとは申し訳ないです

caiさんありがとうございます

βさん

LoopIfIfは別のプロシジャです。

要件となると少し説明しにくいのですが、400行あたりの元のデータから
5つの条件分け
(ここでv,w,x,y,zの5つの条件をそのデータから引っ張ってきてます)
を行い、すべて同じならその行に同じ条件のものの合計
(これは変数をとってないですが、上の5つの条件とは別のものです)
を出し、一つでも元のデータの前の行と異なれば次の行に移って、その合計をまた新しくとってくるものです。
元のデータと合計を出すシートを別に分けていて、mはその合計のシートの行数(どこに書くか)、a〜eは場合分けを行う用にv〜zと対応した変数となっています

そのためにあらかじめ元のデータをフィルタで並び替えたりはしています。
mやらcやらを長くすると横長なマクロになってしまい、個人的には見にくいので一文字にしていました。
(ぴょん) 2015/05/23(土) 13:05


 よくわかりませんが、了解です。
 なにかうまいコード記述があるだろうとは思うのですが、要件がわからないので、お手伝いできませんね。
 がんばってください。

(β) 2015/05/23(土) 14:35


私もたぶんうまいコード記述がある気はしますが、とりあえず問題なく動いたのでよしとします。
説明がうまくできなくて申し訳ないです。
ありがとうございました。
(ぴょん) 2015/05/23(土) 14:39

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.