powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите доработать макрос SQL-запроса в Excel.
7 сообщений из 7, страница 1 из 1
Помогите доработать макрос SQL-запроса в Excel.
    #38728721
Maxim12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро. Написал макрос, который вытягивает данные с листа 1 в столбец C другого листа через SQL-запрос и проставляет в соседнем столбце D статус договора. Проблема в том, что имеется 3 разных статуса договора, для некоторых статусов имеется 2-3 условия выборки. Не придумал ничего лучше, как открывать соединение, копировать данные, проставлять статус, закрывать соединение и проделывать еще 2 раза. Может быть можно как-то проще все сделать и проставлять статус сразу после отработки кода SQL? Спасибо за помощь.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Dim Conn As New ADODB.Connection, This_WB As Workbook, Data As String, Lastrow_WB As Long, RR As Range, Lastrow_WB1 As Long
Set This_WB = ThisWorkbook
Data = This_WB.Sheets("Çàïðîñ").Cells(2, 3)
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("Çàïðîñ").Range("C6").CopyFromRecordset _
Conn.Execute("SELECT [Íîìåð äîãîâîðà] FROM [1$] WHERE [Ñîñòîÿíèå]='Çàêðûò' AND [Äàòà çàêðûòèÿ] >= #" & Format(Data, "mm-dd-yyyy") & "# UNION ALL SELECT [Íîìåð äîãîâîðà] FROM [1$] WHERE [Ñîñòîÿíèå]='Ðàáîòàåò'")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("Çàïðîñ").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("Çàïðîñ").Range("D6:D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "Ðàáîòàåò"
 Next RR
'===
Lastrow_WB1 = This_WB.Sheets("Çàïðîñ").Cells(Rows.Count, "D").End(xlUp).Row
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("Çàïðîñ").Range("C" & CStr(Lastrow_WB1 + 1) & "").CopyFromRecordset _
Conn.Execute("SELECT [&#205;&#238;&#236;&#229;&#240; &#228;&#238;&#227;&#238;&#226;&#238;&#240;&#224;] FROM [1$] WHERE [&#209;&#238;&#241;&#242;&#238;&#255;&#237;&#232;&#229;]='&#199;&#224;&#234;&#240;&#251;&#242;' AND [&#196;&#224;&#242;&#224; &#231;&#224;&#234;&#240;&#251;&#242;&#232;&#255;] < #" & Format(Data, "mm-dd-yyyy") & "# AND [&#196;&#238;&#227;&#238;&#226;&#238;&#240; &#239;&#240;&#238;&#228;&#224;&#230;&#232;]=''")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Range("D" & CStr(Lastrow_WB1 + 1) & ":D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "&#199;&#224;&#234;&#240;&#251;&#242;"
 Next RR
'===
Lastrow_WB1 = This_WB.Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Cells(Rows.Count, "D").End(xlUp).Row
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Range("C" & CStr(Lastrow_WB1 + 1) & "").CopyFromRecordset _
Conn.Execute("SELECT [&#205;&#238;&#236;&#229;&#240; &#228;&#238;&#227;&#238;&#226;&#238;&#240;&#224;] FROM [1$] WHERE [&#209;&#238;&#241;&#242;&#238;&#255;&#237;&#232;&#229;]='&#199;&#224;&#234;&#240;&#251;&#242;' AND [&#196;&#224;&#242;&#224; &#231;&#224;&#234;&#240;&#251;&#242;&#232;&#255;] < #" & Format(Data, "mm-dd-yyyy") & "# AND [&#196;&#238;&#227;&#238;&#226;&#238;&#240; &#239;&#240;&#238;&#228;&#224;&#230;&#232;]<>'' UNION ALL SELECT [&#205;&#238;&#236;&#229;&#240; &#228;&#238;&#227;&#238;&#226;&#238;&#240;&#224;] FROM [1$] WHERE [&#209;&#238;&#241;&#242;&#238;&#255;&#237;&#232;&#229;]='&#207;&#240;&#238;&#228;&#224;&#237;'")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("&#199;&#224;&#239;&#240;&#238;&#241;").Range("D" & CStr(Lastrow_WB1 + 1) & ":D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "&#207;&#240;&#238;&#228;&#224;&#237;"
 Next RR
End Sub
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728731
Maxim12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim12345678,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Dim Conn As New ADODB.Connection, This_WB As Workbook, Data As String, Lastrow_WB As Long, RR As Range, Lastrow_WB1 As Long
Set This_WB = ThisWorkbook
Data = This_WB.Sheets("Zapros").Cells(2, 3)
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("Zapros").Range("C6").CopyFromRecordset _
Conn.Execute("SELECT [Nomer_dogovora] FROM [1$] WHERE [Sostoyanie]='Zakrit' AND [Date_zakritiya] >= #" & Format(Data, "mm-dd-yyyy") & "# UNION ALL SELECT [Nomer_dogovora] FROM [1$] WHERE [Sostoyanie]='Rabotaet'")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("Zapros").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("Zapros").Range("D6:D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "Rabotaet"
 Next RR
'===
Lastrow_WB1 = This_WB.Sheets("Zapros").Cells(Rows.Count, "D").End(xlUp).Row
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("Zapros").Range("C" & CStr(Lastrow_WB1 + 1) & "").CopyFromRecordset _
Conn.Execute("SELECT [Nomer_dogovora] FROM [1$] WHERE [Sostoyanie]='Zakrit' AND [Date_zakritiya] < #" & Format(Data, "mm-dd-yyyy") & "# AND [Dogovor_prodaji]=''")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("Zapros").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("Zapros").Range("D" & CStr(Lastrow_WB1 + 1) & ":D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "Zakrit"
 Next RR
'===
Lastrow_WB1 = This_WB.Sheets("Zapros").Cells(Rows.Count, "D").End(xlUp).Row
'===
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties=""Excel 8.0; HDR=Yes;""; Data Source=" & This_WB.FullName
Sheets("Zapros").Range("C" & CStr(Lastrow_WB1 + 1) & "").CopyFromRecordset _
Conn.Execute("SELECT [Nomer_dogovora] FROM [1$] WHERE [Sostoyanie]='Zakrit' AND [Data_zakritiya] < #" & Format(Data, "mm-dd-yyyy") & "# AND [Dogovor_prodaji]<>'' UNION ALL SELECT [Nomer_dogovora] FROM [1$] WHERE [Sostoyanie]='Prodan'")
Conn.Close
'===
Lastrow_WB = This_WB.Sheets("Zapros").Cells(Rows.Count, "C").End(xlUp).Row
 For Each RR In This_WB.Sheets("Zapros").Range("D" & CStr(Lastrow_WB1 + 1) & ":D" & CStr(Lastrow_WB) & "")
    Cells(RR.Row, 4) = "Prodan"
 Next RR
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728736
Триггерман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim12345678,
Не стоит так жутко хардкодить строковые константы (литералы) прямо в коде процедуры.
Храните строковые шаблоны и константы в ячейках на отдельном листе, в мемо-полях формы, во внешнем текстовом файле на худой конец.
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728737
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) необязательно закрывать/открывать соединение каждый раз, можно открыть в начале и закрыть в конце

2) на беглый взгляд не понимаю, зачем нужно запрашивать три раза, почему бы не возвращать нужный столбец сразу в запросе:
Код: vbnet
1.
Conn.Execute("SELECT [Nomer_dogovora], формула_для_второго_столбца FROM [1$] WHERE.....")



3) есть гораздо более простой способ формирование Range, зная номера строк/столбцов:
Код: vbnet
1.
Range(Cells(10,4),Cells(20,4))
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728766
Maxim12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггерман,
мне казалось, что так проще вставлять диапазоны один за другим, чтобы не запутаться... учту на будущее, спасибо.
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728773
Maxim12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, спасибо за советы

1) если не закрывать\открывать соединение, то Excel ругается, что открытая книга уже используется и не хочет выполнять 2 запрос. Хотя над этим еще подумаю
2) я просто тупо не знал, что можно в запросе задавать значения другого столбца. Пытаюсь оптимизировать рутину в Excel и попутно изучаю sql, буду пробовать.
3) об этом способе знаю, но мне было проще использовать так.
...
Рейтинг: 0 / 0
Помогите доработать макрос SQL-запроса в Excel.
    #38728856
Maxim12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггерман, Shocker.Pro спасибо за подсказки, код переделал, получилось проще и без всяких извращений.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите доработать макрос SQL-запроса в Excel.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]