注:用法为个人经验总结,仅供参考,欢迎指正
一 For 循环
1.1 单个循环
假如我想把 excel 的 Sheet2 包含的季度数据求同比增量,也就是这一年的数据减上一年的同季度数据。倘若只针对某一季度,要在某一列单独列第一季度的增量,我们可以使用 Sheet2.Cells():
For i = 1 To 25
Sheet2.Cells(30 + i, 7) = Sheet2.Cells(30 + i * 4, 6) - Sheet2.Cells(30 + (i - 1) * 4, 6)
Next
这样第七列出现的就是第 6 列的数据每隔四个相减一次的同比值,而且仅仅针对想要的那个季度,Sheet 后面紧跟的数字根据 Excel的不同工作簿进行更换。
Next 是一个 For 循环语句一定要写的东西,后面可以空着。
如果我们想把四个季度的同比增量按顺序放在一起,可以使用 Sheet2.Range().value:
For i = 30 To 100
t = i - 4
Sheet2.Range("G" & i).Value = Sheet2.Range("F" & i).Value - Sheet2.Range("F" & t).Value
Next
当然,对于第二种情况,我们完全也可以通过直接另起一单元格,输入 “F30-F26” 然后下拉单元格获得 (๑◕ܫ←๑)b
1.2 嵌套循环
首先把此处的 “通用” 改为 “worksheet”,假设我们要把每个年度的 CPI 变成 4 个相同的 CPI,来平减当年 4 个季度的收入 (此处仅为举例,当然最好还是用当季 CPI 来平减),可输入如下代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i%, t%
For i = 1 To 27
For t = 1 To 4
m = t + 4 * i
n = i + 4
Sheet1.Range("AI" & m).Value = Sheet1.Range("A" & n).Value
Sheet1.Range("AJ" & m).Value = Sheet1.Range("AG" & n).Value
Next t
Next i
End Sub
其中 A 列为时间 (年度),AG 列为 CPI (年度);
输出效果如下:
二、Do 循环
2.1 Do…if…exit do 形式
假设想要把股票日收盘值转变为平均季度值如下,由于已下载的数据日期是 2020/7/1 形式,反正我尝试用了 month 函数但无法运行代码,于是使用 mid() 函数识别字符串,输出中间字符 (H列)、季度归属 (I列) 以及平均季度值 (M列) 如下:
我没有 find 函数,也不会调用,所以就用了一个 DO 循环,比较前后季度归属是否相同,相同的话就计入总是,不同的话就终止这个循环。然后利用
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For i = 2 To 6732
Cells(i, 8) = Mid(Cells(i, 1), 6, 2)
If Mid(Cells(i, 1), 6, 2) = "1/" Or Mid(Cells(i, 1), 6, 2) = "2/" Or Mid(Cells(i, 1), 6, 2) = "3/" Then
Cells(i, 9) = "一季度"
End If
If Mid(Cells(i, 1), 6, 2) = "4/" Or Mid(Cells(i, 1), 6, 2) = "5/" Or Mid(Cells(i, 1), 6, 2) = "6/" Then
Cells(i, 9) = "二季度"
End If
If Mid(Cells(i, 1), 6, 2) = "7/" Or Mid(Cells(i, 1), 6, 2) = "8/" Or Mid(Cells(i, 1), 6, 2) = "9/" Then
Cells(i, 9) = "三季度"
End If
If Mid(Cells(i, 1), 6, 2) = 10 Or Mid(Cells(i, 1), 6, 2) = 11 Or Mid(Cells(i, 1), 6, 2) = 12 Then
Cells(i, 9) = "四季度"
End If
Next i
t = 3
j = 2
m = t
m2 = m - 1
Dim k
For k = 1 To 111
n = 0
Sum = 0
Do
If Cells(m, 9) <> Cells(m2, 9) Then
Sum = Sum + Cells(t - 1, 4)
t = m + 1
Cells(j, 13) = Sum / (n + 1)
j = j + 1
Sum = 0
Exit Do
End If
Sum = Sum + Cells(m, 4)
m = m + 1
m2 = m - 1
n = n + 1
Loop
m = m + 1
m2 = m - 1
Next k
End Sub