<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7289528839575681860</id><updated>2012-03-07T06:36:05.588-08:00</updated><category term='JSON serializer'/><category term='vba'/><category term='Deserializer'/><category term='excel'/><category term='cjobject'/><category term='yahoo placemaker'/><category term='google maps'/><category term='cdatset'/><category term='classes'/><category term='objects'/><category term='cdataset'/><category term='bing maps'/><category term='dynamic forms'/><category term='google'/><title type='text'>Excel Ramblings and integration with all the Google web services. http://ramblings.mcpher.com</title><subtitle type='html'>How to free your data from your desktop and make the most of Excel. In addition to many Excel and VBA examples, this blog discusses how to integrate with web services such Google Maps, Earth, Visualization, Books and Docs, how to deal with jSon and data abstraction, and how to link with a whole range of web apis such as Twitter -all directly from Excel and VBA. You'll find downloadable examples, lots of content, and a forum to participate in at the blog's parent site  - ramblings.mcpher.com</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7926988648967291469</id><published>2012-03-05T11:54:00.002-08:00</published><updated>2012-03-05T11:54:29.484-08:00</updated><title type='text'>Using Excel color ramps with google map overlays</title><content type='html'>On the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings site&lt;/a&gt;, I have created a bunch of content covering &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap/lib"&gt;color ramps&lt;/a&gt; and applying them to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap/rampcharts"&gt;charts&lt;/a&gt;, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/tagcloud"&gt;tag clouds&lt;/a&gt; and other things.&lt;br /&gt;&lt;br /&gt;Interestingly, exactly the same thing can be applied to&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mapping/circles"&gt; Google Map overlays&lt;/a&gt;. Combining the material on &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mapmarkers"&gt;adding map markers to google maps straight out of excel&lt;/a&gt;, here's how to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mapping/circles"&gt;create shapes using heatmap&lt;/a&gt;, or other color ramps as an overlay.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ywm2Vut5hVo/T1UXmU4su6I/AAAAAAAAAKc/JYjGxocYUJ0/s1600/818.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-Ywm2Vut5hVo/T1UXmU4su6I/AAAAAAAAAKc/JYjGxocYUJ0/s200/818.png" width="97" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Firstly - create your data describing the circle size, and color to use. The size would be calculated according to some formula that scales each item to be plotted according to some demographic.&lt;br /&gt;&lt;br /&gt;Secondly - create the marker color. We already have all the tools we need to generate html color codes as part of a color ramp. The &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/rgb"&gt;formula for the markerColor&lt;/a&gt; column is simply&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;=rgbToHTMLHex(rampLibraryRGB("heatmap",MIN($F$2:$F$8),MAX($F$2:$F$8),F2))&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&amp;nbsp;Now plotting your &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;data on google maps straight from Excel&lt;/a&gt;, will also generate an appropriately sized and colored circle overlays.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-MC5AKTxLG2A/T1UYuad8DSI/AAAAAAAAAKk/lf-jZIme6FM/s1600/817.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/-MC5AKTxLG2A/T1UYuad8DSI/AAAAAAAAAKk/lf-jZIme6FM/s320/817.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7926988648967291469?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7926988648967291469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/03/using-excel-color-ramps-with-google-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7926988648967291469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7926988648967291469'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/03/using-excel-color-ramps-with-google-map.html' title='Using Excel color ramps with google map overlays'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ywm2Vut5hVo/T1UXmU4su6I/AAAAAAAAAKc/JYjGxocYUJ0/s72-c/818.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-725345124086702298</id><published>2012-03-01T15:48:00.000-08:00</published><updated>2012-03-01T15:48:36.393-08:00</updated><title type='text'>Converting excel.vba projects to google apps script.</title><content type='html'>You are ready to move to the cloud, but what about all those legacy vba apps? Are they really going to influence your decision such that you have to stay where you are?&lt;p&gt;&lt;b&gt;Moving to google docs&lt;/b&gt;&lt;p&gt;As an experiment, I am converting a very &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/recursionlink/roadmap-generation"&gt;complex vba project&lt;/a&gt; to google apps script. As it turns out, it's not so hard, and with a little preparation, it's possible to create a set of libraries that abstracts the whole thing away from the platform, excel or google docs, so that even dual maintenance is feasible, and we will certainly have the tools to make future migrations a breeze.&lt;p&gt;You can follow along with the migration, or even help.&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/gooscript"&gt; See here for the migration of an excel roadmap per project to google apps script.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-725345124086702298?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/725345124086702298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/03/converting-excelvba-projects-to-google.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/725345124086702298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/725345124086702298'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/03/converting-excelvba-projects-to-google.html' title='Converting excel.vba projects to google apps script.'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4022101128861095727</id><published>2012-02-04T10:08:00.000-08:00</published><updated>2012-02-04T10:08:59.777-08:00</updated><title type='text'>Color Ramps and topographic maps in Excel</title><content type='html'>&lt;b&gt;Color Ramps&lt;/b&gt;&lt;br /&gt;In a &lt;a href="http://excelramblings.blogspot.com/2012/01/creating-heat-maps-with-vbaexcel.html"&gt;previous post&lt;/a&gt;, I showed how to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap"&gt;automate the creation of a heatmap in Excel&lt;/a&gt;. &amp;nbsp;It occurred to me that this could be generalized to any color ramp. Here is an &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap/lib"&gt;extensible color ramp library&lt;/a&gt; you can download and incorporate in your VBA/Excel procedures.&lt;br /&gt;&lt;br /&gt;That allows us to plot something like this for some &amp;nbsp;function (x,y)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uNDWICPvMwQ/Ty1yRwlQiMI/AAAAAAAAAKI/gLL7VyRd64I/s1600/811.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-uNDWICPvMwQ/Ty1yRwlQiMI/AAAAAAAAAKI/gLL7VyRd64I/s1600/811.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and here is all that's needed&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub colorRampVisualize()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim dsout As New cDataSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; createSurfaceChart _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dsout.populateData(wholeSheet("crampviz"), , "crampviz", True, , , True, "y/x"), _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "crampChart", xlSurfaceTopView, 200, "heatmaptowhite", False&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Topographic maps&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Taking that a stage further, and automating the production of charts that use this library, you can start to create topographic maps, given a table of co-ordinates against elevations.&lt;br /&gt;&lt;br /&gt;Here is an example, using randomly generated elevations for an imaginary landscape.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ha5lgwo2yX8/Ty1vx-CjLTI/AAAAAAAAAKA/Nf3Hr3Aq-Xw/s1600/814.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ha5lgwo2yX8/Ty1vx-CjLTI/AAAAAAAAAKA/Nf3Hr3Aq-Xw/s1600/814.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and here is code&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub colorRampElevation()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim dsout As New cDataSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; 'redo the random elevations&lt;br /&gt;&amp;nbsp; &amp;nbsp; Application.Calculate&lt;br /&gt;&amp;nbsp; &amp;nbsp; createSurfaceChart _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dsout.populateData(wholeSheet("elevate"), , "elevate", True, , , True, "lat/lon"), _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "top", , 200, "terrainnosea", False, , False&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;End Sub&lt;/blockquote&gt;Take a look on the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap/rampcharts"&gt;ramblings web site to download these libraries&lt;/a&gt; and to see how this is done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4022101128861095727?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4022101128861095727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/02/color-ramps-and-topographic-maps-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4022101128861095727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4022101128861095727'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/02/color-ramps-and-topographic-maps-in.html' title='Color Ramps and topographic maps in Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-uNDWICPvMwQ/Ty1yRwlQiMI/AAAAAAAAAKI/gLL7VyRd64I/s72-c/811.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7445816858733694692</id><published>2012-01-30T10:01:00.000-08:00</published><updated>2012-01-30T10:01:03.546-08:00</updated><title type='text'>using a tagCloud to check your Outlook Mail</title><content type='html'>&lt;b&gt;tagCloud in Outlook&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In a previous example, I showed how to create a &lt;a href="http://excelramblings.blogspot.com/2012/01/create-tag-clouds-from-twitter-in-excel.html"&gt;tagCloud of various Excel data&lt;/a&gt;&amp;nbsp;sources, with a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/tagcloud"&gt;downloadable example on the ramblings web site&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It occurred to me it would be pretty useful if you could select some mails in Outlook and have a quick look at the main messages in the form of a tagCloud.&lt;br /&gt;&lt;br /&gt;First select some mails in outlook, using whatever criteria you want.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mEZdJwlHuxo/TybaEFonraI/AAAAAAAAAJ4/KW6tJ2bkBH4/s1600/804.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mEZdJwlHuxo/TybaEFonraI/AAAAAAAAAJ4/KW6tJ2bkBH4/s1600/804.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&amp;nbsp;then create a tagCloud, to see if it's worth reading them.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Vod8h1YyoS8/TybZ2fEEXuI/AAAAAAAAAJw/Uq4_wyVfR5E/s1600/805.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Vod8h1YyoS8/TybZ2fEEXuI/AAAAAAAAAJw/Uq4_wyVfR5E/s1600/805.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and well &amp;nbsp;.. that's all there is to it. You can get the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/tagoutlook"&gt;code to do this and read how to implement it on the ramblings site.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7445816858733694692?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7445816858733694692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/01/using-tagcloud-to-check-your-outlook.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7445816858733694692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7445816858733694692'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/01/using-tagcloud-to-check-your-outlook.html' title='using a tagCloud to check your Outlook Mail'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mEZdJwlHuxo/TybaEFonraI/AAAAAAAAAJ4/KW6tJ2bkBH4/s72-c/804.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2965078953482993711</id><published>2012-01-26T03:30:00.000-08:00</published><updated>2012-01-26T04:59:58.686-08:00</updated><title type='text'>Create tag Clouds from twitter in Excel</title><content type='html'>&lt;b&gt;The tagCloud class&lt;/b&gt;&lt;br /&gt;Today's post will demonstrate how to generate tagClouds from various sources in Excel. As an example we will use some tweets&amp;nbsp;retrieved&amp;nbsp;by&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/11/rest-library-for-excel.html"&gt;the rest- Excel library&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A 'Mitt Romney' type query generates this tagCloud&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BmRihbSphPI/TyFNcKsIuKI/AAAAAAAAAJI/Y8_F1t2ulVQ/s1600/800.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-BmRihbSphPI/TyFNcKsIuKI/AAAAAAAAAJI/Y8_F1t2ulVQ/s1600/800.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;The VBA code to create this uses classes from the&lt;a href="http://ramblings.mcpher.com/Home/excelquirks"&gt; ramblings site&lt;/a&gt;:&amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/tagcloud"&gt;cTagCloud&lt;/a&gt;&amp;nbsp;, &amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/howtocdataset"&gt;cDataSet.&lt;/a&gt;&amp;nbsp;and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap"&gt;heatMap&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testTag()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim ds As New cDataSet, dr As cDataRow, tg As New cTagCloud&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; tg.init , , 3, " "&lt;br /&gt;&amp;nbsp; &amp;nbsp; With ds.populateData(wholeSheet("tweetsentimentdetails"), , , , , , True)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; For Each dr In .Rows&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tg.collect dr.Cell("text").toString&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next dr&lt;br /&gt;&amp;nbsp; &amp;nbsp; End With&lt;br /&gt;&amp;nbsp; &amp;nbsp; tg.results Sheets("tagout").Range("a1")&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A single Cell&lt;/b&gt;&lt;br /&gt;The example above reports on a &amp;nbsp;complete worksheet column. Here's how to do a single cell, and is in the spirit of many posts &amp;nbsp;such as &lt;a href="http://excelramblings.blogspot.com/2011/11/rest-json-excel-in-one-line-of-code.html"&gt;rest-excel-json-excel in one line of code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Newt Gingrich's wikipedia entry gives this&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jwBM4QXKq4k/TyFNkYffE-I/AAAAAAAAAJQ/ypIlYxF89DU/s1600/801.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-jwBM4QXKq4k/TyFNkYffE-I/AAAAAAAAAJQ/ypIlYxF89DU/s1600/801.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;with this one liner.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testTagSingleCell()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim tg As New cTagCloud&lt;br /&gt;&amp;nbsp; &amp;nbsp; tg.init(, , 5, " ").collect( _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sheets("singleTag").Range("a1").Value _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ).results Sheets("singleTag").Range("b1")&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Multiple tags&lt;/b&gt;&lt;br /&gt;Finally, here's how to consolidate multiple tags from multiple workbooks, this time comparing Obama and Romney sentiment on tax and charity.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0YyApTuBPBw/TyE4ALquvTI/AAAAAAAAAJA/cYp77630QYQ/s1600/803.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-0YyApTuBPBw/TyE4ALquvTI/AAAAAAAAAJA/cYp77630QYQ/s1600/803.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and here is the code,&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testWorkbookTag()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim ds As cDataSet, dr As cDataRow, tg As cTagCloud, drin As cDataRow&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim din As cDataSet&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; Set din = New cDataSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; din.populateData wholeSheet("tagBook"), , , , , , True&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; For Each drin In din.Rows&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set tg = New cTagCloud&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tg.init , , 3, " "&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set ds = New cDataSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; With ds.populateData(wholeSheet(drin.Cell("sheet").toString), _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, , , , , True)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; For Each dr In .Rows&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tg.collect dr.Cell("text").toString&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next dr&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tg.results drin.Cell("tags").where&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End With&lt;br /&gt;&amp;nbsp; &amp;nbsp; Next drin&lt;br /&gt;&lt;br /&gt;End Sub&lt;/blockquote&gt;You can read more about this and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/tagcloud"&gt;download these and other examples at the ramblings site&lt;/a&gt;. Although the examples here are based on tweet data, you can of course use any Excel data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2965078953482993711?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2965078953482993711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/01/create-tag-clouds-from-twitter-in-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2965078953482993711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2965078953482993711'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/01/create-tag-clouds-from-twitter-in-excel.html' title='Create tag Clouds from twitter in Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-BmRihbSphPI/TyFNcKsIuKI/AAAAAAAAAJI/Y8_F1t2ulVQ/s72-c/800.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8108872009771372045</id><published>2012-01-23T02:03:00.000-08:00</published><updated>2012-01-23T02:03:39.041-08:00</updated><title type='text'>How to track sentiment,tweets and stock price directly from Excel</title><content type='html'>&lt;b&gt;Combining multiple rest queries in a single Worksheet&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In previous posts, I covered how to get &lt;a href="http://excelramblings.blogspot.com/2011/12/tweetsentiments-now-in-crest-excel.html"&gt;tweetsentiments into excel&lt;/a&gt;&amp;nbsp;and how to get &lt;a href="http://excelramblings.blogspot.com/2011/12/google-finance-added-to-crest-library.html"&gt;Google Finance data into Excel.&lt;/a&gt;&amp;nbsp;Today we'll look at how to build an application to pull all that together.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Random stocks&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-zri2CpGhYAY/Tx0tamiCr0I/AAAAAAAAAHg/5w4lFL63Ssc/s1600/792.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://3.bp.blogspot.com/-zri2CpGhYAY/Tx0tamiCr0I/AAAAAAAAAHg/5w4lFL63Ssc/s320/792.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Starting with a table of random stocks, we first use the Google Finance Rest library entry to get the latest stock price.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2oeVJGiiP_0/Tx0uEFI367I/AAAAAAAAAHw/54PCiupCpuY/s1600/793.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/-2oeVJGiiP_0/Tx0uEFI367I/AAAAAAAAAHw/54PCiupCpuY/s320/793.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Next we add tweetsentiments, using the ticker as the query.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zIuSGnX9Czk/Tx0vNTnxebI/AAAAAAAAAIQ/6Ckpc0eJVuA/s1600/796.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-zIuSGnX9Czk/Tx0vNTnxebI/AAAAAAAAAIQ/6Ckpc0eJVuA/s320/796.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Next we query topsy to see the volume of tweets about each company's stocks.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xzTC8qc6yQc/Tx0usZ4FnMI/AAAAAAAAAH4/2YLWPww0JgE/s1600/795.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-xzTC8qc6yQc/Tx0usZ4FnMI/AAAAAAAAAH4/2YLWPww0JgE/s320/795.png" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;Finally we schedule this to run every now and again, and build up a history so that each company can be tracked.&lt;br /&gt;&lt;br /&gt;For information on how to implement this in Excel, and to get a downloadable example, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest/combine"&gt;visit the ramblings site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8108872009771372045?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8108872009771372045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/01/how-to-track-sentimenttweets-and-stock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8108872009771372045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8108872009771372045'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/01/how-to-track-sentimenttweets-and-stock.html' title='How to track sentiment,tweets and stock price directly from Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-zri2CpGhYAY/Tx0tamiCr0I/AAAAAAAAAHg/5w4lFL63Ssc/s72-c/792.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-334938000245687224</id><published>2012-01-07T03:42:00.000-08:00</published><updated>2012-01-07T03:44:00.938-08:00</updated><title type='text'>Creating heat maps with VBA/Excel</title><content type='html'>Today's post is about how to create a palette to use for a heatmap, and how to apply it to either an Excel Table of values to be compared, or to create surface chart and apply the palette to the categories. A complete description of how this all works, along with the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap"&gt;downloadable workbook and code can be found on the Excel Ramblings site.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The heatmap palette&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A typical palette for a heatmap would look like this.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AVGCb2P9-1Y/TwgpXrpQUeI/AAAAAAAAAG0/XBIP9DqKuL4/s1600/759.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-AVGCb2P9-1Y/TwgpXrpQUeI/AAAAAAAAAG0/XBIP9DqKuL4/s1600/759.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The tricky part is to calculate an appropriate RGB combination for the color based on the where the value lies between the min and max value of the other values in the table. The&amp;nbsp;algorithm&amp;nbsp;for this is in &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap"&gt;the downloadable example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using the palette on an Excel table&lt;/b&gt;&lt;br /&gt;This example just applies the palette to values in an excel table. Something like this can be done using conditional formatting, but using the heatmap algorithm allows for easy automation in VBA.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DCDXPHaHCAI/TwgqgWjmD6I/AAAAAAAAAG8/MtTxqibBKXQ/s1600/760.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-DCDXPHaHCAI/TwgqgWjmD6I/AAAAAAAAAG8/MtTxqibBKXQ/s1600/760.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Creating a surface chart to illustrate a heatmap.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Excel provides a nice chart that can be used for very effective heatmap presentation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ynwx0ZNJhag/TwgtlQx4xKI/AAAAAAAAAHE/k-i2Cuu0sDw/s1600/761.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Ynwx0ZNJhag/TwgtlQx4xKI/AAAAAAAAAHE/k-i2Cuu0sDw/s1600/761.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;or this variant.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-q7AFuX4KTkQ/TwguTfRk1iI/AAAAAAAAAHM/gTNgEMj-DRA/s1600/765.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-q7AFuX4KTkQ/TwguTfRk1iI/AAAAAAAAAHM/gTNgEMj-DRA/s1600/765.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In each case. I have applied the heatmap template to the chart and automated its creation. As usual on this blog, the objective was to provide a capability to do the whole thing in one line of code, as below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: white; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em; text-align: left;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br class="Apple-interchange-newline" /&gt;Public Sub heatMapExample()&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; Dim dsout As New cDataSet&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; createSurfaceChart _&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dsout.populateData(wholeSheet("matrixout"), , "matrixout", True, , , True, "matrix"), _&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "heatmap"&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div id=""&gt;&lt;code style="color: #006000;"&gt;&lt;span style="font-size: x-small;"&gt;End Sub&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;For more details, and to download the full example please &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/heatmap"&gt;visit the ramblings site&lt;/a&gt;&amp;nbsp;or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;contact me on our forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-334938000245687224?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/334938000245687224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/01/creating-heat-maps-with-vbaexcel.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/334938000245687224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/334938000245687224'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/01/creating-heat-maps-with-vbaexcel.html' title='Creating heat maps with VBA/Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-AVGCb2P9-1Y/TwgpXrpQUeI/AAAAAAAAAG0/XBIP9DqKuL4/s72-c/759.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-397947582207514901</id><published>2012-01-03T05:30:00.000-08:00</published><updated>2012-01-03T05:30:45.189-08:00</updated><title type='text'>Executing SQL from Excel and Data Abstraction</title><content type='html'>&lt;b&gt;Abstracting an Excel data source.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In almost of all of the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;downloadable examples on the ramblings web site&lt;/a&gt;, I use a set of &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/howtocdataset"&gt;data abstraction classes&lt;/a&gt; to separate workbook data from its workbook location, and as a result, these classes now have a fair amount of capability built in such as&amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/excel-json-conversion"&gt;Excel-jSon-Excel conversion&lt;/a&gt;, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/get-data-from-google-docs"&gt;getting data from Google Docs&lt;/a&gt;&amp;nbsp;and many other functions.&lt;br /&gt;&lt;br /&gt;Most of you will already know about how to get data into Excel from an SQL database, whether through ODBC, MS Query, ADODB, the Excel toolbar and many other methods.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Getting data into excel using SQL can be kind of complicated, with all the confusion around connection strings and recordsets and so on, so I thought I could combine the ideas of creating a simple library class to connect to various sql data sources of the type implemented in &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;the rest-Excel library&lt;/a&gt;, and the&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/regular-expressions"&gt; Excel regular expression library&lt;/a&gt;&amp;nbsp;along with the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes"&gt;data abstraction classes&lt;/a&gt;, so that they could be used to create really simple VBA functions.&lt;br /&gt;&lt;br /&gt;As with previous posts such as &amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/11/rest-json-excel-in-one-line-of-code.html"&gt;Rest-Excel in one line of code&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html"&gt;excel-Json in one line of code&lt;/a&gt;&amp;nbsp;, I set myself the target of being able to execute SQL on a variety of data sources, populate Excel worksheets, and do various conversions such as to jSon, all in just one line of VBA code. You can download the resultant classes and examples and read in &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/adodb"&gt;more detail on the ramblings web site&lt;/a&gt;, but here are some examples using the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/adodb"&gt;cADO library class&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some examples&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;Copy the current worksheet to another sheet, using ADODB.&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;Sub testADOCopyCurrent()&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim ado As New cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; ado.init().execute&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;End Sub&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;Copy selected columns of filtered data from one sheet to another, using SQL/ADODB, then clean up the connections afterwards&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;Sub testADOCopySpecificFilterSpecifyColsAdd()&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim ado As New cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; ado.init(Range("testAdo!c1"), , False).execute _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("tweetsentiments", "value", "where value=1").kill&lt;/code&gt;&lt;/div&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown"&gt;&lt;code style="color: #006000;"&gt;End Sub&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Copy a worksheet, using SQL filtering, convert it to jSon, and serialize the jSon nicely formatted as per jSonLint.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f7f5e6; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 13px; text-align: left;"&gt;&lt;code style="color: #006000;"&gt;Sub testADOCopySpecificFilterSpecifyColsjSon()&lt;/code&gt;&lt;/div&gt;&lt;div style="background-color: #f7f5e6; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 13px; text-align: left;"&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim ado As New cADO&lt;/code&gt;&lt;/div&gt;&lt;div style="background-color: #f7f5e6; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 13px; text-align: left;"&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Debug.Print ado.init(Range("testAdo!a1")).execute _&lt;/code&gt;&lt;/div&gt;&lt;div style="background-color: #f7f5e6; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 13px; text-align: left;"&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("tweetsentiments", , "where value=1").dSet.jObject.Serialize(True)&lt;/code&gt;&lt;/div&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="background-color: #f7f5e6; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 13px; text-align: left;"&gt;&lt;code style="color: #006000;"&gt;End Sub&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Get data from an access database using sql, and populate a worksheet&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: white; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em; text-align: left;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;Sub testADOaccess()&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim ado As cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Set ado = New cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ado.init(Range("testadoaccess!a1"), _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "D:\googlechart\sqlTest.accdb").execute _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "dogOwners", "firstname,lastname", "where dogowner=true"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;End Sub&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;Get data from a closed Excel workbook,&lt;span style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&amp;nbsp;populate a worksheet, and convert it to jSon, serializing the output nicely formatted for display.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;Sub testADOclosed()&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim ado As cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Set ado = New cADO&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Debug.Print _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ado.init(Range("testadoclosed!a1"), _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "D:\googlechart\roadmapgenerator.xlsm").execute( _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "inputdata").dSet.jObject.Serialize(True)&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;End Sub&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-397947582207514901?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/397947582207514901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2012/01/executing-sql-from-excel-and-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/397947582207514901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/397947582207514901'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2012/01/executing-sql-from-excel-and-data.html' title='Executing SQL from Excel and Data Abstraction'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5412370960031409368</id><published>2011-12-20T07:02:00.000-08:00</published><updated>2011-12-20T07:02:18.078-08:00</updated><title type='text'>TweetSentiments now in the cRest Excel library</title><content type='html'>&lt;b&gt;Interpreting sentiment from phrases.&lt;/b&gt;&lt;br /&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;I came across&amp;nbsp;&lt;a href="http://tweetsentiments.com/" style="background-color: transparent;"&gt;http://tweetsentiments.com/&lt;/a&gt;&amp;nbsp;the other day, which is a service that tries to analyze the sentiment expressed in a phrase. The are using a technique called Support Vector machines. &amp;nbsp;You can read about this implementation here&amp;nbsp;&lt;a href="http://www.csie.ntu.edu.tw/~cjlin/libsvm/" style="background-color: transparent;"&gt;http://www.csie.ntu.edu.tw/~cjlin/libsvm/&lt;/a&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;I wondered if this could be applied to phrases outside the world of twitter - say to data collected in a spreadsheet from some other medium.&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;In a previous entry, I described how to&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/11/adding-to-crest-excel-library.html" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; color: #009eb8; display: inline; outline-color: initial; outline-style: none; outline-width: initial; text-decoration: none;"&gt;add new entries to the rest-Excel library&lt;/a&gt;.&amp;nbsp;&lt;span style="background-color: white;"&gt;Here's another new library entry for tweetsentiments using their API.&lt;/span&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;You can use this to get the data straight into Excel.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br class="Apple-interchange-newline" /&gt;&lt;div&gt;The input data is just a column of phrases that need their sentiment analyzed, and the output is positive, negative or neutral. Here are some random phrases I tried and got the results shown below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2fNcKWdyp3w/TvChCCksSwI/AAAAAAAAAGs/VP31dpCgfvo/s1600/756.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2fNcKWdyp3w/TvChCCksSwI/AAAAAAAAAGs/VP31dpCgfvo/s1600/756.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The full code along with the other rest library examples can be downloaded in the cDataSet workbook, which is &amp;nbsp;one of the projects on the ramblings website at &amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; background-color: transparent; color: #009eb8; display: inline; outline-color: initial; outline-style: none; outline-width: initial; text-decoration: none;"&gt;http://ramblings.mcpher.com/Home/excelquirks/downloadlist&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background-color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;div id="" style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I'll be adding more to this library from time to time as I come across useful APIS. If you would like to see one implemented, tell me about it at&amp;nbsp;&lt;a href="http://groups.google.com/group/excel-ramblings" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; color: #009eb8; display: inline; outline-color: initial; outline-style: none; outline-width: initial; text-decoration: none;"&gt;the ramblings forum&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div id="" style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Here are the library entries added so far.&lt;/div&gt;&lt;div id="" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "google patents"&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "twitter"&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "google books by isbn"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "yahoo geocode"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "imdb by title"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "itunes movie"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "google finance"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "whatthetrend"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "tweetsentiments"&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div id="" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5412370960031409368?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5412370960031409368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/12/tweetsentiments-now-in-crest-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5412370960031409368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5412370960031409368'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/12/tweetsentiments-now-in-crest-excel.html' title='TweetSentiments now in the cRest Excel library'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2fNcKWdyp3w/TvChCCksSwI/AAAAAAAAAGs/VP31dpCgfvo/s72-c/756.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4339074372917619622</id><published>2011-12-19T02:56:00.000-08:00</published><updated>2011-12-19T03:07:03.105-08:00</updated><title type='text'>WhatTheTrend twitter top 10 added to Excel cRest library</title><content type='html'>&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif;"&gt;&lt;span style="font-size: 14px; line-height: 19px;"&gt;&lt;b&gt;What's trending on twitter to Excel&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;In a previous entry, I described how to&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/11/adding-to-crest-excel-library.html" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; color: #009eb8; display: inline; outline-color: initial; outline-style: none; outline-width: initial; text-decoration: none;"&gt;add new entries to the rest-Excel library&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="" style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;Here's another new library entry. &lt;a href="http://www.whatthetrend.com/"&gt;WhatTheTrend&lt;/a&gt;&amp;nbsp;provide an API for twitter watching. You can use this to get the data straight into Excel.&amp;nbsp;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div style="color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px;"&gt;Here's the code&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testWhatTheTrend()&lt;br /&gt;&amp;nbsp; &amp;nbsp; generalReport restQuery _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("whatthetrend", "whatthetrend", , , , , , , , , True) _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , True&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;Here's the populated sheet&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1SCneqPW6qM/Tu8W-noerbI/AAAAAAAAAGk/YgrGENEVbQg/s1600/755.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-1SCneqPW6qM/Tu8W-noerbI/AAAAAAAAAGk/YgrGENEVbQg/s1600/755.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;WhatTheTrend data returned to an Excel Sheet&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;div&gt;You could use this to automate collecting daily trending topics for example.The full code along with the other rest library examples can be downloaded in the cDataSet workbook, which is &amp;nbsp;one of the projects on the ramblings website at &amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist" style="background-color: transparent;"&gt;http://ramblings.mcpher.com/Home/excelquirks/downloadlist&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;&lt;div id="" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I'll be adding more to this library from time to time as I come across useful APIS. If you would like to see one implemented, tell me about it at&amp;nbsp;&lt;a href="http://groups.google.com/group/excel-ramblings"&gt;the ramblings forum&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4339074372917619622?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4339074372917619622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/12/whatthetrend-twitter-top-10-added-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4339074372917619622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4339074372917619622'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/12/whatthetrend-twitter-top-10-added-to.html' title='WhatTheTrend twitter top 10 added to Excel cRest library'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-1SCneqPW6qM/Tu8W-noerbI/AAAAAAAAAGk/YgrGENEVbQg/s72-c/755.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-9092276946853060366</id><published>2011-12-15T09:25:00.000-08:00</published><updated>2011-12-15T09:25:32.933-08:00</updated><title type='text'>How to use the Excel Roadmapper</title><content type='html'>&lt;b&gt;Excel Roadmapper from simple table data&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some time ago, I showed how to develop a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/recursionlink/roadmap-generation"&gt;VBA roadmapper&lt;/a&gt;&amp;nbsp;on the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings website&lt;/a&gt;. I've noticed that most of my visitors to that topic simply &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;download the finished workbook&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those that want to do that, I've finally got round to producing some &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets/howtoroadmapper"&gt;operational instructions for the roadmapper&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy mapping.&lt;/div&gt;&lt;div&gt;Bruce.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-9092276946853060366?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/9092276946853060366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/12/how-to-use-excel-roadmapper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9092276946853060366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9092276946853060366'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/12/how-to-use-excel-roadmapper.html' title='How to use the Excel Roadmapper'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7951577765064689667</id><published>2011-12-12T05:34:00.000-08:00</published><updated>2011-12-12T05:34:23.914-08:00</updated><title type='text'>Google Finance Added to crest Library</title><content type='html'>&lt;b&gt;Managing stock portfolio in Excel&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a previous entry, I described how to &lt;a href="http://excelramblings.blogspot.com/2011/11/adding-to-crest-excel-library.html"&gt;add new entries to the rest-Excel library&lt;/a&gt;. Up till now we've just looked at populating static data in a worksheet with data picked up from a call to site that can provide jSon response to a rest query.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You may want to just update part of a sheet that has some calculations in it, for example a stock portfolio. Here is the code to populate a sheet with data from Google Finance&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testGoogleFinance()&lt;br /&gt;&amp;nbsp; &amp;nbsp; generalReport restQuery _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("googlefinance", "google finance", , "ticker", , , , , False) _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , True&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this case, our sheet looks like this -&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-I08FEEqhXhs/TuYBRiS33AI/AAAAAAAAAGY/CeOYUNd-YcQ/s1600/725.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-I08FEEqhXhs/TuYBRiS33AI/AAAAAAAAAGY/CeOYUNd-YcQ/s1600/725.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The input is the ticker column, the other columns with yellow headers &amp;nbsp;are populated by the code given earlier.The columns with the blue header contain formulas based on the data returned by the rest query&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this case we needed to do 2 things differently than previous examples on this blog.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Instruct that the library does not blank out the sheet before populating (the false in the call arguments)&lt;/li&gt;&lt;li&gt;Leave a blank column between the data to be populated (the yellow), and that to be left alone (the blue), and also a blank row between the data and the total. This will ensure the formulas remain intact.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;That's all there is to it. See &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;rest to Excel library for downloads and more information&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7951577765064689667?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7951577765064689667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/12/google-finance-added-to-crest-library.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7951577765064689667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7951577765064689667'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/12/google-finance-added-to-crest-library.html' title='Google Finance Added to crest Library'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-I08FEEqhXhs/TuYBRiS33AI/AAAAAAAAAGY/CeOYUNd-YcQ/s72-c/725.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8888283760887570449</id><published>2011-12-01T07:39:00.001-08:00</published><updated>2011-12-01T08:01:53.871-08:00</updated><title type='text'>Comparing regEx and Search for sorting bulleted lists in Excel</title><content type='html'>&lt;b&gt;Sorting chapter/bullets numbers&lt;/b&gt;&lt;br /&gt;Quite often you need to sort data that has some kind of chapter numbering, such as&lt;br /&gt;1.1&lt;br /&gt;1.1.2&lt;br /&gt;2.1.1&lt;br /&gt;2.12.2&lt;br /&gt;&lt;br /&gt;A specialized form of this would be ipnumbers, for example&lt;br /&gt;192.1.3.2&lt;br /&gt;172.12.180.1&lt;br /&gt;&lt;br /&gt;These do not lend themselves to sorting easily, so the obvious solution is to insert leading zeroes. The problem though is how to separate the individual components so as to be able to standardize their widths.&lt;br /&gt;&lt;br /&gt;One way is to use the search function in Excel. Here is an example of turning such a form into a set of 4 digit numbers so they can be sorted (1.12.11 into&amp;nbsp;0001.0012.0011.).&amp;nbsp;Let's say that the input 1.12.11 is in cell B15, the formula is very complex, and becomes exponentially more complex with more groups of numbers.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;=TEXT(IFERROR(MID(B15,1,SEARCH(".",B15&amp;amp;",")-1),""),REPT("0",4)&amp;amp;".") &amp;amp; TEXT(IFERROR(MID(B15,SEARCH(".",B15 &amp;amp; ".")+1,SEARCH(".",B15 &amp;amp; ".",SEARCH(".",B15 &amp;amp; ".")+1)-SEARCH(".",B15 &amp;amp; ".")-1),""),REPT("0",4)&amp;amp;".")&amp;amp; TEXT(IFERROR(MID(B15,SEARCH(".",B15 &amp;amp; ".",SEARCH(".",B15 &amp;amp; ".")+1)+1,SEARCH(".",B15 &amp;amp; ".",SEARCH(".",B15 &amp;amp; ".",SEARCH(".",B15 &amp;amp; ".",SEARCH(".",B15 &amp;amp; ".")+1)+1)-SEARCH(".",B15 &amp;amp; ".")+1)-1),""),REPT("0",4)&amp;amp;".")&lt;/blockquote&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/quirky-functions/search"&gt;See here for a detailed discussion on how this works.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A better way is to use a regEx approach. Although regEx is available in VBA, it is not directly usable as a spreadsheet function. T&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/regular-expressions"&gt;he Excel RegEx library allows you to use a prebuilt library of regexes&lt;/a&gt; or to use your own directly in your spreadsheet. Here is the solution to the same problem using regEx. Let's say the regEx expression&amp;nbsp;([0-9]+).([0-9]+).([0-9]+)&amp;nbsp;&amp;nbsp;is in A15, and the value to be processed is in B15. The solution is&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;=TEXT(rxreplace(A15,B15,"$1"),REPT("0",4)&amp;amp;".") &amp;amp; TEXT(rxreplace(A15,B15,"$2"),REPT("0",4)&amp;amp;".") &amp;amp; TEXT(rxreplace(A15,B15,"$3"),REPT("0",4)&amp;amp;".")&lt;/blockquote&gt;In addition to being simpler to start with, complexity increase &amp;nbsp;is linear as more sets of numbers are added.&lt;br /&gt;&lt;br /&gt;See&amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/regular-expressions"&gt;http://ramblings.mcpher.com/Home/excelquirks/regular-expressions&lt;/a&gt;&amp;nbsp;for more examples of this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8888283760887570449?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8888283760887570449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/12/comparing-regex-and-search-for-sorting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8888283760887570449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8888283760887570449'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/12/comparing-regex-and-search-for-sorting.html' title='Comparing regEx and Search for sorting bulleted lists in Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8542516687018848241</id><published>2011-11-24T08:49:00.001-08:00</published><updated>2011-11-24T08:59:34.385-08:00</updated><title type='text'>Adding to the crest- Excel Library</title><content type='html'>&lt;br /&gt;&lt;br /&gt;Following the post earlier on &lt;a href="http://excelramblings.blogspot.com/2011/11/rest-json-excel-in-one-line-of-code.html"&gt;rest-jSon-Excel in one line of code&lt;/a&gt;&amp;nbsp;, I found that you can do the research and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest/adding"&gt;add a new library entry&lt;/a&gt; in about 10 minutes.&lt;br /&gt;&lt;br /&gt;Here is a query to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;populate an Excel sheet&lt;/a&gt; with all the movies a particular actor has every made, using the&lt;a href="http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html"&gt; itunes rest API.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testItunesMovie()&lt;br /&gt;&amp;nbsp; &amp;nbsp; generalQuery "itunesmovie", "itunes movie", _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InputBox(prompt:="Enter your itunes movie search query (eg. actor name)", _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Title:="itunes API query:results to the itunesmovie worksheet")&lt;br /&gt;End Sub&lt;/blockquote&gt;Here's the library entry&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Case "itunes movie"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If abandonType(sEntry, qType, erSingleQuery) Then Exit Function&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sUrl = "http://itunes.apple.com/search?entity=movie&amp;amp;media=movie&amp;amp;term="&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sResults = "results"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bTreeSearch = False&lt;/blockquote&gt;&lt;br /&gt;And here's the result, using Peter Fonda as the query, so let's have your suggestions on other cool Apis.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-oj7NE9b_DFA/Ts52tgll8KI/AAAAAAAAAGQ/jl5QeQY0BvM/s1600/724.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="370" src="http://1.bp.blogspot.com/-oj7NE9b_DFA/Ts52tgll8KI/AAAAAAAAAGQ/jl5QeQY0BvM/s640/724.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8542516687018848241?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8542516687018848241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/11/adding-to-crest-excel-library.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8542516687018848241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8542516687018848241'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/11/adding-to-crest-excel-library.html' title='Adding to the crest- Excel Library'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-oj7NE9b_DFA/Ts52tgll8KI/AAAAAAAAAGQ/jl5QeQY0BvM/s72-c/724.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5701715313440992069</id><published>2011-11-24T02:05:00.001-08:00</published><updated>2011-11-24T04:40:48.263-08:00</updated><title type='text'>Rest - jSon - Excel in one line of code</title><content type='html'>&lt;b&gt;Rest - jSon - Excel in one line of code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;My recent post on how to&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html"&gt;Excel-jSon-Excel in one line of code&lt;/a&gt;, &amp;nbsp;seems to have generated a lot of pageviews, so clearly there are a lot of you who are interested in&amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/excel-json-conversion"&gt;excel-json-conversion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It occurred to me though, that &lt;a href="http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html"&gt;this post&lt;/a&gt; was kind of specialized, meaning that the data is expected to be in a table format - essentially an image of the Excel sheet.&lt;br /&gt;&lt;br /&gt;Normally, the reason for jSon -&amp;gt; Excel conversion is because you need to deal with the results from a web service, each of which will have its own data structure, which isn't generally a two dimensional structure. For that type of problem, it is better to use the&amp;nbsp;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;rest to excel library&lt;/a&gt;&amp;nbsp;which I &lt;a href="http://excelramblings.blogspot.com/2011/11/rest-library-for-excel.html"&gt;covered in this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the spirit of&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html"&gt;Excel-jSon-Excel in one line of code&lt;/a&gt;, here is Rest-jSon-Excel in one line of code, using the IMDB database to populate details in an Excel table with details about a list of movies.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Public Sub testIMDBoneline()&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim cr As New cRest&lt;br /&gt;&amp;nbsp; &amp;nbsp; restQuery "imdb", , , "title", _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "http://www.imdbapi.com/?tomatoes=true&amp;amp;t=", , False&lt;br /&gt;End Sub&lt;/blockquote&gt;Which will fill in a worksheet with selected details (you select by simply adding column names that match some of the fieldnames in the rest query response) about films, given their titles in column A, as below&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ag9UWL6lvGQ/Ts446jqAbmI/AAAAAAAAAGI/EQz_NTMPj9c/s1600/723.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://2.bp.blogspot.com/-Ag9UWL6lvGQ/Ts446jqAbmI/AAAAAAAAAGI/EQz_NTMPj9c/s640/723.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To try this out you can download the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;cDataSet workbook at the ramblings site&lt;/a&gt;, or read more about the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;cRest Excel library&lt;/a&gt; here.&lt;br /&gt;&lt;br /&gt;I have now added the IMBD query to the library, and its nicer calling method is simply this&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testIMDB()&lt;br /&gt;&amp;nbsp; &amp;nbsp; generalDataSetQuery "imdb", "imdb by title", "title"&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;I&lt;/a&gt;f anyone has any libraries they have added to Excel Rest library, or that you would like me to add, please leave a comment or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;contact me on our forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5701715313440992069?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5701715313440992069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/11/rest-json-excel-in-one-line-of-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5701715313440992069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5701715313440992069'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/11/rest-json-excel-in-one-line-of-code.html' title='Rest - jSon - Excel in one line of code'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ag9UWL6lvGQ/Ts446jqAbmI/AAAAAAAAAGI/EQz_NTMPj9c/s72-c/723.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4777144174497934061</id><published>2011-11-21T06:28:00.001-08:00</published><updated>2011-11-21T06:45:45.464-08:00</updated><title type='text'>rest library for Excel</title><content type='html'>&lt;b&gt;Eliminating repetitive coding of Excel web service integration&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;I find myself writing more and more web service to Excel integrations. Here are just a few &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/web-services"&gt;examples of webservice-Excel integrations from the excel ramblings site&lt;/a&gt;. I thought it was about time to generalize this in the form of a new &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;class cRest, and a library of known integrations&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As usual, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json"&gt;jSon - Excel conversion&lt;/a&gt; and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/data-abstraction"&gt;Excel data abstraction&lt;/a&gt;&amp;nbsp;are used to make the whole thing straightforward. Here's an example of populating a worksheet named "tweets" from a supplied query using this new library and class.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testTwitter()&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; generalTestQuery "tweets", "twitter", _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InputBox(prompt:="Enter your twitter search query", _&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Title:="twitter API query:results to the tweets worksheet")&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;End Sub&amp;nbsp;&lt;/blockquote&gt;And another using a datatable to generate a set of queries to Yahoo GeoCoding and fill in the table from the responses&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Public Sub testYahooGeocode()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;generalTestDataSetQuery "geocoding", "yahoo geocode", "input address"&lt;br /&gt;End Sub&lt;/blockquote&gt;Take a look at the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/rest"&gt;article on the Excel ramblings site&lt;/a&gt;&amp;nbsp;and download the example workbook,&amp;nbsp;&lt;a href="http://groups.google.com/group/excel-ramblings"&gt;contact me for more details on our forum&lt;/a&gt;, &lt;span class="Apple-style-span" style="color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;a href="https://twitter.com/intent/user?screen_name=brucemcpherson"&gt;follow me on twitter&lt;/a&gt;, or follow this blog to get more detail on this topic as it is published.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4777144174497934061?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4777144174497934061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/11/rest-library-for-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4777144174497934061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4777144174497934061'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/11/rest-library-for-excel.html' title='rest library for Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7710952935921225022</id><published>2011-11-15T02:54:00.001-08:00</published><updated>2011-11-15T03:09:54.255-08:00</updated><title type='text'>Repository for VizMap generated applications</title><content type='html'>&lt;b&gt;What are generated VizMap applications&lt;/b&gt;&lt;br /&gt;These are mapping applications integrating Google Maps, Google Earth, Google Visualizations and Twitter.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here is an example screenshot.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s1600/701.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s320/701.png" width="261" /&gt;&lt;/a&gt;&lt;/div&gt;They are data driven in the sense that the applications are generated from a dataset and a parameter sheet and need no coding. Normally they would be generated straight from Excel, but any application or manual process capable of producing the required jSon formatted framework description can also produce them.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications"&gt;You can read about them here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Repository for examples&lt;/b&gt;&lt;br /&gt;There has been a lot of interest in these vizmap applications to the extent that my hosting &amp;nbsp;bandwidth quota &amp;nbsp;has been exceeded. I have moved all the examples referenced on the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings site&lt;/a&gt;, in &lt;a href="http://excelramblings.blogspot.com/"&gt;this blog&amp;nbsp;&lt;/a&gt;&amp;nbsp;and &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;our forum&lt;/a&gt;&amp;nbsp;to dropbox. If a link does not work, try&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/14196218/Share/"&gt;http://dl.dropbox.com/u/14196218/Share/&lt;/a&gt;&amp;nbsp;followed by the filename, or just &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;download the Excel application and generate the examples from there&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7710952935921225022?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7710952935921225022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/11/repository-for-vizmap-generated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7710952935921225022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7710952935921225022'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/11/repository-for-vizmap-generated.html' title='Repository for VizMap generated applications'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s72-c/701.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7953215807484193199</id><published>2011-11-11T13:03:00.001-08:00</published><updated>2011-11-15T02:42:54.091-08:00</updated><title type='text'>Twitter, Excel, Google Maps,Visualizations and Earth - all together</title><content type='html'>&lt;b&gt;Twitter, Google Visualizations, Google Maps, Google Earth, Excel - all together.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In various posts such as&amp;nbsp;&lt;a href="http://excelramblings.blogspot.com/2011/10/flying-around-google-earth-markers-in.html"&gt;Flying around with Google Earth&lt;/a&gt;&amp;nbsp;and &lt;a href="http://excelramblings.blogspot.com/2011/10/another-vizmap-generated-appplication.html"&gt;The Royal Family and their homes&lt;/a&gt;&amp;nbsp;as well as on the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications"&gt;ramblings site&lt;/a&gt;&amp;nbsp;I showed how to create data driven applications right out of Excel that leveraged visualizations, Google Earth and Google Maps.&lt;br /&gt;&lt;br /&gt;The latest version of this, which can be downloaded from &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;the ramblings site&amp;nbsp;&lt;/a&gt;, now has Organization charts, and relevant tweets as options for displaying in infowindows or infobubbles. As before, if you prefer, these can be added without writing any javaScript, and generated straight out of Excel.&lt;br /&gt;&lt;br /&gt;Here is an &lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapOrgGeneratedEarth.html"&gt;example application that I generated today - all about bankers.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s1600/701.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s320/701.png" width="261" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7953215807484193199?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7953215807484193199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/11/twitter-google-visualizations-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7953215807484193199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7953215807484193199'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/11/twitter-google-visualizations-google.html' title='Twitter, Excel, Google Maps,Visualizations and Earth - all together'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sCmNV0bgyqk/Tr2Nkz-RtEI/AAAAAAAAAFs/W5uftKDoR_8/s72-c/701.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-6700895007111540928</id><published>2011-10-30T07:18:00.000-07:00</published><updated>2011-11-15T02:44:24.853-08:00</updated><title type='text'>Excel-jSon-Excel in one line of code</title><content type='html'>&lt;br /&gt;&lt;h4 id="" style="background-color: white; color: #323229; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.1em; text-align: left;"&gt;Excel-jSon-Excel in one line of code&lt;/h4&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px;"&gt;On the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings site&lt;/a&gt;, I set myself the challenge to write &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes"&gt;some classes&lt;/a&gt; that could be invoked to convert an entire Worksheet to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json"&gt;jSon&lt;/a&gt;, or alternatively, to &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/web-services"&gt;consume a webservice&lt;/a&gt; and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/excel-json-conversion"&gt;populate and entire worksheet in one line of code&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;These examples, and the classes they use can be &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;downloaded from the ramblings site&lt;/a&gt;, and are in included in cDataSet.xlsm.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;b&gt;Here we go&lt;/b&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #323229; font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif; font-size: 13px; line-height: 16px; text-align: left;"&gt;Get a jSon response from a web service and populate a worksheet with the result.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; Dim dSet As New cDataSet, cb As New cBrowser, jo As New cJobject&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; dSet.populateJSON jo.deSerialize( _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cb.httpGET( _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "http://dl.dropbox.com/u/14196218/files/jSon1.html" _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) _&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ).Child("cDataSet"), Range("json1!$a$1")&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;create and print a jSon string from a worksheet.&lt;br /&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim dSet As New cDataSet&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Debug.Print dSet.populateData( _&lt;/code&gt;&lt;br /&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Range("jSon2!$a$1"), , , , , , True _&lt;/code&gt;&lt;br /&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;).jObject.Serialize(True)&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The jSon string both created and consumed looks like this -&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/14196218/files/jSon1.html"&gt;or see it online&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="sites-codeblock sites-codesnippet-block" style="background-color: #f7f5e6; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; line-height: 1; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp;"cDataSet":[ &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Customer":"Acme",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Contact":"john",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Total":"100",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Country":"US"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Customer":"Smiths",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Contact":"fred",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Total":"460",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Country":"UK"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Customer":"Jones",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Contact":"joe",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Total":"24",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Country":"US"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Customer":"Renault",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Contact":"Marie",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Total":"536",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Country":"FRANCE"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Customer":"Schneider",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Contact":"Hans",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Total":"1334",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"Country":"Germany"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp; &amp;nbsp; ]&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code style="color: #006000;"&gt;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4 style="font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.1em;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7289528839575681860" name="TOC-The-Excel-sheet-that-gets-created-l" style="color: #f4782d; text-decoration: underline;"&gt;&lt;/a&gt;The Excel sheet that gets created looks like this&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qKDIjIbHE7Y/Tq1cixOR48I/AAAAAAAAAFE/KeEHT0bbjfE/s1600/501.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-qKDIjIbHE7Y/Tq1cixOR48I/AAAAAAAAAFE/KeEHT0bbjfE/s1600/501.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown"&gt;Hopefully you will see how that works from some of the other &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json"&gt;jSon examples on the ramblings site&lt;/a&gt;, or you can&amp;nbsp;&lt;a href="http://groups.google.com/group/excel-ramblings" style="color: rgb(0, 57, 101) !important;"&gt;ask me on the forum&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-6700895007111540928?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/6700895007111540928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6700895007111540928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6700895007111540928'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/excel-json-excel-in-one-line-of-code-on.html' title='Excel-jSon-Excel in one line of code'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qKDIjIbHE7Y/Tq1cixOR48I/AAAAAAAAAFE/KeEHT0bbjfE/s72-c/501.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5067243148185444668</id><published>2011-10-27T03:41:00.000-07:00</published><updated>2011-11-23T07:34:49.806-08:00</updated><title type='text'>Ramblings web site has a new look</title><content type='html'>&lt;b&gt;Ramblings web site has a new look&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Just spent a little bit of time on Google Sites cleaning up the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings web site&lt;/a&gt;. I think navigation should be a little cleaner.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://ramblings.mcpher.com/"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-tTJjiAjzyNk/Tqk0ypo4glI/AAAAAAAAAE4/Zf4GXt4jjgM/s320/pic313.png" width="320" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5067243148185444668?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5067243148185444668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/ramblings-web-site-has-new-look-just.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5067243148185444668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5067243148185444668'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/ramblings-web-site-has-new-look-just.html' title='Ramblings web site has a new look'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tTJjiAjzyNk/Tqk0ypo4glI/AAAAAAAAAE4/Zf4GXt4jjgM/s72-c/pic313.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4720595436688651094</id><published>2011-10-24T11:26:00.000-07:00</published><updated>2011-11-23T07:34:02.206-08:00</updated><title type='text'>Flying around Google Earth Markers</title><content type='html'>&lt;br /&gt;&lt;div&gt;Flying around Google Earth Markers&lt;/div&gt;&lt;div&gt;In last weeks blog entry, I showed how to &lt;a href="http://excelramblings.blogspot.com/2011/10/another-vizmap-generated-appplication.html"&gt;generate a Google Earth or Google Maps based application&lt;/a&gt; out of Excel. These applications now have the capability to fly around each marked entry in Google Earth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="margin: 6px; padding: 6px;"&gt;The info balloons now have a 'Fly Around' button which will zoom closer and rotate around the selected object. Rotation is stopped by just clicking the marker again. Control of animation is in the excel parameter sheet&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pj9Ptc2t-Mo/TqWpbpjKc0I/AAAAAAAAAEo/JTrtafKGxEQ/s1600/pic307.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="75" src="http://4.bp.blogspot.com/-pj9Ptc2t-Mo/TqWpbpjKc0I/AAAAAAAAAEo/JTrtafKGxEQ/s200/pic307.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="margin: 6px; padding: 6px;"&gt;&lt;div style="display: inline; float: right; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-vhJjjWp-7Kk/TqWmLd0QgGI/AAAAAAAAAEQ/zjXK4Jjur_M/s1600/pic306.png" imageanchor="1"&gt;&lt;img border="0" height="282" src="http://1.bp.blogspot.com/-vhJjjWp-7Kk/TqWmLd0QgGI/AAAAAAAAAEQ/zjXK4Jjur_M/s400/pic306.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a cut from a fly around animation in progress - &lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapFamilyGeneratedEarth.html"&gt;try it out&amp;nbsp;&lt;/a&gt;&amp;nbsp;, read about it and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;download the complete workbook at the ramblings site&lt;/a&gt;, see how to create the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications/javascript/manualframework"&gt;framework for this data driven application if you do not use Excel&lt;/a&gt;&amp;nbsp;or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;contact me on our forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Grt0UNxKEmg/TqWqV7LnVII/AAAAAAAAAEw/U_1mlBBHleU/s1600/pic308.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://4.bp.blogspot.com/-Grt0UNxKEmg/TqWqV7LnVII/AAAAAAAAAEw/U_1mlBBHleU/s400/pic308.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4720595436688651094?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4720595436688651094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/flying-around-google-earth-markers-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4720595436688651094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4720595436688651094'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/flying-around-google-earth-markers-in.html' title='Flying around Google Earth Markers'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pj9Ptc2t-Mo/TqWpbpjKc0I/AAAAAAAAAEo/JTrtafKGxEQ/s72-c/pic307.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-6102141963322818354</id><published>2011-10-22T10:53:00.000-07:00</published><updated>2011-11-15T02:47:37.440-08:00</updated><title type='text'>Another VizMap generated appplication - the British Royal Family and their homes</title><content type='html'>&lt;b&gt;Another VizMap generated appplication - the British Royal Family and their homes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;Excel ramblings site&lt;/a&gt;, I cover how to generate Google Earth and Google Maps Application straight out of Excel, without needing to write any javascript.&lt;br /&gt;&lt;br /&gt;These are data driven, so all you have to do is to set up an excel table for data and parameters that describe the application. Here is one I generated today showing the British Royal family, their homes, and their relationships. I'll add a bit more data to this over time, but you should get the idea.&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 13px; text-align: center;"&gt;&lt;div style="text-align: left;"&gt;It's very easy to do this with your own data. &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;Just download the googlemapping.xlsm workbook and go.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZQ1_kytJPvI/TqMAVbegcOI/AAAAAAAAAEA/SjLzG8afZ-g/s1600/pic301.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="243" src="http://1.bp.blogspot.com/-ZQ1_kytJPvI/TqMAVbegcOI/AAAAAAAAAEA/SjLzG8afZ-g/s320/pic301.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapFamilyGeneratedEarth.html"&gt;Try the Google Earth Version&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-AY1wmcGgMzQ/TqMBG2ZidJI/AAAAAAAAAEI/yXpvhfsgPkc/s1600/pic302.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-AY1wmcGgMzQ/TqMBG2ZidJI/AAAAAAAAAEI/yXpvhfsgPkc/s320/pic302.png" width="313" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapFamilyGenerated.html"&gt;Try the Google Maps Version&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-6102141963322818354?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/6102141963322818354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/another-vizmap-generated-appplication.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6102141963322818354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6102141963322818354'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/another-vizmap-generated-appplication.html' title='Another VizMap generated appplication - the British Royal Family and their homes'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZQ1_kytJPvI/TqMAVbegcOI/AAAAAAAAAEA/SjLzG8afZ-g/s72-c/pic301.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2356353763783051981</id><published>2011-10-20T10:34:00.000-07:00</published><updated>2011-11-15T02:48:51.096-08:00</updated><title type='text'>Changing the markers on Google Earth to something in your data</title><content type='html'>&lt;br /&gt;&lt;b&gt;Changing the markers on Google Earth to something in your data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I introduced the capability to &lt;a href="http://excelramblings.blogspot.com/2011/10/google-visualizations-on-google-map.html"&gt;generate google maps and google earth applications straight from Excel.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8-iiIk6asxU/TqBYKwXkIEI/AAAAAAAAAD4/LJutyl9gwlc/s1600/pic294.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8-iiIk6asxU/TqBYKwXkIEI/AAAAAAAAAD4/LJutyl9gwlc/s1600/pic294.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Linkin Park Marker on Red Square from Google Earth&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;While creating an &lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapVenuesGeneratedEarth.html"&gt;Earth version of the concerts/venues example&amp;nbsp;&lt;/a&gt;I came across this rather nice rendering of Red Square. Since we can change the marker in &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications/spots"&gt;google earth straight from our data&lt;/a&gt;, it plotted Linkin Park right there in front of the cathedral.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A single click on the marker brings up an information balloon and a double will now fly to the next location.&lt;br /&gt;&lt;br /&gt;Take a look at the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications"&gt;write up or download the workbook on the Excel Ramblings Site&lt;/a&gt; and give us&lt;a href="http://groups.google.com/group/excel-ramblings"&gt; feedback on our forum.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2356353763783051981?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2356353763783051981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/changing-markers-on-google-earth-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2356353763783051981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2356353763783051981'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/changing-markers-on-google-earth-to.html' title='Changing the markers on Google Earth to something in your data'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-8-iiIk6asxU/TqBYKwXkIEI/AAAAAAAAAD4/LJutyl9gwlc/s72-c/pic294.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-3348450218670799091</id><published>2011-10-19T09:22:00.000-07:00</published><updated>2011-11-15T02:50:55.213-08:00</updated><title type='text'>Google Visualizations on Google Map infoWindows and Google Earth Balloons</title><content type='html'>&lt;b&gt;Google Visualizations on Google Map infoWindows and Google Earth Balloons&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few weeks ago &lt;a href="http://excelramblings.blogspot.com/2011/10/creating-data-driven-mapping.html"&gt;I wrote about generating data driven mapping applications straight out of Excel&lt;/a&gt;, with no javaScript required (by you anyway). It has generated quite a bit of interest on the &lt;a href="http://ramblings.mcpher.com/"&gt;ramblings web site&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wondered if I could take the idea a little further and do the same thing using google Earth as the provider. I've just released that today. You can &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;download the workbook - googleMapping.xlsm&lt;/a&gt;, but here are a couple of links to the generated applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-38Suf2wO93E/Tp71sA7Z0NI/AAAAAAAAADg/FC361JcBAq4/s1600/pic291.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="78" src="http://4.bp.blogspot.com/-38Suf2wO93E/Tp71sA7Z0NI/AAAAAAAAADg/FC361JcBAq4/s320/pic291.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The only difference when generating the application from Excel is to choose the provider.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5OQ2Eotp_AI/Tp72FHqGBqI/AAAAAAAAADo/IsNBXtm7zmQ/s1600/pic289.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://3.bp.blogspot.com/-5OQ2Eotp_AI/Tp72FHqGBqI/AAAAAAAAADo/IsNBXtm7zmQ/s320/pic289.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The Earth version gives the opportunity to fly between locations, and looks beautiful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapPalacesGeneratedEarth.html"&gt;Google Earth Version.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rg39QE3dG1A/Tp727wY3enI/AAAAAAAAADw/HPo8Lu1Poa8/s1600/pic290.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://1.bp.blogspot.com/-rg39QE3dG1A/Tp727wY3enI/AAAAAAAAADw/HPo8Lu1Poa8/s320/pic290.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Here's the map version&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapPalacesGenerated.html"&gt;Google Maps Version.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take a look at the detail behind this &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications"&gt;on the ramblings site.&lt;/a&gt;&amp;nbsp;or ask questions &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;on our forum.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-3348450218670799091?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/3348450218670799091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/google-visualizations-on-google-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3348450218670799091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3348450218670799091'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/google-visualizations-on-google-map.html' title='Google Visualizations on Google Map infoWindows and Google Earth Balloons'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-38Suf2wO93E/Tp71sA7Z0NI/AAAAAAAAADg/FC361JcBAq4/s72-c/pic291.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8851133732077460531</id><published>2011-10-07T04:24:00.000-07:00</published><updated>2011-11-15T02:53:29.003-08:00</updated><title type='text'>Creating Data Driven Mapping applications</title><content type='html'>&lt;b&gt;Creating Data Driven Mapping applications&lt;/b&gt;&lt;br /&gt;In a previous post I looked at the the &lt;a href="http://excelramblings.blogspot.com/2011/09/comparing-bing-ovi-yahoo-and-google.html"&gt;various mapping packages and how they compared&lt;/a&gt;. Having concluded that Google Maps was the winner, I started to work on an Excel application that could generate the necessary javaScript to Map Excel data and create tabbed Info Windows with embedded Google&amp;nbsp;Visualization. This is now completed and can be downloaded and read about on the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mappingapplications"&gt;Excel Ramblings Site&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open up Google Maps and Vizualizations to Excel users&lt;/b&gt;&lt;br /&gt;It occurred to me that Google Maps and Google&amp;nbsp;Visualizations&amp;nbsp;were pretty much out of reach to those who did not know javaScript, or have much web experience, even though they might quite adept at VBA and have some interesting data that could benefit from these tools.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;VizMap application&lt;/b&gt;&lt;br /&gt;The purpose of this application then is to take Excel Data and some parameters and create an html file to map and visualize that data. In the example you'll find 3 demo applications that have been created this way. You can also run them directly below&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #eee8dd; color: #333333; font-family: Georgia, 'Times New Roman', serif; font-size: 13px; line-height: 21px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapOrdersGenerated.html"&gt;A Customer/Orders theme.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapVenuesGenerated.html"&gt;A Concert Venues/Artist theme.&lt;/a&gt;&lt;/li&gt;&lt;li id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown"&gt;&lt;a href="http://dl.dropbox.com/u/14196218/Share/vizMapPalacesGenerated.html"&gt;A Dictators/Palaces theme&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Non-Excel users&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Since the javaScript component of this is taking a jSon formatted framework definition, as well as jSon data, clearly this input can be created manually or indeed from some web service, so this application may be of some interest to non- Excel users also. All that is needed is to write 2 functions that will return the framework (what the application needs to look like and how to present data), and the data that needs to be displayed.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More on this on future blog entries. I look forward to your comments on this blog or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;at our forum.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8851133732077460531?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8851133732077460531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/10/creating-data-driven-mapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8851133732077460531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8851133732077460531'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/10/creating-data-driven-mapping.html' title='Creating Data Driven Mapping applications'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-1962693317928556609</id><published>2011-09-09T08:01:00.000-07:00</published><updated>2011-09-09T08:01:53.394-07:00</updated><title type='text'>Comparing Bing, Ovi, Yahoo and Google Maps</title><content type='html'>&lt;b&gt;Geocoding Excel&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;While looking at how to connect Excel to Google Maps, &amp;nbsp;I implemented a capability in vba for each of the main Apis for &lt;a href="http://excelramblings.blogspot.com/2011/09/geocoding-from-excel-yahoo-vs-bing-vs.html"&gt;geoCoding capability through a simple http: request&lt;/a&gt;. You can read more about this comparison on the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;Excel Ramblings Site&lt;/a&gt;. I've also now implemented the same thing to plot &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;Excel Data directly to Google Maps, Ovi Maps, Bing Maps and Yahoo! Maps&lt;/a&gt; (although Yahoo maps is about to close down I understand).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Comparing Mapping capabilities&lt;/b&gt;&lt;br /&gt;I have already covered geoMapping, where the winners were Google (despite its complex response format) and Yahoo PlaceMaker. Scores for geoCoding Google 7/10, Yahoo 7/10, Ovi 0/10 (I couldn't find its REST interface URL anywhere) and Bing a pathetic 2/10. Bing also sends back a bunch of junk in its REST response in addition to the data you've asked for.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Ease of implementation&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;The easiest to implement was Google Maps. The code is clean and basic things you might want to do like pop up an info window onClick and show a pushpin label when mouseOver (and get rid of it again on mouseLeave) were all built in. In fact there was basically no code to write - just get the data in the right format and go.&lt;br /&gt;&lt;b&gt;Google - 9/10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yahoo Maps! was almost as simple, very much mirroring the Google approach.&lt;br /&gt;&lt;b&gt;Yahoo! - 8/10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ovi Maps was more of a chore with more coding needed for infoWindow and pushPin event handling, but it does have a very rich API and the capability to do many cool things. The documentation for the API (yes I needed to look it up for Ovi Maps) seems to have been written by an alien for aliens and is somehow boring and esoteric at the same time. They do provide a playground which is a strange hybrid of menu driven and code based as if they haven't really decided who their audience is. Nevertheless, it was pretty easy to figure out once you got past the&amp;nbsp;weirdness.&lt;br /&gt;&lt;b&gt;Ovi - 6/10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bing is of course different, like all things Microsoft. It expects you to be very hands on in a number of ways such as dealing with infoBox and pushPin events, and if you want to use html to layout the interior of an infoBox (as opposed to using the preset title, description etc), then things like a pointer on the box and other &amp;nbsp;various other properties dont seem to work. Their playground is pretty good though, and their documentation is patchy - for example they have decided to call their mouseLeave event mouseOut and but strangely it is referred to as mouseLeave in the documentation - so you can imagine how much time wasting that caused.&lt;br /&gt;&lt;b&gt;Bing - 5/10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Richness of capability&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;For the purposes of this article I only tested a specific number of capabilities, and as a constraint i wanted to keep the input items to be plotted in exactly the same format - so this is a pretty unscientific score based only on what I noticed while implementing this test.&lt;br /&gt;&lt;b&gt;Google - 9/10, Yahoo - 6/10 , Ovi - 9/10 , Bing 7/10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Media quality&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;This is subjective of course, but just considering the standard views then both Ovi and Bing have beautiful rendering, followed by Yahoo and Google which is looking a bit jaded now. Bing is let down by the quality of its pushpins and info boxes, but the map quality is excellent.&lt;br /&gt;&lt;b&gt;Google - 5/10, Yahoo - 5/10 , Ovi - 9/10 , Bing 8/10&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Restrictions&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;All of these have terms and conditions of course, and some of them need a key. Ovi said it needed a key but worked without one anyway, Yahoo needs a key that was easy to get, and Bing needs a Key that was 64 characters long and has an 11 page&amp;nbsp;PowerPoint&amp;nbsp;and a video to tell you how simple it is to get one. Got it in the end I guess. Google&amp;nbsp;doesn't&amp;nbsp;need a key, but cuts you off after you exceed a rather small daily number of geoCode requests.&lt;br /&gt;&lt;b&gt;Google - 5/10, Yahoo - 6/10 , Ovi - 9/10 , Bing &amp;nbsp;5/10&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Overall Scores&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mapmarkers"&gt;Google Maps&lt;/a&gt; - 35/50&lt;/li&gt;&lt;li&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/ovimarker"&gt;Ovi Maps&lt;/a&gt; - 33/50 (May &amp;nbsp;have won if it had a REST geocode capability)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/yahoomarker"&gt;Yahoo! Placemaker + Yahoo! Maps&lt;/a&gt; - 32/50 (but &amp;nbsp;remember it's closing down)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/bingmarker"&gt;Bing Maps&lt;/a&gt; - 27/10&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;So Google wins through simplicity, Microsoft Fails by trying too hard and by giving something a stupid name, Yahoo gives up and Ovi (or is Nokia again) has a great solution but loses it's way through branding and communication. &amp;nbsp;Sound familiar?&lt;br /&gt;&amp;nbsp;&lt;br /&gt;You can download the final Excel sheet that tests all this and judge for yourself and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;read the full story at Excel Ramblings&lt;/a&gt;. Please leave any questions, comments, feedback on this blog or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;through our forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bruce&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-1962693317928556609?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/1962693317928556609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/09/comparing-bing-ovi-yahoo-and-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1962693317928556609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1962693317928556609'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/09/comparing-bing-ovi-yahoo-and-google.html' title='Comparing Bing, Ovi, Yahoo and Google Maps'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-3741453782255479723</id><published>2011-09-06T02:04:00.000-07:00</published><updated>2011-09-06T02:04:55.062-07:00</updated><title type='text'>Mapping Data straight out of Excel</title><content type='html'>&lt;b&gt;Excel and Google Maps.&lt;/b&gt;&lt;br /&gt;Following my previous posts comparing the &lt;a href="http://excelramblings.blogspot.com/2011/09/geocoding-from-excel-yahoo-vs-bing-vs.html"&gt;geoCoding capabilities of Yahoo, Bing and Google Maps&lt;/a&gt;&amp;nbsp;I have now implemented &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/mapmarkers"&gt;Adding markers to google Maps straight from an Excel Table&lt;/a&gt;. As usual this is fully functional &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;Excel application you can download and use&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please take a look and give us some feedback on the &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;excel ramblings forum&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next I will take a look at how easy it is to implement the same thing on google Maps, Bing and Yahoo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OVI maps&lt;/b&gt;&lt;br /&gt;I did want to include OVI maps in this comparison, but I could not find the REST Url for geoCoding. Anybody know it? Either it is very well hidden or it doesn't exist.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Egghead Cafe Article&lt;/b&gt;&lt;br /&gt;I quite often contribute articles to&amp;nbsp;&lt;a href="http://www.eggheadcafe.com/"&gt;http://www.eggheadcafe.com/&lt;/a&gt;. For those of you who were interested in the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;article on comparison of geoCoding providers on Excel Ramblings Site&lt;/a&gt;, you may want to take a look at this one &lt;a href="http://www.eggheadcafe.com/tutorials/aspnet/7aed33c7-c1cc-4f14-8332-c6536a3d4202/geocoding-directly-from-excel-comparing-bing-yahoo-and-google-maps.aspx"&gt;on the same theme on Egghead Cafe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bruce&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-3741453782255479723?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/3741453782255479723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/09/mapping-data-straight-out-of-excel.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3741453782255479723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3741453782255479723'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/09/mapping-data-straight-out-of-excel.html' title='Mapping Data straight out of Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-1968167287636582085</id><published>2011-09-03T04:24:00.001-07:00</published><updated>2011-09-03T04:27:14.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bing maps'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='cdataset'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo placemaker'/><category scheme='http://www.blogger.com/atom/ns#' term='vba'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Geocoding from Excel: Yahoo -vs- Bing -vs- Google</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Georgia, 'Times New Roman', serif; font-size: 13px; line-height: 21px; background-color: rgb(238, 232, 221); "&gt;&lt;div id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown"&gt;I have already looked at &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps/getmapsbing" style="color: rgb(0, 128, 187); "&gt;geocoding with Bing Maps -vs- Google Maps&lt;/a&gt; and Google Maps is a clear winner. Yahoo Placemaker is pretty good at first glance even though it  claims not to be a geocoder.  Note that I am just using the basic REST URI query in all these examples - since the whole point to access directly from Excel. Comparing capabilities under Javascript would be a whole different ballgame.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;&lt;span&gt; &lt;/span&gt;Yahoo require you to get a &lt;a href="http://developer.yahoo.com/geo/placemaker/" rel="nofollow" style="color: rgb(0, 128, 187); "&gt;Key to use Placemaker which they call and Application ID&lt;/a&gt;. In this downloadable example, I am using my key. If you use this code for anything, please get your own and follow the Yahoo rules on usage. Google do not require you to get a key, but limit your usage to a small number of queries daily.&lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;Yahoo was as good as or better than Google in dealing with ambiguity. &lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;The Yahoo response is clean and does not contain a bunch of unnecessary waffle.&lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;The Yahoo response is even simpler than the Bing one, and easier to deal with and decode. It is so similar to Bing that I was able to use the same modules to deal with both, so implementing Placeholder was about a 30 minute job, mainly to find out what the field names were. &lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;Yahoo provides less detail than both Google and Bing, but most of what you would need is there. It does not provide a 'cleaned up, full address' field though, which the other 2 do. On the other hand, this can easily be constructed from other fields.&lt;/li&gt;&lt;li id="" style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/8e410b/system/app/themes/notebook/bullet.gif); "&gt;Its confusing that Yahoo Placeholder is not actually Yahoo Maps. Yahoo Maps is actually OVI maps, which I haven't tried .. yet. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Go &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;here for the full article and downloadable examples of geoCoding straight from Excel.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-1968167287636582085?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/1968167287636582085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/09/geocoding-from-excel-yahoo-vs-bing-vs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1968167287636582085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1968167287636582085'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/09/geocoding-from-excel-yahoo-vs-bing-vs.html' title='Geocoding from Excel: Yahoo -vs- Bing -vs- Google'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7600924314511711191</id><published>2011-09-02T08:16:00.000-07:00</published><updated>2011-09-02T08:22:15.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cjobject'/><category scheme='http://www.blogger.com/atom/ns#' term='bing maps'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='vba'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='cdatset'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps versus Bing Maps</title><content type='html'>In a &lt;a href="http://excelramblings.blogspot.com/2011/08/getting-data-from-google-maps-to-excel.html"&gt;previous post&lt;/a&gt; I covered how you could use the Google Maps Api to complete and parse addresses for subsequent mapping directly from Excel. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the name of fairness, I implemented the same thing using Bing Maps.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Georgia, 'Times New Roman', serif; font-size: 13px; line-height: 21px; background-color: rgb(238, 232, 221); "&gt;&lt;div&gt;These restful apis work in pretty much the same way, Here are the main differences.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;&lt;span&gt; &lt;/span&gt;Microsoft require you to get a &lt;a href="http://www.bingmapsportal.com/" rel="nofollow" style="color: rgb(0, 128, 187); "&gt;Key to use Bing&lt;/a&gt;. In this downloadable example, I am using my key. If you use this code for anything, please get your own and follow the Microsoft rules on usage. Google do not require you to get a key, but limit your usage to a small number of queries daily.&lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;Bing is less able to deal with amibuity. In the set of 10 random addresses, Bing was unable to identify  half of them. Google got them all. &lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;There is a whole bunch of unnecessary stuff about copyright, and other junk that is returned from each query to Bing. What a waste of space and traffic. &lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;Bing provides less detail than Google, but the results are a lot easier to deal with. &lt;/li&gt;&lt;li style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;Bing is fussy about input - for example I needed to clean the input addresses to get rid of non printable characters and so on. Google doesn't care about that. &lt;/li&gt;&lt;li id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="list-style-position: outside; list-style-type: disc; list-style-image: url(http://www.gstatic.com/sites/p/33c7c6/system/app/themes/notebook/bullet.gif); "&gt;Bing Maps has a stupid name. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There you have it. You can download the example which has both versions implemented &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;here&lt;/a&gt; and judge for yourself.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All feedback and questions are &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;welcome at our forum&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7600924314511711191?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7600924314511711191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/09/google-maps-versus-bing-maps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7600924314511711191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7600924314511711191'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/09/google-maps-versus-bing-maps.html' title='Google Maps versus Bing Maps'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-403824494454135253</id><published>2011-08-31T03:55:00.000-07:00</published><updated>2011-08-31T04:07:31.707-07:00</updated><title type='text'>Retrieving data from Google Books</title><content type='html'>&lt;b&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;There is a simple API to retrieve google books data. There was an &lt;a href="http://groups.google.com/group/excel-ramblings/browse_thread/thread/66b8af5cb28e1687"&gt;interesting question on our forum&lt;/a&gt; yesterday asking about how to quickly populate a spreadsheet with book data based on the ISBN number for a school library project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using this API and the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/howtocdataset"&gt;cDataSet&lt;/a&gt; classes it was very straightforward to put together a quick solution to this. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See the &lt;a href="https://www.googleapis.com/books/v1/volumes?q=isbn:9780470044025"&gt;jSon data returned by this example&lt;/a&gt; to see the kind of information returned by the API. The idea is that given an ISBN number, simply naming additional columns the same as any fields known by the API will cause theses columns to be filled out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;download &lt;/a&gt;the example (isbnExample tab) in the cDataSets.xlsm package. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code is below&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Option Explicit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Const cISBNGoogleBooks = "https://www.googleapis.com/books/v1/volumes?q=isbn:"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Const cISBNColumnHeading = "isbn"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Public Sub isbnExample()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Dim dSet As cDataSet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    ' get ISBN book data&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    ' load to a dataset&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Set dSet = New cDataSet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    With dSet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        ' create a dataset from the isbn worksheet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        .populateData wholeSheet("isbn"), , "isbn", , , , True&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        If .Where Is Nothing Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            MsgBox ("No data to process")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            'check we have the isbn column present&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            If .HeadingRow.Validate(True, cISBNColumnHeading) Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                ' if there were any updates then commit them&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                If processISBN(dSet) &amp;gt; 0 Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                    .bigCommit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    End With&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Set dSet = Nothing&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;End Sub&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Private Function processISBN(ds As cDataSet) As Long&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Dim dSet As cDataSet, cb As cBrowser, dr As cDataRow&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Dim jo As cJobject, job As cJobject, n As Long&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Dim sWire As String&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    ' gets a book details by isbn number&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Set cb = New cBrowser&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Set jo = New cJobject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    n = 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    For Each dr In ds.Rows&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        With dr.Cell(cISBNColumnHeading)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            sWire = cb.httpGET(cISBNGoogleBooks &amp;amp; .toString)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            Set job = jo.deSerialize(sWire)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            If Not job.isValid Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                MsgBox ("Badly formed jSon returned for ISBN" &amp;amp; .toString &amp;amp; "-" _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                    &amp;amp; sWire)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            ElseIf Not job.ChildExists("error") Is Nothing Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                MsgBox ("Google books refuses to co-operate for ISBN " _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; .toString _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; "-" &amp;amp; job.Child("error").Serialize)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            ElseIf job.ChildExists("Items") Is Nothing _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                Or job.ChildExists("totalItems") Is Nothing Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                MsgBox ("Could find no data for ISBN " _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; .toString _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; "-" &amp;amp; job.Serialize)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            ElseIf job.Child("totalItems").Value &amp;lt;&amp;gt; 1 Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                MsgBox ("Multiple entries for " _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; .toString _&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        &amp;amp; "-" &amp;amp; job.Child("totalItems").Serialize)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                ' fill in this row&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                n = n + rowProcess(dr, job.Child("Items"))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        End With&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Next dr&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    processISBN = n&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;End Function&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;Private Function rowProcess(dr As cDataRow, job As cJobject) As Long&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Dim hc As cCell, n As Long, jo As cJobject, jom As cJobject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    n = 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    For Each hc In dr.Parent.Headings&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        ' any headings that are present in the dataset&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        ' and also in the returned json get populated&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        With hc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            If .toString &amp;lt;&amp;gt; cISBNColumnHeading Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                Set jo = job.find(.toString)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                If Not jo Is Nothing Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                    With dr.Cell(.Column)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        ' if multiple then include the array separated by commas&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        If jo.isArrayRoot Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                            .Value = vbNullString&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                            If jo.hasChildren Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                For Each jom In jo.Children&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                    If .toString &amp;lt;&amp;gt; vbNullString Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                        .Value = .Value &amp;amp; ","&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                    .Value = .Value &amp;amp; jom.toString&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                                Next jom&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                            End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                            .Value = jo.Value&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                        End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                    End With&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                    n = n + 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;                End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;            End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;        End With&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    Next hc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;    rowProcess = n&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;End Function&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-403824494454135253?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/403824494454135253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/08/retrieving-data-from-google-books.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/403824494454135253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/403824494454135253'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/08/retrieving-data-from-google-books.html' title='Retrieving data from Google Books'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5212659125484142605</id><published>2011-08-23T02:31:00.001-07:00</published><updated>2011-08-23T02:37:31.987-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='objects'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='cdataset'/><category scheme='http://www.blogger.com/atom/ns#' term='vba'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>How to use cDataSet</title><content type='html'>&lt;div&gt;Excel Data Manipulation Classes&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I notice from Google Analytics the the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes"&gt;cDataSet &lt;/a&gt; pages are by far the most popular on the site. These classes are used throughout all the projects on the &lt;a href="http://ramblings.mcpher.com/"&gt;site&lt;/a&gt;, and are also the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;most popular download&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to provide a quickstart, I've created a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/howtocdataset"&gt;summary&lt;/a&gt; of some of the capabilities of these objects, and how to use them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please use our &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;forum &lt;/a&gt;to ask questions, provide feedback or generally contribute to the discussion. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5212659125484142605?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5212659125484142605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/08/how-to-use-cdataset.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5212659125484142605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5212659125484142605'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/08/how-to-use-cdataset.html' title='How to use cDataSet'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2251905819807368809</id><published>2011-08-15T20:47:00.000-07:00</published><updated>2011-08-15T20:57:18.302-07:00</updated><title type='text'>Getting data from Google Maps to Excel</title><content type='html'>&lt;b&gt;Mapping visualization layers from Excel&lt;/b&gt;&lt;div&gt;The Google Maps API is a wonderful thing, allowing you to convert an unstructured and incomplete address and get back a whole bunch of structured and mapping data. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Google is clear that it is only to be used for addresses to be placed on a map (not to be used to 'clean' a list of addresses for example), and in fact there is quota on your use to make sure that you do not use it for this purpose. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However this new project is about mapping summary and transaction data on google maps, so I need to use the Maps API to summarize at country, state and other levels. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Downloadable example&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The first phase in this &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/getmaps"&gt;can be seen here&lt;/a&gt;, with a downloadable example showing how to interact and decode the response from the Google Maps API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2251905819807368809?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2251905819807368809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/08/getting-data-from-google-maps-to-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2251905819807368809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2251905819807368809'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/08/getting-data-from-google-maps-to-excel.html' title='Getting data from Google Maps to Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-6375704669973663267</id><published>2011-08-02T03:04:00.001-07:00</published><updated>2011-08-02T03:17:27.932-07:00</updated><title type='text'>Getting Started Series</title><content type='html'>Looking at Google Analytics Data for &lt;a href="http://ramblings.mcpher.com"&gt;my site&lt;/a&gt;, I notice that there are 2 distinct populations. Those that look and read through a project article (5-10 minutes) and those that stay a few seconds on each page they visit. There doesn't seem to be much of a 'middle ground' - meaning those that just spend a minute or two. This is telling me that a large number of visitors are looking for something quickly but are not finding it. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The original purpose of the site was to 'record' some of the projects I have been working on as they were going along, and to document the problems and solutions as they came along.  However, Im not catering for the majority of the increasing number of visitors, since I'm guessing they are just looking for a quick answer to a small problem. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Snippets&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I've decided to create a section of the site that is devoted to short snippets - quick answers to common problems - to cater for these casual visitors, and hope they will eventually stay a little longer to take a look at some of the more substantial topics covered. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The snippets will be initially a '&lt;a href="http://ramblings.mcpher.com/Home/excelquirks/snippets"&gt;Getting Started Series&lt;/a&gt;' which I've kicked off today, but later I'll move to 'Difficult Snippets', for those harder to find solutions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I generate content for these new areas I'll be keeping an eye on the effect on the Analytics and report back here. If you are looking for any particular topic to get priority then feel free to &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;post your request or comments on the forum&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-6375704669973663267?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/6375704669973663267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/08/getting-started-series.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6375704669973663267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6375704669973663267'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/08/getting-started-series.html' title='Getting Started Series'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-9020166991642274563</id><published>2011-08-01T06:03:00.000-07:00</published><updated>2011-08-01T06:18:58.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dynamic forms'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON serializer'/><category scheme='http://www.blogger.com/atom/ns#' term='vba'/><title type='text'>Dynamic forms and jSon</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-Wii1VIjj3jc/Tjam66cyK9I/AAAAAAAAADY/OuFbN2VCPu0/s1600/excelTestData170.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 186px; height: 200px;" src="http://2.bp.blogspot.com/-Wii1VIjj3jc/Tjam66cyK9I/AAAAAAAAADY/OuFbN2VCPu0/s200/excelTestData170.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5635875514753362898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-OC80IaaD0iA/TjamblPoBVI/AAAAAAAAADQ/fNMEz8BRv_Y/s1600/excelTestData168.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 89px;" src="http://3.bp.blogspot.com/-OC80IaaD0iA/TjamblPoBVI/AAAAAAAAADQ/fNMEz8BRv_Y/s200/excelTestData168.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5635874976485082450" /&gt;&lt;/a&gt;&lt;br /&gt;Following previous developments on &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/recursionlink/hiding-data-in-excel-objects"&gt;hiding data in excel objects&lt;/a&gt;, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/json/excel-json-conversion"&gt;Excel jSon conversion&lt;/a&gt; and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/dynamic-forms"&gt;dynamic forms&lt;/a&gt; I figured it was time to combine all these threads, and have implemented all that as an &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/jsondynamic"&gt;integrated solution&lt;/a&gt; as part of &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/recursionlink/roadmap-generation"&gt;the roadmap project&lt;/a&gt; .&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;b&gt;Embedding traceability&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Having generated a roadmap consisting of Excel shapes from simple data as above, I wondered how to make the shapes 'clickable' - meaning that you could click on a shape and bring up a form that could be edited, make changes to the form and write the changed data back to the original data cell. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;As usual there was plenty of Excel and VBA oddness to overcome, but you can read about and &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/jsondynamic"&gt;download the finished product from here&lt;/a&gt; and provide feedback or &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;ask questions here.&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Bruce&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-9020166991642274563?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/9020166991642274563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/08/dynamic-forms-and-json.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9020166991642274563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9020166991642274563'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/08/dynamic-forms-and-json.html' title='Dynamic forms and jSon'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Wii1VIjj3jc/Tjam66cyK9I/AAAAAAAAADY/OuFbN2VCPu0/s72-c/excelTestData170.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-6819863157252694865</id><published>2011-07-22T13:34:00.001-07:00</published><updated>2011-07-22T14:02:01.117-07:00</updated><title type='text'>Creating a Date Scale in Excel</title><content type='html'>Sometimes you have a range of dates and you need to come up with a scale that makes sense for the dates you are trying to represent in a timeline. For example if your dates range across a year or so, you may want to break the scale into months, 2 or 3 years, quarters would be better and perhaps weeks would be best if the scale is a few months. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I came across this problem when working on a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/recursionlink/roadmap-generation"&gt;roadmap generator for Excel&lt;/a&gt;, and later with a port to &lt;a href="http://sites.google.com/a/mcpher.com/pepada/tools"&gt;javascript&lt;/a&gt; to embed it in a Google Gadget. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you have decided on a scale, you also need to figure out how to line up the scale at the end of the month, quarter or whatever you have chosen. Below is some useful VBA code to do all that, or you can refer to the&lt;a href="http://sites.google.com/a/mcpher.com/pepada/tools/roadmapper"&gt; javascript version here.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Calculating the end of the 'period'&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Here is a function that will return various pieces of information a range such as the effective start date, effective finish date, number of ticks and so on given a start date and a finish date. You may find the calculations for end of quarter etc helpful, since they took me a little while to get right.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Private Function limitofScale(scaleType As String, sd As Date, fd As Date, edge As edgeTick) As Variant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        Dim dLastDayOfFinishScale As Date, dFirstDayOfStartScale As Variant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        Dim ss As String, sf As String, ticks As Single&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        Select Case Trim(LCase(scaleType))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case "weeks"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dFirstDayOfStartScale = sd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dLastDayOfFinishScale = fd + 7 - (Weekday(fd) Mod 7)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ss = Format(sd, "dd-mmm-yy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                sf = Format(fd, "dd-mmm-yy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ticks = (dLastDayOfFinishScale - dFirstDayOfStartScale + 1) / 7&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case "months"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ' 1st day of start month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dFirstDayOfStartScale = DateSerial(Year(sd), Month(sd), 1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ' last of finish month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dLastDayOfFinishScale = DateSerial(Year(fd), Month(fd) + 1, 1) - 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ss = Format(sd, "mmm-yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                sf = Format(fd, "mmm-yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ticks = (dLastDayOfFinishScale - dFirstDayOfStartScale + 1) / 30&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case "quarters"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dFirstDayOfStartScale = DateSerial(Year(sd), Month(sd) - ((Month(sd) - 1) Mod 3), 1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dLastDayOfFinishScale = DateSerial(Year(fd), Month(fd) + 3 - ((Month(fd) - 1) Mod 3), 1) - 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ss = "Q" &amp;amp; CStr(1 + Int((Month(sd) - 1) / 3)) &amp;amp; Format(sd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                sf = "Q" &amp;amp; CStr(1 + Int((Month(fd) - 1) / 3)) &amp;amp; Format(fd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ticks = (dLastDayOfFinishScale - dFirstDayOfStartScale + 1) / 90&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case "halfyears"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dFirstDayOfStartScale = DateSerial(Year(sd), Month(sd) - ((Month(sd) - 1) Mod 6), 1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dLastDayOfFinishScale = DateSerial(Year(fd), Month(fd) + 6 - ((Month(fd) - 1) Mod 6), 1) - 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ss = "H" &amp;amp; CStr(1 + Int((Month(sd) - 1) / 6)) &amp;amp; Format(sd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                sf = "H" &amp;amp; CStr(1 + Int((Month(fd) - 1) / 6)) &amp;amp; Format(fd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ticks = (dLastDayOfFinishScale - dFirstDayOfStartScale + 1) / 183&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case "years"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dFirstDayOfStartScale = DateSerial(Year(sd), 1, 1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                dLastDayOfFinishScale = DateSerial(Year(fd) + 1, 1, 1) - 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ss = Format(sd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                sf = Format(fd, "yyyy")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                ticks = (dLastDayOfFinishScale - dFirstDayOfStartScale + 1) / 365&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                MsgBox "Invalid scale choice  " &amp;amp; scaleType&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                Exit Function&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        End Select&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        Select Case edge&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case etStart&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                limitofScale = dFirstDayOfStartScale&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case etFinish&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                limitofScale = dLastDayOfFinishScale&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case etFinishString&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                limitofScale = sf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case etStartString&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                limitofScale = ss&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case etEstimatedTicks&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                limitofScale = ticks&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;            Case Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;                Debug.Assert False&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        End Select&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;End Function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Finding the most appropriate scale&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In this case we are looking for the 'best' scale to use given a  start and finish date and a maximum number of axis ticks.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Private Function AutoScale() As String&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    Dim ticks As Single, tickDiff As Single&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    Dim idealticks  As Single, sBest As String, s As String&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    Debug.Assert pscType = sctframe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    idealticks = maxticks * 0.5&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    tickDiff = maxticks + 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    s = "weeks"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    ticks = limitofScale(s, Activate, deActivate, etEstimatedTicks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If Abs(idealticks - ticks) &amp;lt; tickDiff Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        sBest = s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        tickDiff = Abs(idealticks - ticks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    s = "months"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    ticks = limitofScale(s, Activate, deActivate, etEstimatedTicks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If Abs(idealticks - ticks) &amp;lt; tickDiff Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        sBest = s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        tickDiff = Abs(idealticks - ticks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    s = "quarters"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    ticks = limitofScale(s, Activate, deActivate, etEstimatedTicks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If Abs(idealticks - ticks) &amp;lt; tickDiff Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        sBest = s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        tickDiff = Abs(idealticks - ticks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    s = "halfyears"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    ticks = limitofScale(s, Activate, deActivate, etEstimatedTicks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If Abs(idealticks - ticks) &amp;lt; tickDiff Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        sBest = s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        tickDiff = Abs(idealticks - ticks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    s = "years"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    ticks = limitofScale(s, Activate, deActivate, etEstimatedTicks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If Abs(idealticks - ticks) &amp;lt; tickDiff Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        sBest = s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        tickDiff = Abs(idealticks - ticks)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    If tickDiff &amp;gt; maxticks Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;        MsgBox "Couldnt find a feasible automatic scale to use for roadmap " &amp;amp; ID&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;    AutoScale = sBest&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;End Function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-6819863157252694865?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/6819863157252694865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/07/creating-date-scale-in-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6819863157252694865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/6819863157252694865'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/07/creating-date-scale-in-excel.html' title='Creating a Date Scale in Excel'/><author><name>Bruce Mcpherson</name><uri>https://profiles.google.com/112066118406610145134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5130847626472899104</id><published>2011-07-13T06:53:00.000-07:00</published><updated>2011-07-13T06:53:04.334-07:00</updated><title type='text'>Getting data from Google Docs to Excel</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;In various posts I have covered ways to get data in and out of Excel and other PC based systems. The latest capability I have looked at is being able to get data live into Excel from Google Docs.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Google uses the 'Wire Protocol' to exchange data between gadgets, Google Docs etc. &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/get-data-from-google-docs"&gt;Read here for an implementation of Wire Protocol for Excel&lt;/a&gt; to get data from Google Docs into Excel.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;As usual you can download all you need to implement this capability in your own workbooks.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Bruce&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5130847626472899104?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5130847626472899104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/07/getting-data-from-google-docs-to-excel.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5130847626472899104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5130847626472899104'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/07/getting-data-from-google-docs-to-excel.html' title='Getting data from Google Docs to Excel'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4291015243884369021</id><published>2011-06-14T14:07:00.000-07:00</published><updated>2011-06-14T14:07:54.363-07:00</updated><title type='text'>Creating JSON using data abstraction classes</title><content type='html'>Yesterday I posted an update to the &lt;a href="http://excelramblings.blogspot.com/2011/06/abstracting-excel-data.html"&gt;data abstraction classes for Excel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I realized that there is also a method to convert that data into a JSON string. The following code would convert a worksheet into JSON, and can be &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;downloaded here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="default prettyprint" id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"&gt;&lt;code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Option&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Explicit&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Public&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Sub&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; mainExample&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;()&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Dim&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; dSet &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;As&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; cDataSet&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Set&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; dSet &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;=&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;New&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; cDataSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;With&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; dSet&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;populateData &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Range&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"data!$a$1"&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;),&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;True&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;If&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Where&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Is&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Nothing&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Then&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;MsgBox&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"No data to process"&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Else&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;MsgBox&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;jSonObject&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;End&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;If&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;End&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;With&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;End&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Sub&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4291015243884369021?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4291015243884369021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/06/creating-json-using-data-abstraction.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4291015243884369021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4291015243884369021'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/06/creating-json-using-data-abstraction.html' title='Creating JSON using data abstraction classes'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5781926054518429618</id><published>2011-06-13T18:21:00.000-07:00</published><updated>2011-06-13T18:21:50.726-07:00</updated><title type='text'>Abstracting Excel Data</title><content type='html'>&lt;b&gt;Classes for Excel Data Abstraction&lt;/b&gt;&lt;br /&gt;In a number of articles and topics on &lt;a href="http://www.mcpher.com/"&gt;my website&lt;/a&gt;&amp;nbsp;i have referred to a collection of classes that I generally use to abstract Excel physical location from the data contents. I finally got round to writing these up, and posted the details on &lt;a href="http://www.eggheadcafe.com/tutorials/aspnet/556cb205-0e58-4a88-866b-90b7d3d94a25/a-collection-of-classes-to-abstract-excel-data.aspx"&gt;Egghead Cafe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As usual the &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/downloadlist"&gt;associated downloads are available here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5781926054518429618?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5781926054518429618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/06/abstracting-excel-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5781926054518429618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5781926054518429618'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/06/abstracting-excel-data.html' title='Abstracting Excel Data'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-627007247789839436</id><published>2011-06-04T03:01:00.000-07:00</published><updated>2011-06-04T03:01:55.881-07:00</updated><title type='text'>A formula to show diminishing returns</title><content type='html'>&lt;b&gt;Diminishing returns for more effort&lt;/b&gt;&lt;br /&gt;You will be very familiar with the law of diminishing returns, where you get a lot of payback for your initial efforts (sometimes called 'low hanging fruit'), then you have to work harder for smaller rewards. An example for IT professionals might be a server or application consolidation project. Hacking and Stacking produces good early $ savings, but as you go through the project, you need to work hard to get less reward.- then the '80/20' rule comes in to play.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Expressing as a formula&lt;/b&gt;&lt;br /&gt;In this kind of scenario its hard to come up with a 'finger in the air' estimate of what the savings could be when embarking on such a project, since the savings are not going to be linear. I was looking for a simple formula that could be generally applied to such projects &amp;nbsp;and came up with this.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;=( SIGN(A2) * $E$1 * (SQRT(2 * (SIGN(A2) * A2 / $E$1) + 1) - 1) &amp;nbsp;)&lt;/blockquote&gt;where A2 is the value to be tweaked, and E1 is the 'aggressivity' of the diminuation of the result. For a VB version of this and some examples and downloads, &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/diminishing-returns"&gt;please take a look at this article.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-627007247789839436?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/627007247789839436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/06/formula-to-show-diminishing-returns.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/627007247789839436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/627007247789839436'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/06/formula-to-show-diminishing-returns.html' title='A formula to show diminishing returns'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7717465356555521950</id><published>2011-05-20T04:26:00.000-07:00</published><updated>2011-05-20T04:26:00.103-07:00</updated><title type='text'>Populating Excel with data matched from Outlook Global Address List</title><content type='html'>I came across a problem today, where I wanted to create a Google Intensity Map based on a selection of people in my Outlook Global Address List. I thought it would be kind of easy, since I already have a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/google-visualization/general-purpose"&gt;tool to take Excel data and make the actual visualization&lt;/a&gt;. But I quickly got bogged down at 'get data from the GAL' part. I guess I could have gone to Access and used the outlook connector to do a query and so on, but I wanted something right there, in Excel so I could create an integrated solution.&lt;br /&gt;&lt;br /&gt;Looking around at the Outlook object model, it became pretty clear that's is messed up, with fields coming from all kinds of places, and property schemas in all kinds of formats, with no clear and definitive reference documentation.&lt;br /&gt;&lt;br /&gt;I decided to put a layer of abstraction on all that, so that future outlook type things could go a bit smoother. &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/data-from-outlook"&gt;Here is an example&lt;/a&gt; with some custom classes that look up and populate Excel tables from matched data in an Outlook Address List.&lt;br /&gt;&lt;br /&gt;Now i need to move on to integrating this into a &lt;a href="http://ramblings.mcpher.com/Home/excelquirks/google-visualization/general-purpose"&gt;google visualization&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bruce&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7717465356555521950?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7717465356555521950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/05/populating-excel-with-data-matched-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7717465356555521950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7717465356555521950'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/05/populating-excel-with-data-matched-from.html' title='Populating Excel with data matched from Outlook Global Address List'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-4875640831513983543</id><published>2011-04-18T08:59:00.000-07:00</published><updated>2011-04-18T08:59:22.708-07:00</updated><title type='text'>So how about using an IMG tag to track Analytics</title><content type='html'>&lt;b&gt;Analytics with no Javascript anyone?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;My last post covered &lt;a href="http://excelramblings.blogspot.com/2011/04/generic-google-analytics-gadget-to.html"&gt;how to inject Google Analytics&lt;/a&gt; into pages where it was not really possible to introduce javascript. by using a gadget. But what about the case where you cant insert a gadget, or you want some more&amp;nbsp;granularity? It occurred to me that a creatively constructed IMG tag with some parameters (most web site creators allow you to link to images at least) defining what to track could probably go off and do the necessary tracking without the calling web page knowing it was doing anything other than serving an image.&lt;br /&gt;&lt;br /&gt;Watch this space for a solution.&lt;br /&gt;&lt;br /&gt;Bruce&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-4875640831513983543?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/4875640831513983543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/04/so-how-about-using-img-tag-to-track.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4875640831513983543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/4875640831513983543'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/04/so-how-about-using-img-tag-to-track.html' title='So how about using an IMG tag to track Analytics'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2200488582028029648</id><published>2011-04-18T06:54:00.000-07:00</published><updated>2011-04-18T06:54:36.992-07:00</updated><title type='text'>A generic Google Analytics gadget to track any page</title><content type='html'>&lt;b&gt;A generic analytics gadget.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Following on from my &lt;a href="http://excelramblings.blogspot.com/2011/04/adding-google-analytics-to-your-custom.html"&gt;last post on adding Google Analytics Codes to track usage of your gadget&lt;/a&gt;, it occurred to me that you could create a gadget whose sole purpose in life was to track usage of a particular page. This could be useful in cases where you dont have access to the source code, or when you want to easily track usage of a Google Document for example.&lt;br /&gt;&lt;br /&gt;The solution turned out to be very simple, with a small adaptation from the information the &lt;a href="http://excelramblings.blogspot.com/2011/04/adding-google-analytics-to-your-custom.html"&gt;previous post&lt;/a&gt;. I have added it to my iGoogle page, so i can now track my own usage and visits- I travel a lot so I can even track my own travels like this through Google Analytics.&lt;br /&gt;&lt;br /&gt;Step by step &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/google-gadgets/generic-gadget-analytics"&gt;instructions are here&amp;nbsp;&lt;/a&gt;&amp;nbsp;along with the code and you can include the gadget from here&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 14px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 14px; line-height: 16px;"&gt;http://pepadagvroadmapper.googlecode.com/svn/trunk/analytics/genericAnalytics.xml&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 14px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 14px; line-height: 16px;"&gt;Bruce&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2200488582028029648?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2200488582028029648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/04/generic-google-analytics-gadget-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2200488582028029648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2200488582028029648'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/04/generic-google-analytics-gadget-to.html' title='A generic Google Analytics gadget to track any page'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2326313904999427259</id><published>2011-04-14T07:52:00.000-07:00</published><updated>2011-04-14T07:56:00.203-07:00</updated><title type='text'>Adding google analytics to your custom gadget</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;b&gt;What you need&lt;/b&gt;&lt;/div&gt;It took me a while to find out how to do this, but it's really simple.Implementing this means that you can track usage of your gadget, whether embedded in a web page, or in &amp;nbsp;a &lt;a href="http://docs.google.com/"&gt;Google doc&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.google.com/analytics/"&gt;A Google analytics account&lt;/a&gt;&lt;/li&gt;&lt;li&gt;the XML source of the gadet, &lt;a href="http://code.google.com/p/pepadagvroadmapper/source/browse/trunk/rel/pepadagvroadmapper.xml"&gt;for example&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;What you need to do&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Add a new domain to your google analytics account. Just make one up - in my case I used roadmapper.com. It doesn't need to exist, and you dont need to own it. It just needs to look like a real domain.&lt;/li&gt;&lt;li&gt;Remember the &amp;nbsp;UA-xxxxx-n code that Analytics generates for that domain.&lt;/li&gt;&lt;li&gt;Think of an imaginary page address - this is what views will get recorded against in your analytics report. Again - it doesn't need to exist.&lt;/li&gt;&lt;li&gt;Inject this into your &lt;moduleprefs&gt; in your XML code&lt;/moduleprefs&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;var ga = new _IG_GA('UA-10017268-2');&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ga.reportPageview('/view/pepadaroadmap')&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;moduleprefs&gt;And this in your XML &lt;moduleprefs&gt;&lt;/moduleprefs&gt;&lt;/moduleprefs&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;require feature="setprefs"&gt;&amp;nbsp;&lt;/require&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Require feature="setprefs" /&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Require feature="com.google.gadgets.analytics" /&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;require feature="com.google.gadgets.analytics"&gt;&amp;nbsp;&lt;/require&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;You are good to go. Shortly afterwards analytics will start reporting on accesses to you gadget, under the domain and page you settled on.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://www.pepada.com/tools"&gt;roadmapper gadget&lt;/a&gt; &amp;nbsp;for details&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2326313904999427259?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2326313904999427259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/04/adding-google-analytics-to-your-custom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2326313904999427259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2326313904999427259'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/04/adding-google-analytics-to-your-custom.html' title='Adding google analytics to your custom gadget'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-9078365829247646313</id><published>2011-04-14T07:17:00.000-07:00</published><updated>2011-04-14T07:17:56.257-07:00</updated><title type='text'>Creating Excel Ramblings group on Google Groups</title><content type='html'>&lt;b&gt;Google Groups&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Since I get a lot of correspondence from people who have &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/downlable-items"&gt;downloaded stuff&lt;/a&gt;, I thought it might be useful to &lt;a href="http://groups.google.com/group/excel-ramblings"&gt;create a group&lt;/a&gt;&amp;nbsp;&amp;nbsp;with this tagline.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;'This group is for those with Excel or VBA tips, advice, general&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;conversation or questions. In particular we are very keen to hear&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;about crossing over from Excel to Google Docs, Google visualizations&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;and otherwise internet enabling your excel data.'&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;Lets see how that goes. Creating the group was very straightforward, but it's kind of disappointing that it doesn't seem possible to introduce google analytics to track usage. If anyone knows how to, please let me know.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;Bruce&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-9078365829247646313?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/9078365829247646313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/04/creating-excel-ramblings-group-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9078365829247646313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/9078365829247646313'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/04/creating-excel-ramblings-group-on.html' title='Creating Excel Ramblings group on Google Groups'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5073704468491812978</id><published>2011-04-08T06:41:00.000-07:00</published><updated>2011-04-08T06:41:33.346-07:00</updated><title type='text'>Roadmapper now hosted on google Code</title><content type='html'>&lt;div&gt;Using google code to host projects&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I moved the gadget and associated code to googlecode.com hoping to host it there. If you have never done this, it is somewhat complex. It can be found &lt;a href="http://code.google.com/p/pepadagvroadmapper/"&gt;here.&lt;/a&gt; Some of the issues I came across were&lt;div&gt;&lt;ul&gt;&lt;li&gt;Projects hosted there are expected to be open source. The most difficult task was selecting which open source license to use. In the end I decided to use Mozilla.&lt;/li&gt;&lt;li&gt;I hadn't been using subversion. Google code expects either subversion or mercurial for source code management. After a false start with Mercurial (which I cant now remove from Eclipse, I settled on subversion. That works ok - but was not easy to set up, mainly due to my greenness.&lt;/li&gt;&lt;li&gt;I'm using tortoisesvn to manage the source code loading to the google repository. That was a nice find to avoid using the command line subversion approach.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Once all was setup, I hit a problem - google code serves files as plain text MIME. That meant that my style sheets were not being treated as text/css and therefore were not being executed. Luckily I found &lt;a href="http://www.intechgrity.com/freely-host-css-js-other-static-files/"&gt;this write up&lt;/a&gt; on how to change that behavior using turtle SVN.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Bruce&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5073704468491812978?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5073704468491812978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/04/roadmapper-now-hosted-on-google-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5073704468491812978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5073704468491812978'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/04/roadmapper-now-hosted-on-google-code.html' title='Roadmapper now hosted on google Code'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-1712364668974397584</id><published>2011-03-21T13:48:00.000-07:00</published><updated>2011-03-21T13:48:14.150-07:00</updated><title type='text'>Implemented Roadmapper as a Google Gadget</title><content type='html'>Roadmapper update&lt;br /&gt;&lt;br /&gt;I finally got round to implementing the roadmapper as a google visualization gadget. All the source code and gadget package is available &lt;a href="http://www.pepada.com/tools/roadmapper"&gt;here&lt;/a&gt; along with the write up, so I wont repeat it here.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bruce&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-1712364668974397584?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/1712364668974397584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/03/implemented-roadmapper-as-google-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1712364668974397584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/1712364668974397584'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/03/implemented-roadmapper-as-google-gadget.html' title='Implemented Roadmapper as a Google Gadget'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8394373749850098297</id><published>2011-03-16T08:29:00.000-07:00</published><updated>2011-03-16T08:29:10.719-07:00</updated><title type='text'>Implementing a roadmapper as Google Visualization gadget</title><content type='html'>&lt;b&gt;Google Gadgets&lt;/b&gt;&lt;br /&gt;This is the standard way to do charts in Google Docs, as well as being easily embedabble in web pages. In a &lt;a href="http://excelramblings.blogspot.com/2011/03/migrating-to-google-docs.html"&gt;previous post&amp;nbsp;&lt;/a&gt;&amp;nbsp;I started thinking about the migration path to Google Docs from Excel, and wondered if the scripting capability in Google Docs would give me what I need. Looking a bit more into that, I realized that gadgets give the possibility of becoming platform independent (if you consider javascript &amp;amp; html &amp;amp; using the google jsapi to be platform independent), especially since I have a&lt;a href="http://sites.mcpher.com/share/Home/excelquirks/google-visualization"&gt; tool to format Excel data&lt;/a&gt; as if it came from Google Docs. This means that the Google Docs scripting can be largely avoided, and we can stick to regular javascript and web presentation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementing Excel Roadmapper as gadget&lt;/b&gt;&lt;br /&gt;To see how this would work out, I took a &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/roadmap-generation"&gt;roadmapper tool written in VB&lt;/a&gt; and started to port it to Javascript, with a view to making a gadget out of it. I decided to rely as much as possible on CSS for formatting and layout, as opposed to porting the parameter driven approach from Excel. It has gone fairly smoothly so far (although I haven't ported the complete functionality), with most time being spent on messing around with style sheets. The results can be &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/downlable-items/testgvrm.html?attredirects=0&amp;amp;d=1"&gt;tried out here&lt;/a&gt;, and the source &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/downlable-items"&gt;downloaded from here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The next step is to wrap that up in a gadget.Let's see how that works out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8394373749850098297?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8394373749850098297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/03/implementing-roadmapper-as-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8394373749850098297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8394373749850098297'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/03/implementing-roadmapper-as-google.html' title='Implementing a roadmapper as Google Visualization gadget'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-2789942999657370211</id><published>2011-03-05T03:43:00.000-08:00</published><updated>2011-03-05T03:43:28.816-08:00</updated><title type='text'>Migrating to Google Docs</title><content type='html'>Ive been using Google Docs as well as Excel for a while now, and certainly Excel is more comfortable a user experience. However it's clear that Google Docs offer a great opportunity to offer services and tools that are not practical to offer in a locked in Excel environment. The Microsoft equivalent of Google Docs at the moment seems like an 'also ran'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scripting on Google Docs&lt;/b&gt;&lt;br /&gt;Now that Google Docs has scripting, suddenly this becomes a much more interesting platform, especially since the scripting language is essentially JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using Google Gadgets&lt;/b&gt;&lt;br /&gt;The ease of using google gadgets in&amp;nbsp;Google Docs, as well as using them in regular web sites with data sourced from Google Docs makes this combination pretty unbeatable. The issue here really is how to leverage existing Excel capabilities to make the transition either smooth or even&amp;nbsp;unnecessary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Google Visualizations&lt;/b&gt;&lt;br /&gt;I am a great fan of these, and it is also rather straightforward to make your own visualizations, which of course can become Google Gadgets and therefore accessible within Google Docs, or on the web. Some of my work on integrating &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/google-visualization"&gt;Google Motion Charts and other visualizations&lt;/a&gt;&amp;nbsp;to Excel demonstrate how to easily create them on the fly from Excel data. Clearly, focusing on capabilities that can be built into visualizations gives a straight path that can merge Google Docs, Web presentation and original Excel data and capabilities.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Project thoughts&lt;/b&gt;&lt;br /&gt;I have an Architecture Model of a typical enterprise that takes a look at a stated IT strategy and compares it to program portfolio, roadmaps and application landscape to measure and recommend changes to priorities. Right now the majority of this tool is in Excel, and I have been considering redoing it to make it self tailorable for any enterprise. It seems to me this would be a good opportunity to redo the visualization and chart analysis piece of this so I could abstract it from the data, which could come from either Excel or GoogleDocs.&lt;br /&gt;&lt;br /&gt;More on this later.&lt;br /&gt;&lt;br /&gt;Bruce&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-2789942999657370211?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/2789942999657370211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/03/migrating-to-google-docs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2789942999657370211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/2789942999657370211'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/03/migrating-to-google-docs.html' title='Migrating to Google Docs'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-3189442102962508612</id><published>2011-02-22T07:57:00.000-08:00</published><updated>2011-02-22T07:59:06.872-08:00</updated><title type='text'>Using Cookies from inside Excel</title><content type='html'>I've been looking at how to use cookies to pass data between excel sessions and of course outside Excel. Having implemented a method of hiding data inside cells and Excel shapes, I figured this would be a nice next step.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a few missteps, I eventually got it to work. See the cookies tab of&amp;nbsp;&lt;a href="http://sites.mcpher.com/share/Home/excelquirks/downlable-items"&gt;Hiding data in Excel Objects and JSON&lt;/a&gt; serialization&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Essentially, these are the steps in VBA&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Generate an .html file that can read or write cookies, and generate the data required to be stored as part of the javascript.&lt;/li&gt;&lt;li&gt;Create a cookie&amp;nbsp;into which the contents of the cookie are populated by the generated javascript&lt;/li&gt;&lt;li&gt;Read the appropriate element of the document to find the contents of the cookie.&lt;/li&gt;&lt;/ol&gt;In the cookie I store JSON formatted data. This means that it carries its own definition and can be used directly by other Javascripts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hit a few snags along the way that were related to being able to run local scripts with active content, but i came across something called 'mark of the web', which seems to trick the browsers I've tried into being able to run it. I'll be writing this up on web site shortly so you can read all about it there&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-3189442102962508612?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/3189442102962508612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/02/using-cookies-from-inside-excel_22.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3189442102962508612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/3189442102962508612'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/02/using-cookies-from-inside-excel_22.html' title='Using Cookies from inside Excel'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-7927666410880343874</id><published>2011-02-11T03:38:00.000-08:00</published><updated>2011-02-11T03:38:53.482-08:00</updated><title type='text'>Adding Callouts to Roadmaps</title><content type='html'>&lt;h4&gt;Roadmap Project Recap&lt;/h4&gt;Some time ago I started to play around with a method to make &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/roadmap-generation"&gt;Roadmaps from Excel data&lt;/a&gt;. Since working through the development of it &amp;nbsp;&lt;a href="http://sites.mcpher.com/share"&gt;on my Excel Ramblings site&lt;/a&gt;&amp;nbsp;and in &lt;a href="http://www.eggheadcafe.com/tutorials/aspnet/3310004f-e1ae-45a7-9bea-7b2b970d1230/excel-generate-high-quality-roadmaps.aspx"&gt;this article on Egghead Cafe&lt;/a&gt;, I had a fair amount of feedback on things people would like to see added.&lt;br /&gt;&lt;h4&gt;Adding Callouts&lt;/h4&gt;One of the key things was for additional comment space. To do that I've added a whole bunch of new parameters to control creation of and placement of parameters. The idea is that you can select a callout shape to be associated with the main roadmap shape. Various parameters affect the placement of this callout relative to the main shape and both shapes are plotted.&lt;br /&gt;&lt;br /&gt;Other callout positioning options are&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make the main shape itself a callout, set the callout shape to 'None' and fix the duration and start date so it appears where you want it to on the roadmap. Mess around with the gap and height to get the look and feel and positioning &amp;nbsp;you want.&lt;/li&gt;&lt;li&gt;&amp;nbsp;You could make the main shape 'None', and include an associated callout shape. Since you can assign a start date, duration, gap, height etc to any shape, including 'None', the associated callout would be positioned and sized as if 'None was to be plotted, but of course only the callout would be visible.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Please check it out and let me have your feedback on this blog, &lt;a href="mailto:excel@mcpher.com"&gt;or by email&lt;/a&gt;.&amp;nbsp;You can download the latest&amp;nbsp;&lt;a href="http://sites.mcpher.com/share/Home/excelquirks/downlable-items"&gt;RoadmapGenerator.xlsm from the downloads area&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-7927666410880343874?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/7927666410880343874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/02/adding-callouts-to-roadmaps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7927666410880343874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/7927666410880343874'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/02/adding-callouts-to-roadmaps.html' title='Adding Callouts to Roadmaps'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8904948032584071450</id><published>2011-02-08T01:58:00.000-08:00</published><updated>2011-02-08T01:58:22.837-08:00</updated><title type='text'>Using Cookies from inside Excel</title><content type='html'>&lt;h4&gt;Can we use cookies inside Excel&lt;/h4&gt;This is a follow on from my thoughts around using JSON both to&lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/hiding-data-in-excel-objects"&gt; store data inside Excel shapes and cells&lt;/a&gt;, and also to &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/google-visualization"&gt;pick up data from external sources&lt;/a&gt;. It occurred to me that perhaps I could use a webbrowser object to collect and store cookie data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's now on my &lt;a href="http://excelramblings.blogspot.com/2011/02/topics-under-consideration.html"&gt;list of things to figure out how to do&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8904948032584071450?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8904948032584071450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/02/using-cookies-from-inside-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8904948032584071450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8904948032584071450'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/02/using-cookies-from-inside-excel.html' title='Using Cookies from inside Excel'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-8612836507157504479</id><published>2011-02-07T16:15:00.000-08:00</published><updated>2011-02-07T16:15:20.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON serializer'/><category scheme='http://www.blogger.com/atom/ns#' term='Deserializer'/><title type='text'>JSON deserializer</title><content type='html'>&lt;h4&gt;Completing the JSON deserializer/serializer&lt;/h4&gt;I was missing being able to deal with arrays and could only deal with strings in the first version of this, but have finally figured out how to deal with this. By introducing a parent object for array members I was able to treat arrays the same way as a group of key value pairs. This means that a JSON string as follows&lt;br /&gt;&lt;blockquote&gt;{  "hiddendata": {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"lastaccess": {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"username": [&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"k47",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;],&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"startedat": "2/7/2011 11:55:13 PM",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"finishedat": "2/7/2011 11:46:55 PM"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "summary": {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "timeopen": "474474",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "countopen": "9"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;translates into a cJobject that looks like this&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;hiddendata &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;hiddendata.lastaccess &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;hiddendata.lastaccess.username &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;hiddendata.lastaccess.username._array &amp;nbsp; &amp;nbsp; &lt;br /&gt;hiddendata.lastaccess.username._array.1 &amp;nbsp; &amp;nbsp;fhk647&lt;br /&gt;hiddendata.lastaccess.username._array.2 &amp;nbsp; &amp;nbsp;99&lt;br /&gt;hiddendata.lastaccess.startedat &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2/7/2011 11:55:13 PM&lt;br /&gt;hiddendata.lastaccess.finishedat &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2/7/2011 11:46:55 PM&lt;br /&gt;hiddendata.summary &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;hiddendata.summary.timeopen &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;474474&lt;br /&gt;hiddendata.summary.countopen &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 9&lt;/blockquote&gt;&lt;br /&gt;and can be accessed in various ways such as the below&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;set cj = new cObject&lt;br /&gt;cj.deserialize(JSONstring)&lt;br /&gt;With cj.child("lastaccess")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("username._array").children(1).asString&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("username").child("_array").child("2").asLong&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("startedat").asDate&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("finishedat").Value&lt;br /&gt;end With&lt;br /&gt;With cj.child("summary")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("timeopen").value&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.child("countopen").value&lt;br /&gt;end With&lt;/blockquote&gt;I haven't bothered with date decoding for now. Next step is to test all this with a whole bunch of JSON examples&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-8612836507157504479?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/8612836507157504479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/02/json-deserializer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8612836507157504479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/8612836507157504479'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/02/json-deserializer.html' title='JSON deserializer'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7289528839575681860.post-5188921847575338839</id><published>2011-02-07T01:38:00.001-08:00</published><updated>2011-02-07T02:19:51.485-08:00</updated><title type='text'>Topics under consideration</title><content type='html'>&lt;h4&gt;What next&lt;/h4&gt;&lt;p&gt;Thinking about what to work on next for the &lt;a href="http://sites.mcpher.com/share/"&gt;Excel Ramblings&lt;/a&gt; site, I wondered how I could pull together the work on &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/hiding-data-in-excel-objects"&gt;JSON&lt;/a&gt; along with &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/google-visualization"&gt;google visualization serialization&lt;/a&gt; to open up access to web service capabilities that Excel really doesnt get to easily. Looking at an article by &lt;a href="http://http//www.eggheadcafe.com/tutorials/aspnet/e1431bb1-05be-4e4d-91dd-52e6d0aa6731/jquery-templates-and-the-topsy-otter-twitter-search-api.aspx"&gt;Pete Bromberg on eggheadcafe&lt;/a&gt;, it struck me that i could process responses like this and populate Excel Sheets with some structured data taken from sources like &lt;a href="http://code.google.com/p/otterapi/wiki/Resources"&gt;otter&lt;/a&gt;, or alternatively to stream data live from google docs into Excel - indeed reverse engineering google table data into Excel. This would just mean providing a form where the available fields in the feed can be selected for inclusion in the query, after which it's just a case of deserializing and formatting in Excel.&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Projects under construction/consideration&lt;/h4&gt;&lt;p&gt;These are the items I am working on are thinking about&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finish the &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/hiding-data-in-excel-objects"&gt;JSON deserialize&lt;/a&gt;r to handle arrays &amp;amp; data types other than just string. &lt;/li&gt;&lt;li&gt;Provide a means to import arbritary data, as defined by a JSON data feed into Excel&lt;/li&gt;&lt;li&gt;Import google docs data into Excel directly using a dataurl mechanism set up in google docs&lt;/li&gt;&lt;li&gt;Improve the &lt;a href="http://sites.mcpher.com/share/Home/excelquirks/recursionlink/roadmap-generation"&gt;roadmap project&lt;/a&gt; with callouts and clickable shape manipulation&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h4&gt;What Else&lt;/h4&gt;&lt;p&gt;Please let me have ideas for how these should develop at excel@mcpher.com &lt;br /&gt;&lt;/p&gt;&lt;p&gt;bruce&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7289528839575681860-5188921847575338839?l=excelramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://excelramblings.blogspot.com/feeds/5188921847575338839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://excelramblings.blogspot.com/2011/02/topics-under-consideration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5188921847575338839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7289528839575681860/posts/default/5188921847575338839'/><link rel='alternate' type='text/html' href='http://excelramblings.blogspot.com/2011/02/topics-under-consideration.html' title='Topics under consideration'/><author><name>Bruce</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
