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