<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBA: INSERT в xls через ADO]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=6799</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6799&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBA: INSERT в xls через ADO».]]></description>
		<lastBuildDate>Thu, 13 Dec 2012 07:00:23 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66929#p66929</link>
			<description><![CDATA[<p>Пример на vba:<br /></p><div class="codebox"><pre><code>Option Explicit

Sub main()
    Dim ServerName, dbName, user, pass, ConnectString
    ServerName = &quot;localhost&quot;
    dbName = &quot;local_track&quot;
    user = &quot;user&quot;
    pass = &quot;password&quot;
    
    Dim oConn, oRecordset
    Set oConn = CreateObject(&quot;ADODB.Connection&quot;)
    ConnectString = &quot;Provider=SQLOLEDB;Data Source=&quot; &amp; ServerName &amp; &quot;;Initial Catalog=&quot; &amp; dbName &amp; &quot;;UID=&quot; &amp; user &amp; &quot;;PWD=&quot; &amp; pass
    oConn.ConnectionString = ConnectString
    oConn.ConnectionTimeOut = 15
    oConn.CommandTimeout = 30
    oConn.Open
    Dim strSQL
    &#039; запрашиваем данные из БД
    strSQL = &quot;SELECT TOP 100 PERCENT * FROM IncomeSMS WHERE smsTrackTIR Is Not Null&quot;
    On Error Resume Next &#039; не останавливаемся на ошибках
    Set oRecordset = oConn.Execute(strSQL)
    If oConn.Errors.Count &gt; 0 Then
          Dim E
          For Each E In oConn.Errors
            Debug.Print &quot;При выполнении запроса возникла ошибка: &quot; &amp; E.Description
          Next
    End If
    Dim ListIndex: ListIndex = 3
    If oRecordset.EOF Then
        Debug.Print &quot;нифига нету&quot;
      Else
        Debug.Print &quot;получены данные&quot;
        Dim i
        For i = 1 To oRecordset.Fields.Count
            &#039; заполняем шапку
            Sheets(ListIndex).Cells(1, i).Value = oRecordset.Fields.Item(i-1).Name
        Next
        Dim j: j = 2
        Do Until oRecordset.EOF
            &#039; формат данных:
            For i = 1 To oRecordset.Fields.Count
                Select Case oRecordset.Fields.Item(i-1).Type
                    Case adInteger, adSmallInt
                        Sheets(ListIndex).Cells(j, i).NumberFormat = &quot;0.00&quot;
                    Case adDBTimeStamp
                        Sheets(ListIndex).Cells(j, i).NumberFormat = &quot;m/d/yyyy&quot;
                    Case Else
                        Sheets(ListIndex).Cells(j, i).NumberFormat = &quot;@&quot;
                End Select
                &#039; заполняем табличку:
                Sheets(ListIndex).Cells(j, i).Value = oRecordset.Fields.Item(i-1).Value
            Next
            oRecordset.MoveNext
            j = j + 1
        Loop
    End If
    &#039; выравниваем ширину колонок по данным
    Sheets(ListIndex).Cells.Select
    Sheets(ListIndex).Cells.EntireColumn.AutoFit
    Sheets(ListIndex).Range(&quot;A1&quot;).Select
    On Error GoTo 0
    oConn.Close
    Set oConn = Nothing
    Set oRecordset = Nothing
End Sub
</code></pre></div><p>P.S. не все обработки ошибок приведены, это уже добавите самостоятельно <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br /><span style="color: grey">Правка 1: поправил индексы в циклах, вечно забываю где они от 0, а где от 1.</span></p><p>Правка-поправка 2: если будет возникать ошибка на константах типов данных(adInteger etc), то нужно либо добавить ссылку на ADO в референсах, либо в модуле прописать значения для используемых констант:<br /></p><div class="codebox"><pre><code>Option Explicit
Const adInteger = 3
Const adSmallInt = 2
Const adDBTimeStamp = 135</code></pre></div><p>Для других типов данных(если вдруг понадобится) см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318(v=vs.85).aspx">DataTypeEnum</a>.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Thu, 13 Dec 2012 07:00:23 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66929#p66929</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66927#p66927</link>
			<description><![CDATA[<div class="quotebox"><cite>qwertEHOK пишет:</cite><blockquote><p>а можно примерчик?</p><p>готов хоть веревками вить, лишь бы работало</p></blockquote></div><p>Из Excel можно связываться с SQL-сервером через ADODB. Создаём подключение, подключаемся, выполняем запрос - получаем recordset. По рекордсету проходим, и на основании этих данных заполняем отчёт в экселе. </p><p>Примеры можно поискать по форуму(&quot;ADODB.Connection&quot;), можно посмотреть в MSDN(<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms676589(v=vs.85).aspx">ADO Code Examples VBScript</a>). Строка подключения будет прописана непосредственно в экселевском файле, и не будет нужды ходить по 300 рабочим местам. Пример строк подключения к различным источникам можно посмотреть на www.connectionstrings.com(или в MSDN <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />).</p><p>Под рукой примеров работы в vba из SQL в Excel нет, обычно в обратном порядке и на vbscript. Соорудил из подручных материалов пример на vbscript(надеюсь не слишком сырой):<br /></p><div class="codebox"><pre><code>Dim oConn, oRecordset
Set oConn = CreateObject(&quot;ADODB.Connection&quot;)
ConnectString = &quot;Provider=SQLOLEDB;Data Source=&quot; &amp; ServerName &amp; &quot;;Initial Catalog=&quot; &amp; dbName &amp; &quot;;UID=&quot; &amp; user &amp; &quot;;PWD=&quot; &amp; pass
oConn.ConnectionString = ConnectString
oConn.ConnectionTimeOut = 15
oConn.CommandTimeout = 30
oConn.Open
Dim strSQL
&#039;1. запрашиваем track_id из track по TIR
strSQL = &quot;SELECT TOP 100 PERCENT track_id FROM track WHERE TIR LIKE &#039;%&quot; &amp; TIR &amp; &quot;%&#039;&quot;
On Error Resume Next &#039; не останавливаемся на ошибках
Set oRecordset = oConn.Execute(strSQL)
If oConn.Errors.Count &gt; 0  Then
      Dim E
      For Each E In oConn.Errors
        wscript.echo &quot;При выполнении запроса возникла ошибка: &quot; &amp; E.Description
      Next
End If
If oRecordset.EOF Then
    wscript.echo &quot;нифига нету&quot;
  Else
    wscript.echo &quot;получены данные&quot;
    Do Until oRecordset.EOF
        &#039;работаем с записью, обрабатываем возможные ошибки
        oRecordset.MoveNext
    Loop
End If
On Error Goto 0
oConn.Close
Set oConn = Nothing
Set oRecordset = Nothing
</code></pre></div><p>Попозже, если время будет, сделаю для vba.<br />P.S. два косяка уже нашел(копипаста <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />). Лучше подождать vba варианта.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Thu, 13 Dec 2012 06:17:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66927#p66927</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66894#p66894</link>
			<description><![CDATA[<p>а можно примерчик?</p><p>готов хоть веревками вить, лишь бы работало</p>]]></description>
			<author><![CDATA[null@example.com (qwertEHOK)]]></author>
			<pubDate>Wed, 12 Dec 2012 07:03:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66894#p66894</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66873#p66873</link>
			<description><![CDATA[<p>пользуйте оле, оно при наличие офиса на порядок быстрее - оспаривайте.</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Tue, 11 Dec 2012 17:26:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66873#p66873</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66851#p66851</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>..чтобы работало без необходимости создания источника DSN?</p></blockquote></div><p>абсолютно верно</p>]]></description>
			<author><![CDATA[null@example.com (qwertEHOK)]]></author>
			<pubDate>Tue, 11 Dec 2012 04:42:33 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66851#p66851</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66837#p66837</link>
			<description><![CDATA[<p>Без строки подключения работать не будет — иначе откуда он возьмёт информацию, куда и как подключаться.</p><p>Вы, наверное, хотели сказать — чтобы работало без необходимости создания источника DSN?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 10 Dec 2012 12:25:23 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66837#p66837</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66829#p66829</link>
			<description><![CDATA[<p>у меня в Экселе 2 строки и кнопка (минимальный отчет)<br />по нажатию оно выполняет запрос и выводит на второй лист результат</p><div class="codebox"><pre><code>With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
&quot;ODBC;DSN=cs001;Description=cs001;UID=read;password=read;APP=Microsoft Office 2003;WSID=s2;DATABASE=ankDic;&quot; _
), Array(&quot;on=Yes&quot;)), Destination:=Worksheets(&quot;Данные&quot;).Range(&quot;A1&quot;))
.CommandText = sqlstring
.Name = &quot;??????&quot;
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=True
End With</code></pre></div><p>Вот хотелось что бы на любом компьютере работало без создания строки подключения</p>]]></description>
			<author><![CDATA[null@example.com (qwertEHOK)]]></author>
			<pubDate>Mon, 10 Dec 2012 05:27:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66829#p66829</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66764#p66764</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>а для ОДБЦ нужно создавать источник</p></blockquote></div><p>Ах вон Вы про что… Строка соединения нужна для чего: для SQL Server или для Excel?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 07 Dec 2012 13:01:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66764#p66764</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66762#p66762</link>
			<description><![CDATA[<p>а для ОДБЦ нужно создавать источник<br />с ним у меня получается, но у нас в организации over 300 компов - не хочется по всем ходит и прописывать</p><p>если есть возможность создать его программно буду благодарен <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (qwertEHOK)]]></author>
			<pubDate>Fri, 07 Dec 2012 10:23:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66762#p66762</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66647#p66647</link>
			<description><![CDATA[<p>А зачем без?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 05 Dec 2012 12:44:42 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66647#p66647</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66644#p66644</link>
			<description><![CDATA[<p>а подскажите как получить таблицу из MS SQL и вставить в эксель без ОДБЦ?</p>]]></description>
			<author><![CDATA[null@example.com (qwertEHOK)]]></author>
			<pubDate>Wed, 05 Dec 2012 11:26:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66644#p66644</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=64024#p64024</link>
			<description><![CDATA[<p>Эх, тоже в своё время попался на этом. <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /><br />Пришлось установить excel&#039;чик и msdasql. </p><p>Доступ к файлам Excel 97-2003 при установленном excel&#039;е возможен так:</p><div class="codebox"><pre><code>var myFileFullPath = ...;
...
var objConnection = new ActiveXObject(&quot;ADODB.Connection&quot;);
objConnection.ConnectionString = 
   &quot;Provider=MSDASQL;Driver={Microsoft Excel Driver (*.xls)};DefaultDir=&quot; + 
   myFileFullPath.substring(0, myFileFullPath.lastIndexOf(&quot;\\&quot;)) + 
   &quot;;DBQ=&quot; +
   myFileFullPath +
   &quot;;ReadOnly=0;FirstRowHasNames=1;&quot;;
...
objConnection.Open();</code></pre></div><p>При этом, если открыть файл в excel&#039;е, процесс изменения данных в файле можно параллельно/одновременно наблюдать в окне excel&#039;я. <br />Иногда очень эффектно получается <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (max7)]]></author>
			<pubDate>Thu, 20 Sep 2012 16:22:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=64024#p64024</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57064#p57064</link>
			<description><![CDATA[<p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 19 Feb 2012 12:34:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57064#p57064</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57056#p57056</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Подытожьте сделанные Вами выводы в Коллекцию, пожалуйста.</p><p>И — <a href="http://forum.script-coding.com/rules.html#6.">добро пожаловать</a>!</p></blockquote></div><p>Благодарю. Постараюсь подытожить самое полезное(с моей точки зрения) не забыв о прочих возможностях <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Sun, 19 Feb 2012 06:55:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57056#p57056</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: INSERT в xls через ADO]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=56984#p56984</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>P.S. А тэга для оформления списков в движке форума нет, или я плохи искал?</p></blockquote></div><p>На этом движке вроде как нет.</p><p>Подытожьте сделанные Вами выводы в Коллекцию, пожалуйста.</p><p>И — <a href="http://forum.script-coding.com/rules.html#6.">добро пожаловать</a>!</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 17 Feb 2012 15:39:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=56984#p56984</guid>
		</item>
	</channel>
</rss>
