Excel VBA質問箱 IV

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

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


475 / 13645 ツリー ←次へ | 前へ→

【80163】VBA Do Loop Untilでエラー まよい人 18/10/2(火) 15:16 質問[未読]
【80164】Re:VBA Do Loop Untilでエラー γ 18/10/2(火) 20:55 発言[未読]
【80169】Re:VBA Do Loop Untilでエラー まよい人 18/10/4(木) 15:54 お礼[未読]
【80171】Re:VBA Do Loop Untilでエラー γ 18/10/4(木) 19:23 発言[未読]
【80173】Re:VBA Do Loop Untilでエラー γ 18/10/6(土) 11:44 発言[未読]
【80175】Re:VBA Do Loop Untilでエラー γ 18/10/6(土) 17:22 発言[未読]

【80163】VBA Do Loop Untilでエラー
質問  まよい人  - 18/10/2(火) 15:16 -

引用なし
パスワード
   Do
Loop Until 判定式
とすると
Loop Until 判定式 で、On Error GoToに飛びます。

一方、Until 判定式 を
Do Until 判定式
Loop
とDoの後に移動すると問題なく実行できます。

Loop Until 判定式 のところでブレークをかけ、
ウォッチ式で判定式の値を確認してみると(意図したとおりの)falseです。

なぜ、Doの後ではOKでLoopの後だとエラーになるのでしょうか?

尚、SubからFunctionをCallしており、Do LoopはFunctionに
On Error GoToはSubにあります。

【80164】Re:VBA Do Loop Untilでエラー
発言  γ  - 18/10/2(火) 20:55 -

引用なし
パスワード
   再現するワンセットのコードを提示してはどうですか?
なにかしらエラーが関係しているのに、
具体性が無いと解決は難しいですよ。

【80169】Re:VBA Do Loop Untilでエラー
お礼  まよい人  - 18/10/4(木) 15:54 -

引用なし
パスワード
   γ 様

ありがとうございます。
仰る通りです。

エラーが生じるコードは

Function 支(ByRef currentRow As Long, ByVal flag As Boolean, ByVal 列 As Byte)
  With ActiveSheet
  Dim myLevel As Byte
  myLevel = Val(.Range("H" & currentRow))
  Do
    Dim I_Flag As Boolean
    I_Flag = CStr(.Range("Q" & currentRow)) = "380"
    If Not I_Flag Then
      If flag Then
        Set ss = Me.Range("E3:E453").Find(Left(.Range("F" & currentRow), 13), LookIn:=xlValues, LookAt:=xlPart)
        If ss Is Nothing Then Set ss = Me.Range("E3:E453").Find(Left(.Range("F" & currentRow), 11) & "X" & Mid(.Range("F" & currentRow), 13, 1))
        I_Flag = ss Is Nothing
        If Not I_Flag Then I_Flag = Me.Cells(ss.Row, 列) = ""

        If Not I_Flag Then
          If Left(.Range("K" & currentRow), 1) <> "ム" Then
            .Range("K" & currentRow) = "ム←" & .Range("K" & currentRow)
            .Range("K" & currentRow).Interior.ColorIndex = 33
          End If
        ElseIf Left(.Range("K" & currentRow), 2) <> "ジ" Then
          .Range("K" & currentRow) = "ジ←" & .Range("K" & currentRow)
          .Range("K" & currentRow).Interior.ColorIndex = 33
        End If
      End If
    ElseIf Left(.Range("K" & currentRow), 2) <> "ジ" Then
      .Range("K" & currentRow) = "ジ←" & .Range("K" & currentRow)
      .Range("K" & currentRow).Interior.ColorIndex = 33
    End If
    currentRow = currentRow + 1

    If myLevel < Val(.Range("H" & currentRow)) Then Call 支(currentRow, I_Flag, 列)
  Loop Until myLevel > Val(.Range("H" & currentRow))
  End With
End Function

です。

【80171】Re:VBA Do Loop Untilでエラー
発言  γ  - 18/10/4(木) 19:23 -

引用なし
パスワード
   スマフォで見ているので詳細わかりませんが
エラー時の関連する変数の値を教えてください。

【80173】Re:VBA Do Loop Untilでエラー
発言  γ  - 18/10/6(土) 11:44 -

引用なし
パスワード
   時間がとれたので内容を見てみました。
下記の例で、エラーとなりますね。
そもそもですが、Loop処理の中で再帰呼び出しは不可避なんでしょうか?
何をしようとされているか説明が無いのでよくわかりませんが。

理由は不明ですが、
記法によってエラーが避けられるならそれに従うのがよろしいかと。

Sub test()
  [H1:H5].Value = Application.Transpose(Array(1, 2, 3, 5, 1)) 'データ設定
  Call 支(1, False, 1)  'エラーとならない
End Sub

Sub test2()
  [H1:H5].Value = Application.Transpose(Array(1, 2, 3, 5, 1)) 'データ設定
  Call 支2(1, False, 1)  '「式が複雑すぎます」というエラーとなる
End Sub

Function 支(ByRef currentRow As Long, ByVal flag As Boolean, ByVal 列 As Byte)
  Dim myLevel As Byte
  Dim I_Flag As Boolean

  With ActiveSheet
    myLevel = Val(.Range("H" & currentRow))
    Do Until myLevel > Val(.Range("H" & currentRow))
      
      ' ここで作業
      
      currentRow = currentRow + 1
      If myLevel < Val(.Range("H" & currentRow)) Then Call 支(currentRow, I_Flag, 列)
    Loop
  End With
End Function

Function 支2(ByRef currentRow As Long, ByVal flag As Boolean, ByVal 列 As Byte)
  Dim myLevel As Byte
  Dim I_Flag As Boolean

  With ActiveSheet
    myLevel = Val(.Range("H" & currentRow))
    Do
      
      ' ここで作業
      
      currentRow = currentRow + 1
      If myLevel < Val(.Range("H" & currentRow)) Then Call 支2(currentRow, I_Flag, 列)
    Loop Until myLevel > Val(.Range("H" & currentRow))
  End With
End Function

【80175】Re:VBA Do Loop Untilでエラー
発言  γ  - 18/10/6(土) 17:22 -

引用なし
パスワード
   内部的な処理の話なので正確なことは不明だが、
再帰処理が関係していると想像。
いわゆる末尾再帰となる書き方(エラーが
でない方の書き方)が推奨されるということでしょう。

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