通过宏 excel 2010 重新格式化数据?

通过宏 excel 2010 重新格式化数据?

我正在尝试创建一个宏,以便我将从客户端收到的数据更改为可以导入系统的数据。我收到的数据格式如下:

我如何通过 VBA 宏做到这一点?因此它应该读取数据,然后以我可以使用的格式创建一个包含数据副本的新工作表。像这样:

答案1

这个宏可以完成您想要的操作。它:

  • 提示基金数量
  • 假设数据表开始于A1
  • 在“Sheet2”上按列A打印C
  • date如果在列中遇到空单元格则退出

注意:如果“Sheet2”不存在,宏将失败,因此请创建它。此外,您还需要在“Sheet2”上添加标题,并调整“Sheet2”中日期和金额的单元格格式

根据需要进行调整

Sub wolfeline()
Dim c As Range
Dim k As Integer
Dim x As Integer
Dim y As Integer
Dim WScurr As Worksheet
Dim WStarg As Worksheet

'Set current and target WS
'//Note: target WS must exist already
Set WScurr = ActiveSheet
Set WStarg = Sheets("Sheet2")

'k=2 so we start on row 2, below the headers you've put, adjust as needed
k = 2

'count the range of dates
y = [counta(A:A)]

'Ask user to input number of funds
x = InputBox("Number of Funds?")
'Feel free to define range("A:A") to your actual range e.g. range("A2:A100")
For Each c In WScurr.Range("A2:A" & y)
If c.Value = "" Then Exit Sub

    ' "to 3" indicates there are 3 funds, adjust as needed
    For i = 1 To x
        If c.Offset(, i) <> "" Then
            'we're printing this in columns K, L and M, adjust as needed
            WStarg.Cells(k, "A") = c
            WStarg.Cells(k, "B") = Cells(1, c.Offset(, i).Column)
            WStarg.Cells(k, "C") = c.Offset(, i)
            k = k + 1
        End If
    Next
Next


End Sub

答案2

打开宏录制器并使用 John Walkenbach 博客中的方法。它会使用屏幕截图中的示例数据生成以下代码:

Sub Unpivot()

'
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
        Array("Sheet1!R1C1:R4C4"), Version:=xlPivotTableVersion15).CreatePivotTable _
        TableDestination:="", TableName:="PivotTable1", DefaultVersion:= _
        xlPivotTableVersion15
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
    ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems( _
        "Count of Value").Position = 1
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = _
        xlHidden
    Range("A4").Select
    Selection.ShowDetail = True
End Sub

根据你的喜好进行调整,或者尝试使用 John Walkenbach 发布的代码这里。它是为早期版本的 Excel 编写的,因此可能看起来与 2010 代码不同。

答案3

如果资金列不是太多,可以手动操作。

  1. 在基金 1(B 列)前面插入一列。将“IF”公式复制到每个单元格,检查 B 列(现在为 C 列)中是否有值,如果有,则将内容设置为“基金 1”。即在单元格 B2 中:

    =IF(C2<>"", "基金 1", "")

  2. 在下一个基金列前面插入两列。在第一列中,设置一个“IF”公式,检查基金列中是否有值,如果有,则从 A 列复制日期。在两个新列中的第二列中重复上述步骤 1,但插入正确的基金。即在单元格 D2 和 E2 中

    =IF(F2<>"", A2, "") || =IF(F2<>"", "基金 2", "") ||

对每个基金栏都执行此操作。

  3. 然后,将每个三列块的单元格复制到新工作表中,以便每个连续的块都放置在前一个块的下方。也就是说,选择并复制从 A 列(不是第 1 行)的第一个数据单元格到 C 列的最后一个数据单元格(而不是整个列)的数据,然后将其粘贴到新工作表的左上角单元格中。然后选择并复制从 D 列的第一个单元格到 F 列的最后一个数据单元格的数据,并将其粘贴到之前粘贴的数据正下方的 A 列中。

复制完所有这些块后,您可以按 A 列(日期列)对数据进行排序。这不仅会将所有交易按时间顺序排列,还会将所有空白块组合在一起,让您获得所需格式的数据。

宏版本

如果有很多基金列,使用宏记录器执行步骤 1 和 2,然后通过循环为每个基金运行执行步骤 2 的代码(通过对您所在的列进行一些数学运算来设置“基金编号”字符串)。

然后执行类似的宏录制工作,复制并粘贴前几个三列块,然后对它们进行排序,再次循环遍历每个基金的复制/粘贴代码

相关内容