Any MDX query within Excel vba?

前端 未结 1 1664
臣服心动
臣服心动 2021-01-07 10:31

is there any way to execute MDX query within Excel VBA?

I thought that it can be done through ADO, similarly as in SQL case (yes, I\'m aware that SQL is different than M

相关标签:
1条回答
  • 2021-01-07 10:58

    We have the following generic function that's called in VBA that based on an input MDX string, writes the data to excel. The spreadsheet does require a reference to ADO and ADOMD

    Public Sub DisplayMDX(ipCell, ipMDX, ipExclHeadings)
    
        Dim sQry As String
        Dim sConnection As String
        Dim rs As ADOMD.Cellset
        Dim sServer, sDB, ts As String
        Dim hyper As Hyperlink
        Dim i, j, k, h, rowStart, colStart, dimCount As Integer
        Dim sURLLink, sCustCaption, sCustLink As String
        Dim db As ADODB.Connection
    
        'Open a new ADO connection
        Set db = New ADODB.Connection
        sConnection = "Provider=MSOLAP; Data Source=DW3; Initial Catalog=FDMDW1; Integrated Security=SSPI"
    
        db.CommandTimeout = 0
        db.Open sConnection
    
        'Open a CellSet to store the results of the query.
        Set rs = New Cellset
    
        'Tidy the query of an erroneous spaces
        sQry = Trim(ipMDX)
    
        'Open the query that was constructed above
        Application.StatusBar = "Getting OLAP Data"
        With rs
            .Open sQry, db
        End With
    
        With ActiveSheet
    
         'Goto cell specified
         Range(ipCell).Select
    
         'Find the starting point
         rowStart = ActiveCell.Row
         colStart = ActiveCell.Column
         For j = 0 To rs.Axes(1).Positions.Count - 1
    
            If Not ipExclHeadings Then
               dimCount = rs.Axes(1).DimensionCount
               For h = 0 To rs.Axes(1).DimensionCount - 1
                    Cells(rowStart + j, colStart + h) = rs.Axes(1).Positions(j).Members(h).Caption
               Next
            End If
    
            For k = 0 To rs.Axes(0).Positions.Count - 1
               If Not (k = 1) Then
    
                  If rs(k, j) <> "" Then
                     Cells(rowStart + j, colStart + dimCount + k).Value = rs(k, j)
                  Else
                     Cells(rowStart + j, colStart + dimCount + k).ClearContents
                  End If
    
               End If
               Application.StatusBar = rs(k, j)
            Next
    
         Next
        End With
    
    rs.Close
    
    Application.StatusBar = "Done"
    
    Exit Sub
    errMsg:
       MsgBox Err.Description, vbOKOnly + vbCritical, "Error #" & Err.Number
    
    End Sub
    
    0 讨论(0)
提交回复
热议问题