作者:明卫国 | 来源:互联网 | 2023-05-24 18:38
在取消透视过程完成之前,是否有机会分割文件?我试图做相反的事情,即拆分文件然后再取消透视它,但是由于我必须处理20多个文件并且我无法编写运行正常的宏,因此这需要太多时间做这份工作。
我必须实现它,因为我必须将文件加载到其中没有不可透视功能的另一个软件中,而且我无法直接访问它们的数据库来运行任何查询。
有一种使用VBA的解决方案。使用这种方法,您需要:
- 将Power Query表加载到Power Pivot Workbook数据模型中
- 使用VBA从工作簿数据模型中获取数据
- 将记录写入CSV文件
下面是逐步操作方法。
为了进行验证,我使用下面的代码在Power Query中创建了一个300万行的虚拟表,将其命名为“ MyData”。
// MyData: A table of 3 million rows
let RowCount = 3000000
in Table.FirstN(
Table.FromColumns({
List.Generate(() => 1,each true,each _ + 1),List.Generate(() => Number.Random() * 1000,each Number.Random() * 1000)
},type table [ID = Int64.Type,RandomNumber = number]),RowCount
)
通过选择关闭并加载到,然后选择仅创建连接并选中将此数据添加到数据模型中,将该表加载到工作簿数据模型中。
然后,使用下面的VBA代码,我能够连接到数据模型,获取记录并将其转储为CSV文件。
Const OutFile As String = "C:/path/to/MyData.csv"
Dim Wb As Workbook
Set Wb = Application.ActiveWorkbook
Wb.Model.Initialize
'Connection to the Data Model
Dim Conn As Object 'ADODB.Connection
Set COnn= Wb.Model.DataModelConnection.ModelConnection.ADOConnection
Dim Recordset As Object 'ADODB.Recordset
Set Recordset = CreateObject("ADODB.Recordset")
Dim Query As String
Query = "EVALUATE MyData" 'DAX query to return the entire table
Recordset.Open Query,Conn
Dim FileNum: FileNum = FreeFile()
Open OutFile For Output As #FileNum
Do While Not Recordset.EOF
Write #FileNum,Recordset("MyData[ID]"),Recordset("MyData[RandomNumber]")
Recordset.MoveNext
Loop
Close #FileNum