2

このプログラムは数値の表を作成し、それを行ごとに合計しようとします。IsBlank()一番上のセルが空白かどうかをテストするために使用しています。空白の場合はループを終了する必要がありますが、そうでない場合はループを続行する必要があります。ただし、ループを初めて通過した後も終了し続けます。何故ですか?

私はそれが本当に明白だと感じています。

編集:「カウンター」全体がそこにあることに注意する必要があります。これが機能した場合、それをいじり始めるつもりだったからです。そしてそれはうまくいかなかったので、私はここにいます!

Option Explicit
Dim Counter As Long
Dim i As Long
Dim col As Long
Dim row As Long

Sub SumRange()
    For col = 1 To 8
        For row = 1 To 6
            Cells(row, col) = Rnd
        Next row
    Next col
    Counter = 6
    For i = 1 To 9
        If IsEmpty(Cells(1, i)) = False Then
            Cells(Counter + 1, i) = Application.WorksheetFunction.Sum(Range(Cells(1, i), Cells(Counter, i)))
        Else
            End If
        End
    Next
    MsgBox Cells(4, 5)
End Sub
4

2 に答える 2

5

2 つの問題があります。

  1. Endステートメントは正しくありません。私の記憶が正しければ、プログラムEndを終了することを意味します。何を終了するかを明示的に述べる必要があります ( 、、 ...)。この場合、あなたは.End IfEnd WithEnd If

  2. Exit Forforループから飛び出すために使用する必要があります。あなたの現在のEnd If声明がある場所にいることを意味していると思います。

何をしようとしているのかわかりませんが、条件で while ループを使用して、ループ内からWhile Not IsEmpty(Cells(1, i))カウンターをインクリメントすることも検討できiます。私には、これはジャンプを含む for ループよりも少し良いと感じます。

于 2012-07-25T18:51:43.517 に答える
4

コード (これらのステートメントのみを含む行) からElseandを削除すると、ループが 9 回実行されます。End

ステートメントは、EndVBA に ... コードを終了するように指示します。したがって、単に終了します。

コードをリファクタリングすることを強くお勧めします。より効率的にすることができます。

Sub SumRange()

  Dim values(1 To 6, 1 To 8) As Double
  Dim i As Long, j As Long

  ' populate array
  For i = LBound(values) To UBound(values)
    For j = LBound(values, 2) To UBound(values, 2)
      values(i, j) = Rnd
    Next j
  Next i

  ' blast array onto worksheet in one go
  Range("A1").Resize(UBound(values), UBound(values, 2)).value = values

  ' add sum formulas in one go
  Range("A1").Resize(, UBound(values, 2)).Offset(UBound(values)).FormulaR1C1 = _
  "=SUM(R[-" & UBound(values) & "]C[0]:R[-1]C[0])"

  MsgBox Cells(4, 5)
End Sub
于 2012-07-25T18:57:39.013 に答える