首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Excel中为下列目的编写代码?

如何在Excel中为下列目的编写代码?
EN

Stack Overflow用户
提问于 2014-07-04 20:58:43
回答 1查看 461关注 0票数 0

我手里拿着一本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的编码建议都会有帮助。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-04 21:32:02

这只是一个大纲(我希望警察不要开枪)。你能从这开始吗?

代码语言:javascript
复制
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分做任何事。)我做了很多假设。您不需要将日期转换为整数来进行比较。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24580665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档