Vba 将powerpivot数据导出到csv
我有一个Excel工作簿,其中包含Excel数据模型中的powerpivot数据。我没有用于将数据导入powerpivot的文件。我的目标是将powerpivot中的数据转换成csv,这样我就可以在其他软件中使用它 我在powerpivot中找不到任何直接导出选项,并且由于数据大于1.1M行,因此无法将其推入Excel 我发现这个VBA似乎适用于较小的文件,但对于较大的文件,我会出现超时错误Vba 将powerpivot数据导出到csv,vba,export-to-csv,powerpivot,Vba,Export To Csv,Powerpivot,我有一个Excel工作簿,其中包含Excel数据模型中的powerpivot数据。我没有用于将数据导入powerpivot的文件。我的目标是将powerpivot中的数据转换成csv,这样我就可以在其他软件中使用它 我在powerpivot中找不到任何直接导出选项,并且由于数据大于1.1M行,因此无法将其推入Excel 我发现这个VBA似乎适用于较小的文件,但对于较大的文件,我会出现超时错误 Option Explicit Public Sub ExportToCsv() Dim w
Option Explicit
Public Sub ExportToCsv()
Dim wbTarget As Workbook
Dim ws As Worksheet
Dim rs As Object
Dim sQuery As String
'Suppress alerts and screen updates
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
'Bind to active workbook
Set wbTarget = ActiveWorkbook
Err.Clear
On Error GoTo ErrHandler
'Make sure the model is loaded
wbTarget.Model.Initialize
'Send query to the model
sQuery = "EVALUATE 'combine 2010 - Q2 2015'"
Set rs = CreateObject("ADODB.Recordset")
rs.Open sQuery, wbTarget.Model.DataModelConnection.ModelConnection.ADOConnection
Dim CSVData As String
CSVData = RecordsetToCSV(rs, True)
'Write to file
Open "D:\tempMyFileName.csv" For Binary Access Write As #1
Put #1, , CSVData
Close #1
rs.Close
Set rs = Nothing
ExitPoint:
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
Set rs = Nothing
Exit Sub
ErrHandler:
MsgBox "An error occured - " & Err.Description, vbOKOnly
Resume ExitPoint
End Sub
Public Function RecordsetToCSV(rsData As ADODB.Recordset, _
Optional ShowColumnNames As Boolean = True, _
Optional NULLStr As String = "") As String
'Function returns a string to be saved as .CSV file
'Option: save column titles
Dim K As Long, RetStr As String
If ShowColumnNames Then
For K = 0 To rsData.Fields.Count - 1
RetStr = RetStr & ",""" & rsData.Fields(K).Name & """"
Next K
RetStr = Mid(RetStr, 2) & vbNewLine
End If
RetStr = RetStr & """" & rsData.GetString(adClipString, -1, """,""", """" & vbNewLine & """", NULLStr)
RetStr = Left(RetStr, Len(RetStr) - 3)
RecordsetToCSV = RetStr
End Function
通过一次执行1k行并使用
FileSystemObject
,这似乎可以在没有导出文件大小限制的情况下工作。您需要添加Microsoft ActiveX数据对象库和Microsoft脚本运行时作为参考
Option Explicit
Public FSO As New FileSystemObject
Public Sub ExportToCsv()
Dim wbTarget As Workbook
Dim ws As Worksheet
Dim rs As Object
Dim sQuery As String
'Suppress alerts and screen updates
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
'Bind to active workbook
Set wbTarget = ActiveWorkbook
Err.Clear
On Error GoTo ErrHandler
'Make sure the model is loaded
wbTarget.Model.Initialize
'Send query to the model
sQuery = "EVALUATE <Query>"
Set rs = CreateObject("ADODB.Recordset")
rs.Open sQuery, wbTarget.Model.DataModelConnection.ModelConnection.ADOConnection
Dim CSVData As String
Call WriteRecordsetToCSV(rs, "<ExportPath>", True)
rs.Close
Set rs = Nothing
ExitPoint:
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
Set rs = Nothing
Exit Sub
ErrHandler:
MsgBox "An error occured - " & Err.Description, vbOKOnly
Resume ExitPoint
End Sub
Public Sub WriteRecordsetToCSV(rsData As ADODB.Recordset, _
FileName As String, _
Optional ShowColumnNames As Boolean = True, _
Optional NULLStr As String = "")
'Function returns a string to be saved as .CSV file
'Option: save column titles
Dim TxtStr As TextStream
Dim K As Long, CSVData As String
'Open file
Set TxtStr = FSO.CreateTextFile(FileName, True, True)
If ShowColumnNames Then
For K = 0 To rsData.Fields.Count - 1
CSVData = CSVData & ",""" & rsData.Fields(K).Name & """"
Next K
CSVData = Mid(CSVData, 2) & vbNewLine
TxtStr.Write CSVData
End If
Do While rsData.EOF = False
CSVData = """" & rsData.GetString(adClipString, 1000, """,""", """" & vbNewLine & """", NULLStr)
CSVData = Left(CSVData, Len(CSVData) - IIf(rsData.EOF, 3, 2))
TxtStr.Write CSVData
Loop
TxtStr.Close
End Sub
选项显式
作为新文件系统对象的公共FSO
公共子出口目录
将目标设置为工作簿
将ws设置为工作表
将遥感器作为对象
像细绳一样模糊
'抑制警报和屏幕更新
应用
.ScreenUpdate=False
.DisplayAlerts=False
以
'绑定到活动工作簿
设置wbTarget=ActiveWorkbook
呃,明白了
关于错误转到错误处理程序
'确保已加载模型
wbTarget.Model.Initialize
'将查询发送到模型
squry=“评估”
Set rs=CreateObject(“ADODB.Recordset”)
rs.打开sQuery,wbTarget.Model.DataModelConnection.ModelConnection.ADOConnection
将CSVData设置为字符串
调用WriteRecordsetToCSV(rs,“,True)
rs.Close
设置rs=无
出口点:
应用
.ScreenUpdate=True
.DisplayAlerts=True
以
设置rs=无
出口接头
错误处理程序:
MsgBox“发生错误-”&错误说明,仅vbOKOnly
恢复退出点
端接头
公共子写器RecordSetToCSV(rsData作为ADODB.Recordset_
文件名为字符串_
可选的ShowColumnNames为Boolean=True_
可选NULLStr作为字符串=”)
'函数返回要另存为.CSV文件的字符串
'选项:保存列标题
Dim TxtStr作为TextStream
Dim K为长,CSVData为字符串
'打开文件
设置TxtStr=FSO.CreateTextFile(文件名,True,True)
如果你想知道你的名字
对于K=0到rsData.Fields.Count-1
CSVData=CSVData&“,”&rsData.Fields(K).Name&“
下一个K
CSVData=Mid(CSVData,2)和vbNewLine
TxtStr.Write CSVData
如果结束
当rsData.EOF=False时执行
CSVData=“”&rsData.GetString(adClipString,1000,“”,“”,“”,“”,“”&vbNewLine&“”,NULLStr)
CSVData=Left(CSVData,Len(CSVData)-IIf(rsData.EOF,3,2))
TxtStr.Write CSVData
环
TxtStr.关闭
端接头