Manage Web Queries

Most of the preceding samples get an existing QueryTable, modify its properties, and then call Refresh. I could have used the QueryTables collection’s Add method to create these queries on the fly. However, I would need to remember to delete previously created QueryTables.

Getting rid of unneeded query tables on a worksheet can seem like an unimportant housekeeping chore, but it is very important to avoid having redundant or unneeded queries running in the background. Background queries degrade performance, spontaneously connect to the Internet, and can generate asynchronous errors, as mentioned earlier. This can really confuse users!

How to do it

The following code creates three new query tables on the active worksheet:

   Dim ws As Worksheet, qt As QueryTable, i As Integer
   Set ws = ActiveSheet
   For i = 1 To 3
       Set qt = ws.QueryTables.Add("URL;http://finance.yahoo.com/q/ecn? _ & 
       s=yhoo", [A12])
       qt.Name = "Temp Query"
       qt.WebTables = "22"
       qt.WebSelectionType = xlSpecifiedTables
       qt.WebFormatting = xlWebFormattingNone
       qt.BackgroundQuery = False
       qt.RefreshStyle = xlOverwriteCells
       qt.Refresh
   Next

When this code runs it creates three query tables on the worksheet named Temp_Query, Temp_Query_1, and Temp_Query_2 respectively. There’s no easy way to manage query tables through the Excel user interface, however, if you press Ctrl+G you’ll see the names for the new query tables listed in the Go To dialog box (Figure 4-8).

Excel automatically numbers query tables with those that have the same base name

Figure 4-8. Excel automatically numbers query tables with those that have the same base name

It’s possible to manually delete query tables by going to the named range and selecting Clear All, but that leaves the name in the worksheet, and subsequent names will be indexed _4, _5, etc. The easiest way to clean up mistaken or trial query tables is to write some code to help you remove them. For example, the following procedure lists each query table on a worksheet and lets you remove or keep it:

   Sub RemoveOldQueries(  )
       Dim ws As Worksheet, qt As QueryTable, nm As Name
       Set ws = ActiveSheet
       For Each qt In ws.QueryTables
           If MsgBox("OK to delete " & qt.Name & "?", vbYesNo, _
           "Web Queries") = vbYes Then
               qt.Delete
           End If
       Next
       For Each nm In ws.Names
           If MsgBox("OK to delete " & nm.Name & "?", vbYesNo, _
           "Names") = vbYes Then
               nm.Delete
           End If
       Next
   End Sub

Get Excel 2003 Programming: A Developer's Notebook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.