Vba 将powerpivot数据导出到csv

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

我有一个Excel工作簿,其中包含Excel数据模型中的powerpivot数据。我没有用于将数据导入powerpivot的文件。我的目标是将powerpivot中的数据转换成csv,这样我就可以在其他软件中使用它

我在powerpivot中找不到任何直接导出选项,并且由于数据大于1.1M行,因此无法将其推入Excel

我发现这个VBA似乎适用于较小的文件,但对于较大的文件,我会出现超时错误

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.关闭
端接头