我手里拿着一本Excel工作簿,里面有4张工作表。每张表都包含股票的每日数据。每张纸包含3栏:第一栏列明日期: 1/6/04 - 6/20/14。第2栏是每天记录的该股的每日收益。第三栏是这只股票的每日成交量。
我想把这四个表中的数据编译成一个只有9列的工作表:第一列是日期。第二和第三栏包含第一批股票的回报和成交量;第四和第五栏有第二只股票的回报和成交量;第六和第七栏为第三只股票;第八和第九栏为最后一只股票。换言之,这四只股票的数据将按“日期”列在同一张表上。
一个问题是:第一只股票有2692个交易日,而第二只股票只有2638个交易日。第三和第四只股票都有2633天的记录。例如,2009年5月13日,只有第1和第4只股票进行了交易(有现有数据),但第2和第3只股票没有数据,因此2009年5月13日没有列入原始数据文件的第2和第3页。但我希望将这个日期包含在我的最后(已编译)数据表中,因为在这一天,至少有一个股票可用。
最后,我希望我的最后一页能有所有股票交易的日期。对于所有丢失的数据(或缺失的点),我希望单元格中填充NaN。
如何在excel VBA/Macro中实现这一点?我也使用R,所以任何关于R的编码建议都会有帮助。
谢谢。
发布于 2014-07-04 21:32:02
这只是一个大纲(我希望警察不要开枪)。你能从这开始吗?
Sub Main()
do ' this is the outer loop
for sheet = 1 to 4
get the lowest unselected date
next sheet
if all sheets are done, then exit sub
for sheet = 1 to 4
get either data or NaN for the selected date
next sheet
loop
End Sub编辑:‘(我不知道什么“搁置”做),这应该是一个很好的模型使用数组。(我愿意为15分做任何事。)我做了很多假设。您不需要将日期转换为整数来进行比较。
Option Explicit
Sub Demo()
Dim iSheet&, aSheets(2) As Worksheet, Outsheet As Worksheet
Dim iRow&(2), iLastRow&(2), outRow&, iCol1&, iCol2&, Date1$, selectedDate$
Set aSheets(1) = ThisWorkbook.Sheets("adam")
Set aSheets(2) = ThisWorkbook.Sheets("bill")
Set Outsheet = ThisWorkbook.Sheets("zack")
iLastRow(1) = 3: iLastRow(2) = 4 ' ending rows
iRow(1) = 1: iRow(2) = 1 ' starting rows
outRow = 1
Do ' this is the outer loop
selectedDate = "12/31/9999" ' starting date (high)
For iSheet = 1 To 2
If iRow(iSheet) <= iLastRow(iSheet) Then
Date1 = aSheets(iSheet).Cells(iRow(iSheet), 1)
If Date1 < selectedDate Then selectedDate = Date1
End If
Next iSheet
If selectedDate = "12/31/9999" Then Exit Sub ' no more
Outsheet.cells(outRow, 1) = selectedDate
For iSheet = 1 To 2
iCol1 = iSheet * 2 ' output columns
iCol2 = iCol1 + 1
If iRow(iSheet) <= iLastRow(iSheet) Then
Date1 = aSheets(iSheet).Cells(iRow(iSheet), 1)
If Date1 = selectedDate Then
Outsheet.Cells(outRow, iCol1) = aSheets(iSheet).Cells(iRow(iSheet), 2)
Outsheet.Cells(outRow, iCol2) = aSheets(iSheet).Cells(iRow(iSheet), 3)
iRow(iSheet) = iRow(iSheet) + 1 ' next row
Else
Outsheet.Cells(outRow, iCol1) = "na"
Outsheet.Cells(outRow, iCol2) = "na"
End If
End If
Next iSheet
outRow = outRow + 1
Loop
End Subhttps://stackoverflow.com/questions/24580665
复制相似问题