在VBA中使用多个do while循环

时间:2014-07-03 13:27:40

标签: excel vba loops excel-vba do-while

我想问你如何使用多个do或者如果有另一种方法如何自动化这种类型的计算。 我有一个名为Closed的股票收盘价的工作表。在另一张名为Returns的表格中,我想计算回报。我不知道有多少行和列将处于Closed状态。 所以我为第一栏写了宏。

 Sub CalcReturns()
' CalcReturns
Dim row As Integer

Worksheets("Returns").Activate
row = 3
Do While Cells(row, 1) <> ""
Cells(row, 2).Value = Worksheets("Close").Cells(row, 2).Value / _
Worksheets("Close").Cells(row - 1, 2).Value - 1

row = row + 1
Loop
End Sub

我的问题是如何添加第二个循环来进行上述计算,只要数据在第一行的列中。 我试着研究循环的使用,但我能够做到一次,而不是多次提前谢谢!

3 个答案:

答案 0 :(得分:0)

你可以嵌套do循环:

Do while firstCondition
    Do while secondCondition

    Loop
Loop

我不确定这是否是您尝试做的,但您可以在代码中添加嵌套循环,如下所示:

Sub CalcReturns()
' CalcReturns
Dim row As Integer

Worksheets("Returns").Activate
row = 3
'first loop
Do While Cells(row, 1) <> ""
    col = 2
    'second loop
    Do While Cells(row,col)<>""
        Cells(row, col).Value = Worksheets("Close").Cells(row, col).Value / _
        Worksheets("Close").Cells(row - 1, col).Value - 1
        col = col+1
    Loop
row = row + 1
Loop
End Sub

答案 1 :(得分:0)

Sub CalcReturns()
  ' CalcReturns
  Dim row As Integer

  Worksheets("Returns").Activate
  row = 3
  do until isempty(cells(row,1))
    col = 2
    do until isempty(cells(row,col))
      Cells(row, col).Value = Worksheets("Close").Cells(row, col).Value / _
      Worksheets("Close").Cells(row - 1, col).Value - 1
      col = col+1
    Loop
    row = row + 1
  Loop
End Sub

答案 2 :(得分:0)

我还没有完全理解为什么需要嵌套循环,但这是一个嵌套的do while循环示例以及替代解决方案。

该代码在假设您的工作表名称为“ Close”且其每日收盘价(A股票和B股票)以及第一栏中的日期的情况下起作用。

Stock A Stock B
01.12.2018  1000    345
02.12.2018  1002    350
03.12.2018  1001    351
04.12.2018  1003    352
05.12.2018  1005    348
06.12.2018  1006    349
07.12.2018  1005    352

再加上一个名为“ Return”的工作表,在该工作表中,您具有用于存储每日收益数据的相同结构。

Stock A Stock B
01.12.2018      
02.12.2018  0.20%   1.45%
03.12.2018  -0.10%  0.29%
04.12.2018  0.20%   0.28%
05.12.2018  0.20%   -1.14%
06.12.2018  0.10%   0.29%
07.12.2018  -0.10%  0.86%

该代码计算股票A的所有日期的每日收益,然后继续计算股票B(以及您可能会添加到工作表中的其他股票)。

以下是使用嵌套的do while循环的解决方案:

Sub CalculateReturns_UsingDoWhile()

    Dim wsC As Worksheet, wsR As Worksheet
    Dim lngRow As Long, lngCol As Long

    Set wsC = Worksheets("Close")
    Set wsR = Worksheets("Return")

    lngCol = 2
    Do While wsC.Cells(2, lngCol) <> vbNullString
        lngRow = 3
        Do While wsC.Cells(lngRow, lngCol).Value <> vbNullString
            wsR.Cells(lngRow, lngCol).Value = wsC.Cells(lngRow, lngCol).Value / wsC.Cells(lngRow - 1, lngCol).Value - 1
            lngRow = lngRow + 1
        Loop

        lngCol = lngCol + 1
    Loop

End Sub

个人而言,我喜欢使用For循环的替代方法,因为创建无限循环的风险要小得多,而且我觉得它更易于阅读。两种代码段的功能相同,因此您可以根据自己的喜好进行选择。 :-)

Sub CalculateReturns_UsingFor()

    Dim wsC As Worksheet, wsR As Worksheet
    Dim lngRow As Long, lngCol As Long

    Set wsC = Worksheets("Close")
    Set wsR = Worksheets("Return")

    For lngCol = 2 To wsC.Range("B1").End(xlToRight).Column
        For lngRow = 3 To wsC.Range("A2").End(xlDown).Row
            If wsC.Cells(lngRow, lngCol).Value <> vbNullString Then
                wsR.Cells(lngRow, lngCol).Value = wsC.Cells(lngRow, lngCol).Value / wsC.Cells(lngRow - 1, lngCol).Value - 1
            End If
        Next
    Next

End Sub