Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8215 / 13644 ツリー ←次へ | 前へ→

【33900】ループが途中で終わる。 k 06/1/23(月) 16:16 質問[未読]
【33902】Re:ループが途中で終わる。 やっちん 06/1/23(月) 16:22 発言[未読]
【33916】Re:ループが途中で終わる。 k 06/1/23(月) 17:39 質問[未読]
【33929】Re:ループが途中で終わる。 やっちん 06/1/23(月) 21:15 回答[未読]
【33941】Re:ループが途中で終わる。 k 06/1/24(火) 8:19 質問[未読]
【33943】Re:ループが途中で終わる。 やっちん 06/1/24(火) 8:36 回答[未読]
【34583】Re:ループが途中で終わる。 k 06/2/7(火) 16:18 お礼[未読]

【33900】ループが途中で終わる。
質問  k  - 06/1/23(月) 16:16 -

引用なし
パスワード
   For...Nextステートメントが途中で終わってしまいます。
どんなことが原因で考えられますか?
For...Nextの間には、If...Then...Elseステートメントが入っています。

【33902】Re:ループが途中で終わる。
発言  やっちん  - 06/1/23(月) 16:22 -

引用なし
パスワード
   ▼k さん:
>For...Nextステートメントが途中で終わってしまいます。
>どんなことが原因で考えられますか?
>For...Nextの間には、If...Then...Elseステートメントが入っています。
こんにちは。
なぜ途中だとわかるのでしょうか?
コードを載せてもらえませんか?

【33916】Re:ループが途中で終わる。
質問  k  - 06/1/23(月) 17:39 -

引用なし
パスワード
   やっちんさん、コードは以下のとおりです。

Fund.xlsのDiscrepシートのA列とC列に証券名が入っています。
他のブック(Jul 2005.xlsとAug 2005xls)の複数あるシートから、対応する証券コードを探してきて、Q列とR列に証券コードを表示させるのが目的です。
Jul 2005.xlsとAug 2005.xlsのフォーマットはすべて、「A列に証券名、C列に証券コード」で統一されています。


Dim j As Integer
Dim r1(9) As Long, r2(9) As Long
Dim SheetName As Variant, ArrayCounter As Integer
SheetName = Array("CASH", "FI", "EQ")
r1(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "A").End(xlUp).Row
r2(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "C").End(xlUp).Row

For j = 7 To r1(9)
 
For k = j - 1 To j
Asset1 = Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("A" & k).Value
Asset2 = Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("C" & k).Value
  
For ArrayCounter = 1 To UBound(SheetName)
r1(ArrayCounter) = Cells(Workbooks(“Jul 2005.xls”).Worksheets(SheetName(ArrayCounter)).Rows.Count, "A").End(xlUp).Row
If Asset1 = "" Then
          Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("Q" & k).Value = ""
Exit For
ElseIf Not Workbooks(“Jul 2005.xls”).Worksheets(SheetName(ArrayCounter)).Range("A3:A" & r1(ArrayCounter)).Find(Asset1) Is Nothing Then
ID1 = Workbooks(“Jul 2005.xls”).Worksheets(SheetName(ArrayCounter)).Range("A3:A" & r1(ArrayCounter)).Find(Asset1).Offset(, 2).Value
Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("Q" & k).Value = ID1
Exit For
End If
Next ArrayCounter

For ArrayCounter = 1 To UBound(SheetName)
r2(ArrayCounter) = Cells(Workbooks(“Aug 2005.xls”).Worksheets(SheetName(ArrayCounter)).Rows.Count, "A").End(xlUp).Row
If Asset2 = "" Then
Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("R" & k).Value = ""
Exit For
ElseIf Not Workbooks(“Aug 2005.xls”).Worksheets(SheetName(ArrayCounter)).Range("A3:A" & r2(ArrayCounter)).Find(Asset2) Is Nothing Then
ID2 = Workbooks(“Aug 2005.xls”).Worksheets(SheetName(ArrayCounter)).Range("A3:A" & r2(ArrayCounter)).Find(Asset2).Offset(, 2).Value
Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Range("R" & k).Value = ID2
Exit For
End If
Next ArrayCounter
Next k

If Not IsError(Cells(j, "Q")) And Not IsError(Cells(j, "R")) Then
If Cells(j, "Q").Value = Cells(j, "R").Value Then
If Cells(j, "B").Value >= 0 And Cells(j, "D") >= 0 Then
ElseIf Cells(j, "B").Value < 0 And Cells(j, "D") < 0 Then
Else
Range(Cells(j, "A"), Cells(j, "B")).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
End If
ElseIf Cells(j, "A").Value = "Equity Total" Then
    
EQ2 = Application.Match("Equity Total", Range("C1:C3000"), 0)

If j < EQ2 Then
Range(Cells(j, "A"), Cells(EQ2 - 1, "B")).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
ElseIf j > EQ2 Then
Range(Cells(EQ2, "C"), Cells(j - 1, "D")).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
End If
End If


End If

r1(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "A").End(xlUp).Row
r2(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "C").End(xlUp).Row
If r1(9) < r2(9) Then
  r1(9) = r2(9)
End If
Next j

デバッグすると、jが95、r1(9) = r2(9)=120の時にループから抜けてしまいます。

【33929】Re:ループが途中で終わる。
回答  やっちん  - 06/1/23(月) 21:15 -

引用なし
パスワード
   ▼k さん:

>For j = 7 To r1(9)
>r1(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "A").End(xlUp).Row
>r2(9) = Cells(Workbooks(“Fund.xls”) .Worksheets(“Discrep”).Rows.Count, "C").End(xlUp).Row
>If r1(9) < r2(9) Then
>  r1(9) = r2(9)
>End If
>Next j

For j = 7 To r1(9)の最終値のr1(9)をそのループの中で変更していますが
このループに初めて来たときのr1(9)の値までしか行われません。
例えば
k=10
For j=7 To k
  k=20
Next j
このループはjが10までしか行われません。

jが95だったということはループに入る前のr1(9)の値は94ではないでしょうか?
一番外のループの仕方を考え直す必要がありますね。


【33941】Re:ループが途中で終わる。
質問  k  - 06/1/24(火) 8:19 -

引用なし
パスワード
   やっちんさん
>jが95だったということはループに入る前のr1(9)の値は94ではないでしょうか?
おおっ、言われてみれば!

>一番外のループの仕方を考え直す必要がありますね。
ループの中でA列、C列にセルを挿入する作業を行っているので、繰り返したい回数が作業を行うことによって変化するのです。
こういう場合、どういうコードを書いたらよいのでしょうか。

【33943】Re:ループが途中で終わる。
回答  やっちん  - 06/1/24(火) 8:36 -

引用なし
パスワード
   ▼k さん:
>ループの中でA列、C列にセルを挿入する作業を行っているので、繰り返したい回数が作業を行うことによって変化するのです。
>こういう場合、どういうコードを書いたらよいのでしょうか。
For Nextは最終値を変更できないのですが
繰り返し処理をするものは他にもありますよ。

  j = 7
  Do While j <= r1(9)
    処理
    j = j + 1
  Loop

Do Whileをご存じなければヘルプで調べてみてください。

参考まで。
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_02.html

【34583】Re:ループが途中で終わる。
お礼  k  - 06/2/7(火) 16:18 -

引用なし
パスワード
   できました。
やっちんさん、ありがとうございました。



8215 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free