如何在Excel VBA中进行编码以实现以下目的?

时间:2014-07-04 20:58:43

标签: excel-vba vba excel

我手里有一张包含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的编码建议也会有所帮助。

感谢。

1 个答案:

答案 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