我正在尝试创建一个宏,以便我将从客户端收到的数据更改为可以导入系统的数据。我收到的数据格式如下:
我如何通过 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(B 列)前面插入一列。将“IF”公式复制到每个单元格,检查 B 列(现在为 C 列)中是否有值,如果有,则将内容设置为“基金 1”。即在单元格 B2 中:
=IF(C2<>"", "基金 1", "")
在下一个基金列前面插入两列。在第一列中,设置一个“IF”公式,检查基金列中是否有值,如果有,则从 A 列复制日期。在两个新列中的第二列中重复上述步骤 1,但插入正确的基金。即在单元格 D2 和 E2 中
=IF(F2<>"", A2, "") || =IF(F2<>"", "基金 2", "") ||
对每个基金栏都执行此操作。
3. 然后,将每个三列块的单元格复制到新工作表中,以便每个连续的块都放置在前一个块的下方。也就是说,选择并复制从 A 列(不是第 1 行)的第一个数据单元格到 C 列的最后一个数据单元格(而不是整个列)的数据,然后将其粘贴到新工作表的左上角单元格中。然后选择并复制从 D 列的第一个单元格到 F 列的最后一个数据单元格的数据,并将其粘贴到之前粘贴的数据正下方的 A 列中。
复制完所有这些块后,您可以按 A 列(日期列)对数据进行排序。这不仅会将所有交易按时间顺序排列,还会将所有空白块组合在一起,让您获得所需格式的数据。
宏版本
如果有是很多基金列,使用宏记录器执行步骤 1 和 2,然后通过循环为每个基金运行执行步骤 2 的代码(通过对您所在的列进行一些数学运算来设置“基金编号”字符串)。
然后执行类似的宏录制工作,复制并粘贴前几个三列块,然后对它们进行排序,再次循环遍历每个基金的复制/粘贴代码