Добрый день уважаемые специалисты и профи , хотел у вас спросить как подключится к базе "sql server management studio 2008 r2" и проверить данные Excel в базе данных при найденных данных выводить столбик соответствующий в базе То есть нужно из базы данных вставить в Excel значения при совпадении Благодарю за помощь
Добрый день уважаемые специалисты и профи , хотел у вас спросить как подключится к базе "sql server management studio 2008 r2" и проверить данные Excel в базе данных при найденных данных выводить столбик соответствующий в базе То есть нужно из базы данных вставить в Excel значения при совпадении Благодарю за помощьElhust
осталось второй вопрос решить, я подключился к базе но как сделать поиск данных в базе, а затем выводить при совпадении из базы той же таблицы то есть есть одна база одна таблица, мой файл эксел там есть все столбцы кроме одного и этот один надо типо отВПРить хауу май джинис ???
осталось второй вопрос решить, я подключился к базе но как сделать поиск данных в базе, а затем выводить при совпадении из базы той же таблицы то есть есть одна база одна таблица, мой файл эксел там есть все столбцы кроме одного и этот один надо типо отВПРить хауу май джинис ???Elhust
Ответ удален администрацией - ТС пока не выполнил указание модератора
Если вы уже подключились к базе посмотрите в готовых решениях тут
я из ексель через SQL читал данные из mdb файла
код только вам под себя придется переделывать там запрос формируется на основании информации об имеющихся полях, с использование оператора Like ищет все совпадения, можно использовать маски поиска (спецсимволы типа *, ?)
макрос выбранные строки копирует на лист.
по работе макроса вопросы будут могу подсказать что зачем.
Ответ удален администрацией - ТС пока не выполнил указание модератора
Если вы уже подключились к базе посмотрите в готовых решениях тут
я из ексель через SQL читал данные из mdb файла
код только вам под себя придется переделывать там запрос формируется на основании информации об имеющихся полях, с использование оператора Like ищет все совпадения, можно использовать маски поиска (спецсимволы типа *, ?)
макрос выбранные строки копирует на лист.
по работе макроса вопросы будут могу подсказать что зачем.K-SerJC
Dim str As String, sstr As String, tn As String, t As Integer, tek As Field, str2(50) As String 'str2 список полей, максимум 50. tn имя таблицы, str предмет поиска t = 1
' ЭтаКнига.SQLstr = "SELECT * FROM " & tn & " WHERE " & str2 & " LIKE '*" & str & "*'" ' работает если перед поиском выделить имя поля ЭтаКнига.SQLstr = "SELECT * FROM " & tn & " WHERE " t = 1 sstr = str2(t) & " LIKE '*" & str & "*'" dolby2:
If str2(t + 1) <> "" Then t = t + 1: sstr = sstr & " OR " & str2(t) & " LIKE '*" & str & "*'": GoTo dolby2 ЭтаКнига.SQLstr = ЭтаКнига.SQLstr & sstr
Set ЭтаКнига.RS = ЭтаКнига.Dbase.OpenRecordset(ЭтаКнига.SQLstr) Workbooks(Texcel).Sheets(1).Cells(6, 1).CopyFromRecordset ЭтаКнига.RS
' закрываем таблицу очищаем память ЭтаКнига.Dbase.Close Set ЭтаКнига.Dbase = Nothing Set ЭтаКнига.RS = Nothing Exit Sub какашка: MsgBox Err.Number & " - " & Err.Description, vbCritical, "Чтото пошло не так..." Set Dbase = Nothing Set RS = Nothing End Sub
[/vba]
не пойму на каком этапе мы взяли данные из базы
K-SerJC, [vba]
Код
Private Sub CommandButton1_Click()
On Error GoTo какашка
Dim str As String, sstr As String, tn As String, t As Integer, tek As Field, str2(50) As String 'str2 список полей, максимум 50. tn имя таблицы, str предмет поиска t = 1
' ЭтаКнига.SQLstr = "SELECT * FROM " & tn & " WHERE " & str2 & " LIKE '*" & str & "*'" ' работает если перед поиском выделить имя поля ЭтаКнига.SQLstr = "SELECT * FROM " & tn & " WHERE " t = 1 sstr = str2(t) & " LIKE '*" & str & "*'" dolby2:
If str2(t + 1) <> "" Then t = t + 1: sstr = sstr & " OR " & str2(t) & " LIKE '*" & str & "*'": GoTo dolby2 ЭтаКнига.SQLstr = ЭтаКнига.SQLstr & sstr
Set ЭтаКнига.RS = ЭтаКнига.Dbase.OpenRecordset(ЭтаКнига.SQLstr) Workbooks(Texcel).Sheets(1).Cells(6, 1).CopyFromRecordset ЭтаКнига.RS
' закрываем таблицу очищаем память ЭтаКнига.Dbase.Close Set ЭтаКнига.Dbase = Nothing Set ЭтаКнига.RS = Nothing Exit Sub какашка: MsgBox Err.Number & " - " & Err.Description, vbCritical, "Чтото пошло не так..." Set Dbase = Nothing Set RS = Nothing End Sub
[/vba]
не пойму на каком этапе мы взяли данные из базыElhust
Я правильно понял, что нужно не только получить выборку из базы, но иметь соответвие строкам? Или слеп стал или не вижу этого в теле скрипта. recordset выдаст данные в последовательности хранимой в базе, что может не совпасть с вашим "Фильтром"
Тут или преварительныая сортировка и фильтра и в запросе , или перебор результата запроса с подбором необходимой записи , или ... вывод рзультата в отдельную таблицу и формулами подбор нужного значения, или PowerQuery.
Elhust,
Я правильно понял, что нужно не только получить выборку из базы, но иметь соответвие строкам? Или слеп стал или не вижу этого в теле скрипта. recordset выдаст данные в последовательности хранимой в базе, что может не совпасть с вашим "Фильтром"
Тут или преварительныая сортировка и фильтра и в запросе , или перебор результата запроса с подбором необходимой записи , или ... вывод рзультата в отдельную таблицу и формулами подбор нужного значения, или PowerQuery.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Четверг, 19.01.2017, 17:00
или перебор результата запроса с подбором необходимой записи
Можно ещё и создать временную таблицу на сервере, залить туда данные для фильтрации и через Join вернуть только требуемые записи из требуемой таблицы. Просто советовать сложно, что почём - описание скудное и не внятное.
или перебор результата запроса с подбором необходимой записи
Можно ещё и создать временную таблицу на сервере, залить туда данные для фильтрации и через Join вернуть только требуемые записи из требуемой таблицы. Просто советовать сложно, что почём - описание скудное и не внятное.anvg
bmv98rus,anvg, проблема в том что уникальных полей нет , доступа к базе нет (( если говорить грубо и доступно, то у меня из базы выгружается таблица типа той что представлена в файле выше но там есть один столбец который мне нужно добавить в excel, причём так чтобы было быстро и я подумал про массив ... то есть выгружу из базы, данные в массив и буду с ними работать .... но вот проблема ... Есть такой код это ВПР который работает с массивом, но тут реализован поиск по одному аргументу а мне надо хотя бы по двум [vba]
Код
Sub compare1() Dim a, b, c, iLastrow As Long, i As Long, ii As Long
'1. данные в два массива With Sheets("получено") 'используется кодовое имя iLastrow = .Cells(Rows.Count, 4).End(xlUp).Row a = Range(.[d2], .Range("D" & iLastrow)).Value End With
With Sheets("отправлено") 'используется кодовое имя iLastrow = .Cells(Rows.Count, 10).End(xlUp).Row b = .[a2].Resize(iLastrow, 20).Value End With
'2.пустой массив для результата ReDim c(1 To UBound(a), 1 To 2)
With CreateObject("Scripting.Dictionary")
'3.в словарь уникальные и номер строки из массива For i = 1 To UBound(b) .Item(b(i, 10)) = i Next
'4.по словарю из массива b в массив c For i = 1 To UBound(a) If .exists(a(i, 1)) Then c(i, 1) = b(.Item(a(i, 1)), 1) c(i, 2) = b(.Item(a(i, 1)), 2) End If Next End With
'5. выгрузка всего массива With Sheets("получено") 'используется кодовое имя .[a2].Resize(UBound(c), 2) = c .Activate End With
End Sub
[/vba]
bmv98rus,anvg, проблема в том что уникальных полей нет , доступа к базе нет (( если говорить грубо и доступно, то у меня из базы выгружается таблица типа той что представлена в файле выше но там есть один столбец который мне нужно добавить в excel, причём так чтобы было быстро и я подумал про массив ... то есть выгружу из базы, данные в массив и буду с ними работать .... но вот проблема ... Есть такой код это ВПР который работает с массивом, но тут реализован поиск по одному аргументу а мне надо хотя бы по двум [vba]
Код
Sub compare1() Dim a, b, c, iLastrow As Long, i As Long, ii As Long
'1. данные в два массива With Sheets("получено") 'используется кодовое имя iLastrow = .Cells(Rows.Count, 4).End(xlUp).Row a = Range(.[d2], .Range("D" & iLastrow)).Value End With
With Sheets("отправлено") 'используется кодовое имя iLastrow = .Cells(Rows.Count, 10).End(xlUp).Row b = .[a2].Resize(iLastrow, 20).Value End With
'2.пустой массив для результата ReDim c(1 To UBound(a), 1 To 2)
With CreateObject("Scripting.Dictionary")
'3.в словарь уникальные и номер строки из массива For i = 1 To UBound(b) .Item(b(i, 10)) = i Next
'4.по словарю из массива b в массив c For i = 1 To UBound(a) If .exists(a(i, 1)) Then c(i, 1) = b(.Item(a(i, 1)), 1) c(i, 2) = b(.Item(a(i, 1)), 2) End If Next End With
'5. выгрузка всего массива With Sheets("получено") 'используется кодовое имя .[a2].Resize(UBound(c), 2) = c .Activate End With
Что-то я не понял, есть доступ к SQL или нет? Если таки есть, то сколько строк в "фильтре" . Порой проще сделать несколько запросов по каждой строке и если есть понимание, как связать информацию, то это не проблема , а лишний раз дернуть SQL не стоит боятся., переварит. К стати если изветно поле что вам нужно Select * тоже, как бы лишнеее.
anvg, Join - Идеальный вариант, я его не стал рассматривать, предположив что доступ максимум на Read. Будь я DBA я б точно токое не поволил.
Elhust,
Что-то я не понял, есть доступ к SQL или нет? Если таки есть, то сколько строк в "фильтре" . Порой проще сделать несколько запросов по каждой строке и если есть понимание, как связать информацию, то это не проблема , а лишний раз дернуть SQL не стоит боятся., переварит. К стати если изветно поле что вам нужно Select * тоже, как бы лишнеее.
anvg, Join - Идеальный вариант, я его не стал рассматривать, предположив что доступ максимум на Read. Будь я DBA я б точно токое не поволил.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Тогда как вы собираетесь сопоставлять данные на листе с данными запроса? К чему тогда нужен искомый вами "ВПР" по нескольким полям?
Набросок кода для обдумывания [vba]
Код
Public Sub test() Dim pConn As New ADODB.Connection Dim pRSet As New ADODB.Recordset Dim selData As Variant, i As Long Dim sSQL As String, outSheet As Worksheet
selData = Range("A2:B100") pRSet.Open "Select * From #selTable;", pConn, adOpenStatic, adLockOptimistic For i = 1 To UBound(selData) pRSet.AddNew pRSet(0).Value = selData(i, 1) pRSet(1).Value = selData(i, 2) Next pRSet.Update: pRSet.Close sSQL = "Select TSel.FirstName, TSel.LastName, TMain.Field1, TMain.Field2" sSQL = sSQL & " From #selTable TSel Left Join MainDWH.dbo.AFS_request_in TMain" sSQL = sSQL & " On (TSel.FirstName = TMain.FirstName And TSel.LastName = TMain.LastName)" pRSet.Open sSQL, pConn Set outSheet = ActiveWorkbook.Worksheets.Add For i = 0 To pRSet.Fields.Count - 1 outSheet.Cells(1, i + 1).Value = pRSet(i).Name Next outSheet.Range("A2").CopyFromRecordset pRSet pRSet.Close: pConn.Close Set pRSet = Nothing: Set pConn = Nothing End Sub
[/vba] Библиотека Microsoft ActiveX Data Objects должна быть подключена явно. Естественно, какой подход выбрать - фильтровать ли на стороне сервера или клиента зависит от объёма передаваемых данных, по крайней мере, логически.
Запретить доступ к tempdb (а именно там создаются временные таблицы) - это всё равно как запретить пользователю Windows доступ к его папке Temp . Конечно можно, только после запуска сервера - слетит и потребует настройки (да можно конечно и job на запуск повесить). Временные таблицы удаляются при закрытии подключения автоматически, ну, или по закрытию Excel, если пользователь "забыл" это выполнить в коде.
Тогда как вы собираетесь сопоставлять данные на листе с данными запроса? К чему тогда нужен искомый вами "ВПР" по нескольким полям?
Набросок кода для обдумывания [vba]
Код
Public Sub test() Dim pConn As New ADODB.Connection Dim pRSet As New ADODB.Recordset Dim selData As Variant, i As Long Dim sSQL As String, outSheet As Worksheet
selData = Range("A2:B100") pRSet.Open "Select * From #selTable;", pConn, adOpenStatic, adLockOptimistic For i = 1 To UBound(selData) pRSet.AddNew pRSet(0).Value = selData(i, 1) pRSet(1).Value = selData(i, 2) Next pRSet.Update: pRSet.Close sSQL = "Select TSel.FirstName, TSel.LastName, TMain.Field1, TMain.Field2" sSQL = sSQL & " From #selTable TSel Left Join MainDWH.dbo.AFS_request_in TMain" sSQL = sSQL & " On (TSel.FirstName = TMain.FirstName And TSel.LastName = TMain.LastName)" pRSet.Open sSQL, pConn Set outSheet = ActiveWorkbook.Worksheets.Add For i = 0 To pRSet.Fields.Count - 1 outSheet.Cells(1, i + 1).Value = pRSet(i).Name Next outSheet.Range("A2").CopyFromRecordset pRSet pRSet.Close: pConn.Close Set pRSet = Nothing: Set pConn = Nothing End Sub
[/vba] Библиотека Microsoft ActiveX Data Objects должна быть подключена явно. Естественно, какой подход выбрать - фильтровать ли на стороне сервера или клиента зависит от объёма передаваемых данных, по крайней мере, логически.
Запретить доступ к tempdb (а именно там создаются временные таблицы) - это всё равно как запретить пользователю Windows доступ к его папке Temp . Конечно можно, только после запуска сервера - слетит и потребует настройки (да можно конечно и job на запуск повесить). Временные таблицы удаляются при закрытии подключения автоматически, ну, или по закрытию Excel, если пользователь "забыл" это выполнить в коде.anvg
Set rs = Conn.Execute("SELECT TOP 10 * FROM #AFS") Ary = rs.GetRows() MsgBox Ary(0, 0)
End Sub
[/vba]
Ещё раз всем привет возникла потребность в создании временной таблицы после чего стало выдавать ошибку ----------------------------------------------- Microsoft Visual Basic for Applications ----------------------------------------------- Run-time error '-2147217900 (80040e14)':
Automation error ----------------------------------------------- ОК Справка -----------------------------------------------
[vba]
Код
Dim Conn Dim Ary() Dim SQL As String
Sub test_conn() Set Conn = New ADODB.Connection
'If UserForm1.TextBox1.Text <> "" And UserForm1.TextBox2.Text <> "" Then 'Else 'UserForm1.Show 'End If
Conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=198.19.5.177;Initial Catalog=MainDWH;User ID=***;Password=***" Dim rs As ADODB.Recordset Conn.Open
Set rs = Conn.Execute("SELECT TOP 10 * FROM #AFS") Ary = rs.GetRows() MsgBox Ary(0, 0)
End Sub
[/vba]
Ещё раз всем привет возникла потребность в создании временной таблицы после чего стало выдавать ошибку ----------------------------------------------- Microsoft Visual Basic for Applications ----------------------------------------------- Run-time error '-2147217900 (80040e14)':
Automation error ----------------------------------------------- ОК Справка -----------------------------------------------Elhust