Страницы: 1
RSS
Excel + Sheet + VBA + SQL
 
КОД найден на просторах инета.    
впоследствие найдены следы применения здест на сайте - Author: KL  
 
Данный код использует листы в текущей книге, как таблицы с данными, которые можно обрабатывать при помощи SQL запроса.  
 
Работает быстро, и не слишком сложный.  
 
Если много запросов, то я переделывал в параметр сам SQL запрос.  
Надо будет поменять название    
Private Sub GenerateReportSQL(strSQL)  
 
закомментировать 2 строки    
Dim strSQL As String  
strSQL = "SELECT * FROM [OLD$]"
 
-----------------------------------------------------------------------------  
Private Sub GenerateReportSQL()  
Dim ws As Worksheet  
Dim qry As QueryTable  
Dim strPath As String  
Dim strName As String  
Dim strCon As String  
Dim strSQL As String  
Dim strPosition As String  
Dim strRng As String  
Dim tm As Double  
 
   With ThisWorkbook  
       On Error Resume Next  
       Set ws = .Worksheets("Отчет")  
       On Error GoTo 0  
       If ws Is Nothing Then Set ws = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))          
       strName = .FullName  
       strPath = .Path  
       strRng = "A2:U"  
       strCon = "ODBC;DSN=Excel Files;" & _  
                "DBQ=" & strName & ";" & _  
                "DefaultDir=" & strPath & ";" & _  
                "DriverId=1046;" & _  
                "MaxBufferSize=2048;" & _  
                "Page Timeout=5;"  
strSQL = "SELECT * FROM [OLD$]"
       With ws  
           If Val(Application.Version) > 11 Then DeleteConnections_12  
           .Cells.Clear  
           .Name = "Отчет"  
           Set qry = .QueryTables.Add(strCon, .Range("A1"), strSQL)  
           With qry  
               .BackgroundQuery = False  
               .Refresh  
               .Delete  
           End With  
       End With  
   End With  
End Sub  
 
Private Sub DeleteConnections_12()  
' This line won't work and wouldn't be necessary  
' in the versions older than 2007  
'*****************************************************************************  
On Error Resume Next: ThisWorkbook.Connections(1).Delete: On Error GoTo 0  
'*****************************************************************************  
End Sub  
---------------------------------------------------------------------------------  
 
Теперь попробую описать нюансы.  
 
Листы служат табличными источниками данным. Писать в запросе надо обязательно с $    
Т.е. для объявления Листа с данными под названием "OLD" в SQL запросе надо писать [OLD$]
 
Первая строка в листе служит названием полей. Для объявления поля необходиомо писать имя столбца.  
Например, поле называется "Название" на листе "OLD". в SQL пишем так [OLD$].Название
 
Еще ньюанс. Если вы хотите отбирать часть текста, то вместо * надо писать %  
Например, необходимо чтобы в Название содержалось слово "оскв", в SQL надо писать like `%оскв%`  
 
Да и еще, в SQL запросе под VBA, при выборе всякий условий, не пишут знак кавычки, пишите (апостраф вроде) `  
Например WHERE [OLD$].Название = `Москва`
 
еще вот так подключаться можно:  
 
'Установка подключения  
   sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ActiveWorkbook.FullName & ";" & _  
              "Extended Properties=""Excel 8.0;HDR=YES"";"  
 
 
   Set cn = New ADODB.Connection  
   cn.ConnectionString = sConnect  
   cn.Open  
   Set rs = New ADODB.Recordset  
 
 
   ' Собственно логика обработки данных  
   SQL_QUERY = "SELECT DISTINCT [input_data$].[Группа]," & _
               "       [medic_catalog$].[Врачи]" & _
               "FROM   [input_data$]" & _
               "       INNER JOIN [medic_catalog$]" & _
               "       ON     [input_data$].[Пункты] = [medic_catalog$].[Пункты]"
 
   'Создание рекордсета  
   Set cmd = CreateObject("ADODB.Command")  
   cmd.ActiveConnection = cn  
   cmd.CommandText = SQL_QUERY  
   cmd.Parameters.Refresh  
   cmd.CommandTimeout = 600  
 
   Set rs = New ADODB.Recordset  
 
   'Вывод  
   rs.Open cmd  
 
   '   Создание листа "output_data" в текущей книге  
   ActiveWorkbook.Sheets.Add after:=Sheets(Sheets.Count)  
   ActiveWorkbook.Sheets(Sheets.Count).Name = "output_data"  
   ActiveWorkbook.Worksheets("output_data").Range("A1").Value = "Группа"  
   ActiveWorkbook.Worksheets("output_data").Range("B1").Value = "Врачи"  
 
   Sheets("output_data").Range("A2").CopyFromRecordset rs  
 
   'Отключение  
   cn.Close
 
Вообще, в интернете много материалов на эту тему, вот тут, например оформлено в статью:  
 http://www.excelfin.ru/index.php/articles/macros/58-macro-ado
 
по мне так мой вариант проще :) и кода меньше.  
Да Админы, если можете и считаете нужным, переместите темку в Копилку. Забыл дописать в 1-м посте.
 
Вопрос:  
Зачем нужны переменные strPosition и strRng ??
Редко но метко ...
 
Не знаю :)
Страницы: 1
Читают тему
Наверх