我手里有一张包含4张的Excel工作簿。每张工作表都包含库存的每日数据。每个工作表包含3列:第一列列出"日期":1/6/04 - 6/20/14。第二列是每天记录的该股票的每日回报。第3列是该股票的每日成交量。
我想将四张纸中的数据编译成一张包含9列的纸张:第一列是日期。第2和第3列包含返回&第一批库存量;第4和第5列有返回&第二批股票的数量;第3和第7的第6和第7以及第8和第8最后一只股票的第9名。换句话说,四个股票的数据将在同一张纸上列出"日期"。
一个问题:第一只股票有2692个交易日记录,而第二只股票只有2638个交易日。第3和第4只股票均录得2633天。例如,在2009年5月13日,只有第一和第四只股票被交易(有数据可用),但第二和第三只股票没有数据,因此5/13/2009不包含在第二只股票中和第三张原始数据文件。但我希望这个日期包含在我的最终(编译)数据表中,因为在这一天,至少有一个库存可用。
最后,我希望我的最后一张表能够显示任何股票交易的所有日期。对于所有缺失的数据(或缺失的点),我希望细胞充满NaN。
如何在excel VBA / Macro中实现此目的?我也使用R所以任何关于这个问题的R的编码建议也会有所帮助。
感谢。
答案 0 :(得分:0)
这只是一个大纲(我希望SO警察不要射击我)。 你可以开始这个吗?
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 Sub