Reputation: 15061
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
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
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
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