Excel - VBA - SQL Server - ADO - XML Parsing (Performance Problems) : Before anything, let me state that I'm stuck with the current stack that I'm using and I'm currently not able to transition to something else. Rather than letting me know that I should be using other stuff, I can't... so let's skip that.

**My users are mostly the following:**

 - Excel 16.0, 64 Bit.
 - Windows 7, 10
 - Ram: Min(4 GB) - Max(8 GB)
 - CPU: i5 to i7 (I'm running i7-3770 @ 3.4GHz)

**Basics:**

 - The Excel Application that I've developed for internal company use uses ADO to talk w/ SQLServer. 
 - Currently, the entire query system is built to work with only 1 Recordset being returned at a time (If the only solution is to get multiple Recordsets back and work with those, it will require a good size rewrite to the core of the system)

**The Non-Basics:**
 
- The system is currently able to import 500 MB files into SQLServer in a minute or two by chunking queries into 100k row chunks and that works pretty well.
- When getting data from SQLServer, I have two different styles:
 * Standard 2-D Recordset (extremely performant)
 * A Recordset that contains a single String value of XML (unparsed) with the following std format:  

```
<root>
    <*page*>
        <row>
            <*column*></*column*>
        </row>
    </*page*>
</root>
```

Example output:

```
<root>
    <tab_awesome>
        <row>
            <col1>Value 1</col1>
            <col2>Value 2</col2>
        </row>
    </tab_awesome>
</root>
```
I then take this XML and currently load the String value from the Recordset using MSXML's "Load" method. After loading and doing some validation, I'll transform the XML into this standard Dictionary structure that exports to [N] tabs and whatnot.

```
{
	"page_count": 1,
	"page_names": ["tab_awesome"],
	"pages": {
		"tab_awesome": {
			"page_name": "tab_awesome",
			"row_count": 1,
			"column_count": 2,
			"column_names": ["col1", "col2"]
			"data": [["Value 1", "Value 2"]]
		}
	}
}
```


***The Problem:***

- We have a number of Sprocs that return their results using the String XML... and when parsed contain multiple tabs of +100k rows per tab. Some Sprocs will return +1,000,000 records with +20 fields (all tabs are included in the count).
- My current problem is a Sproc for Amortizing. It's returning a string that's roughly 208 MB in size. 
 * Receiving the data over the network takes a few seconds
 * Parsing of the String to XML using MSXML takes *3m35s* and the bossman wants it to go faster.

My thoughts:

- Possible to use Sax?
- Can I transport an XML Document from SQLServer though ADO so I don't need to Load it from the string form?
- xmllite.dll? (I see Rubberduck uses this. Matt, how's the performance & by chance, have the bindings for VBA?)
- Last resort, I'll rewrite my application's underlying query engine to handle multiple ADO Recordsets to deal with multiple tabs of data. If I do this, how do I get a single Sproc to return multiple Recordsets?

*I'm stuck using API calls to windows and VBA.* 


hmm... one thing that is possible is to return each Tab as another row in the Recordset (still string XML). For each row, create a new process of Excel, parse/load that tab's information, send the XML back to the main process, close those helper instances of Excel... idk...

Thanks for the help.