I use the querying capability built in to Excel to import from SQL Server rather than push things to Excel:
xlApp = GetObject(, "Excel.Application")
xlQueryTable = xlApp.ActiveSheet.QueryTables.Add(Connection:=psConnectString, Destination:=xlApp.ActiveSheet.Range(psCurrentCell))
With xlQueryTable
.Sql = psExecString
.Refresh(BackgroundQuery:=False)
End With
The application is driving Excel to import, so the columns take on the datatype supplied by SQL Server rather than having to set each one excplicity.