Matt
Matt

Reputation: 15061

Excel VBA print results of immediate window in a cell(s)

I have a macro that times how long each query takes to run and output the time to the immediate window.

I there a way to set it to output to cells?

Macro:

Sub TimeQueries()
    Dim oSh As Worksheet
    Dim oCn As WorkbookConnection
    Dim dTime As Double
    For Each oCn In ThisWorkbook.Connections
        dTime = Timer
        oCn.Ranges(1).ListObject.QueryTable.Refresh False
        Debug.Print Timer - dTime, oCn.Name, oCn.Ranges(1).Address(external:=True)
    Next
End Sub

Immediate Window Output:

 6.609375     Query1        [YEtest.xlsm]Query1!$A$1:$S$3006
 15.12109375  Query2        [YEtest.xlsm]Query2!$A$1:$S$3006
 21.0703125   Query3        [YEtest.xlsm]Query3!$A$1:$S$3006
 0.125        Query4        [YEtest.xlsm]Query4!$A$1:$B$2

Tab name I want it output to: Control

Upvotes: 4

Views: 3073

Answers (3)

Robin Mackenzie
Robin Mackenzie

Reputation: 19289

Just set oSh to a worksheet reference and use the Cells collection to output what you want:

Sub TimeQueries()
    Dim oSh As Worksheet
    Dim oCn As WorkbookConnection
    Dim dTime As Double
    Dim lngCounter As Long

    'set a worksheet reference - e.g. Sheet1
    Set oSh = ThisWorkbook.Worksheets("Control")

    'initialise counter
    lngCounter = 1
    For Each oCn In ThisWorkbook.Connections
        dTime = Timer
        oCn.Ranges(1).ListObject.QueryTable.Refresh False

        'set output to cells on the worksheet
        oSh.Cells(lngCounter, 1).Value = Timer - dTime
        oSh.Cells(lngCounter, 2).Value = oCn.Name
        oSh.Cells(lngCounter, 3).Value = oCn.Ranges(1).Address(external:=True)
        lngCounter = lngCounter + 1

        'Debug.Print Timer - dTime, oCn.Name, oCn.Ranges(1).Address(external:=True)
    Next
End Sub

Upvotes: 2

CallumDA
CallumDA

Reputation: 12113

This should work:

Sub TimeQueries()
    Dim oSh As Worksheet
    Dim oCn As WorkbookConnection
    Dim dTime As Double

    'define first output range
    Dim rng as Range
    Set rng = ThisWorkbook.Worksheets("Control").Range("A1:C1") 'change as necessary

    For Each oCn In ThisWorkbook.Connections
        dTime = Timer
        oCn.Ranges(1).ListObject.QueryTable.Refresh False

        'output to defined range and then redefine rng to the row below
        rng.Value = Array(Timer - dTime, oCn.Name, oCn.Ranges(1).Address (external:=True))
        Set rng = rng.Offset(1,0)
    Next
End Sub

Upvotes: 1

CLR
CLR

Reputation: 12279

Sub TimeQueries()
    Dim oSh As Worksheet
    Dim oCn As WorkbookConnection
    Dim dTime As Double
    Dim rw As Long

    rw = 1
    For Each oCn In ThisWorkbook.Connections
        rw = rw + 1
        dTime = Timer
        oCn.Ranges(1).ListObject.QueryTable.Refresh False
        With Sheets("Control")
            .Cells(rw, 1) = Timer - dTime
            .Cells(rw, 2) = oCn.Name
            .Cells(rw, 3) = oCn.Ranges(1).Address(external:=True)
        End With
    Next
End Sub

Upvotes: 2

Related Questions