Using Parameters With Web Queries
This article has been posted on the Microsoft Excel team blog on MSDN too.
Introduction
Excel provides a very useful option to gather data from websites, called web queries. These have been introduced with Excel 97 and have been further enhanced in the versions released after Excel 97. This article shows how you can setup a web query so that you can make the worksheet dynamically update based on values in so called parameter cells.
Setting up the web query
Setting up a web query is as simple as clicking the Data tab and then clicking the "From Web" button on the Get External Data tab:

For Excel 2003 and earlier you need Data, Get External data, New Web Query.

You’ll get this screen:

Enter www.bing.com and click the Go Button.
In the search box that follows, enter the word Question and hit enter. The screen refreshes and a new url appears in the address box:
http://www.bing.com/search?q=Question&form=QBLH&filt=all
Don’t do anything yet, first click the "Options" button and set the Web Query to return full html results (if so desired):
If you want these results in your sheet, just hit the import button now. However, if you want an interactive result in your sheet, enabling you to enter new search criteria in a cell, modify the url so it looks like this:
http://www.bing.com/search?q=["Question"]&form=QBLH&filt=all
You have now made part of the url work as a parameter, by replacing that part of the url with some text between quotes and square brackets (this will only work when using the URL would open a normal page in a web browser). The string you entered will be used as both the name of the parameter and the prompt. Excel will interpret the part between the square brackets as a parameter and prompt you for a value once you click the Import button or when you refresh the query table. Now we’re ready to click "Import". If the page takes time to load, you’ll see a progress screen:

Next Excel asks where to put the results; put them in cell A3 so we have room above the table:

Excel detects we have a parameter and now asks what value you want. As you can see you can select a cell for the parameter, lets use cell A1.
The fun thing is, that you can either fill in a value or you can select a cell as an input for the parameter:

By checking the two checkboxes shown above, you ensure that Excel will automatically update the query table when you change the content of the cell(s) you selected.
Sometimes, inserting the parameter part in the url fails. In such cases, try modifying the routine called Demo2 as shown below so it has the URL you need and the parameters at the proper positions. Make sure you have the proper cell addresses in place as well. When done, run the routine. You should now be able to use the dynamic web query.
Working With Web Query Parameters In VBA
Excel VBA offers the programmer access to web query parameters through the Parameters collection of Parameter objects.
Unlike "normal" database queries, it is not possible to add a parameter to the Parameters collection using the Add method (though even for that type of query, doing so is an awkward process).
Instead one has to add all parameters one needs to the Connection string. Excel will determine the number of parameters from that string once it has been applied to the Connection property and then the Parameters collection becomes available to VBA. In the example below, a web query is added to a worksheet. The message box shows, that there are no parameters:
Sub Demo()
Dim oSh As Worksheet
Set oSh = ActiveSheet
With oSh.QueryTables.Add("URL;http://www.jkp-ads.com", oSh.Range("A3"))
.BackgroundQuery = False
MsgBox .Parameters.Count
End With
End Sub
Result:

If the code shown above is changed to add a parameter in the connection string, things change:
Sub Demo2()
Dim oSh As Worksheet
Set oSh = ActiveSheet
'Make sure we already have a valid value for the parameter
Range("A1").Value="WebQuery"
With oSh.QueryTables.Add("URL;http://www.jkp-ads.com/Articles/[""PageName""].asp", oSh.Range("A3"))
.BackgroundQuery = False
MsgBox .Parameters.Count
With .Parameters(1)
.SetParam xlRange, oSh.Range("A1")
.RefreshOnChange = True
End With
End With
End Sub
Now the messagebox shows:

Note that in the code sample the parameter has been tied to a cell (SetParam method) and that the query is set to update when that cell changes (RefreshOnChange property set to True). The SetParam method is the only way to change the setting of the parameter object from e.g. prompt to Range and to change the range the query parameter uses as its source.
Conclusion
As this article shows, adding a parameter to a web query is relatively easy. The tricky part is the fact that you need to know that parameters can only be added through the connect string (the URL) by using a very specific syntax and that parameters can only be added by changing the connection string.



Comments
Showing last 8 comments of 224 in total (Show All Comments):Comment by: peter (11/6/2012 1:07:15 AM)i have create an automation of this which works fine and downloads the data i require however some time it gets stuck and the only way back is to end excel which means i loose all that has be downloaded in that session is there a way to make it time out and just stop running so ican save the data
Comment by: Jan Karel Pieterse (11/8/2012 2:00:04 PM)Hi Peter,
Depends on your code I guess. Can you post the relevant piece of your macro?
Comment by: kumar (12/10/2012 3:52:19 PM)HI,
I had emp id in my excel sheet and when i enter this emp id in a wesite and click submit.Website retrives daa of that employee like name ,first name,DOB ,Dept No etc.IN my excel i had minimum of 10000 emp id and for every id i need to copy respective details of that emp from website to my excel .Can you help me in doing this.As i am getting daily 10000 emp id.i need to update excel daily with this emp details.it is talking alot of time from to do this.Could you help me in this.Thanks in advance
Comment by: Jan Karel Pieterse (12/10/2012 4:25:31 PM)Hi Kumar,
I can help you with this, but not for free. If you are interested to start a project, please contact me on the email address listed below.
Comment by: Arpan Pitroda (12/29/2012 1:45:42 PM)I've created a web query in excel vba. Now the problem is - I've created a procedure which creates a web query and there is a "Refresh" statement after it which gets data from web. Now the problem is there are other statements after that query and refresh statements. And before the data comes from web the statements after "refresh" start executing. And as the later statements uses web data which they don't found (as the query is running in background), they generate error. So can you suggest anything which can stop the later statements untill the web data comes. (Note: It is necessary to use both web query and later statements in one procedure.) Please mail me back the sollution if possible. Thank you.
Comment by: Jan Karel Pieterse (12/29/2012 4:52:18 PM)Hi Arpan,
The Refresh method has an argument which you need to set to False.
Comment by: roger (4/30/2013 12:07:46 AM)When I create a new excel app in vb, then add a web query, it runs fine, but when I quit the excel app in vb, it closes but does not unload from memory (still shows in task manager). I have set the excel workbook and app to nothing and unloaded the form they were called on with no luck.
If i load a worksheet that already has a web query on it, I can run that web query within vb 6 and when I then quit excel it unloads fine.
Any suggestion as to how to get an excel app that I create in vb and then use to then unload from memory upon quit of the app?
Comment by: Jan Karel Pieterse (5/1/2013 1:43:45 PM)Hi Roger,
This depends on your VB code I'm afraid, hard to tell without knowing what is in your project.
One thing to look for is whether you have set all relevant object variables to nothing before trying to close Excel.
Have a question, comment or suggestion? Then please use this form.
If your question is not directly related to this web page, but rather a more general "How do I do this" Excel question, then I advise you to ask your question here: www.eileenslounge.com.