Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подключиться к базе "SSMSE" с проверкой данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подключиться к базе "SSMSE" с проверкой данных (Макросы/Sub)
Подключиться к базе "SSMSE" с проверкой данных
Elhust Дата: Четверг, 19.01.2017, 07:02 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
Добрый день уважаемые специалисты и профи , хотел у вас спросить как подключится к базе "sql server management studio 2008 r2" и проверить данные Excel в базе данных при найденных данных выводить столбик соответствующий в базе
То есть нужно из базы данных вставить в Excel значения при совпадении
Благодарю за помощь
К сообщению приложен файл: 5099873.xlsx (9.1 Kb)


Каждый сам выбирает правила игры
 
Ответить
СообщениеДобрый день уважаемые специалисты и профи , хотел у вас спросить как подключится к базе "sql server management studio 2008 r2" и проверить данные Excel в базе данных при найденных данных выводить столбик соответствующий в базе
То есть нужно из базы данных вставить в Excel значения при совпадении
Благодарю за помощь

Автор - Elhust
Дата добавления - 19.01.2017 в 07:02
Elhust Дата: Четверг, 19.01.2017, 08:49 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код

Dim Conn
Dim Ary()

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=177.17.3.176;Initial Catalog=MainDWH;User ID=" & UserForm1.TextBox1.Text & ";Password=" & UserForm1.TextBox2.Text
Dim rs As ADODB.Recordset
Conn.Open

Set rs = Conn.Execute("SELECT TOP 10 * FROM MainDWH.dbo.AFS_request_in")
Ary = rs.GetRows()

MsgBox Ary(8, 1)
End Sub
[/vba]


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Четверг, 19.01.2017, 12:51
 
Ответить
Сообщение[vba]
Код

Dim Conn
Dim Ary()

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=177.17.3.176;Initial Catalog=MainDWH;User ID=" & UserForm1.TextBox1.Text & ";Password=" & UserForm1.TextBox2.Text
Dim rs As ADODB.Recordset
Conn.Open

Set rs = Conn.Execute("SELECT TOP 10 * FROM MainDWH.dbo.AFS_request_in")
Ary = rs.GetRows()

MsgBox Ary(8, 1)
End Sub
[/vba]

Автор - Elhust
Дата добавления - 19.01.2017 в 08:49
_Boroda_ Дата: Четверг, 19.01.2017, 09:29 | Сообщение № 3
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Elhust, оформите свой пост согласно Правил форума


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеElhust, оформите свой пост согласно Правил форума

Автор - _Boroda_
Дата добавления - 19.01.2017 в 09:29
K-SerJC Дата: Четверг, 19.01.2017, 10:11 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
Ответ удален администрацией - ТС пока не выполнил указание модератора


Благими намерениями выстелена дорога в АД.

Сообщение отредактировал _Boroda_ - Четверг, 19.01.2017, 10:37
 
Ответить
СообщениеОтвет удален администрацией - ТС пока не выполнил указание модератора

Автор - K-SerJC
Дата добавления - 19.01.2017 в 10:11
Elhust Дата: Четверг, 19.01.2017, 12:56 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
осталось второй вопрос решить, я подключился к базе но как сделать поиск данных в базе, а затем выводить при совпадении из базы той же таблицы
то есть есть одна база одна таблица, мой файл эксел там есть все столбцы кроме одного и этот один надо типо отВПРить хауу май джинис ???
К сообщению приложен файл: 4381067.xls (28.5 Kb)


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Четверг, 19.01.2017, 13:15
 
Ответить
Сообщениеосталось второй вопрос решить, я подключился к базе но как сделать поиск данных в базе, а затем выводить при совпадении из базы той же таблицы
то есть есть одна база одна таблица, мой файл эксел там есть все столбцы кроме одного и этот один надо типо отВПРить хауу май джинис ???

Автор - Elhust
Дата добавления - 19.01.2017 в 12:56
K-SerJC Дата: Четверг, 19.01.2017, 14:22 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
Ответ удален администрацией - ТС пока не выполнил указание модератора

Если вы уже подключились к базе посмотрите в готовых решениях
тут

я из ексель через SQL читал данные из mdb файла

код только вам под себя придется переделывать
там запрос формируется на основании информации об имеющихся полях, с использование оператора Like
ищет все совпадения, можно использовать маски поиска (спецсимволы типа *, ?)

макрос выбранные строки копирует на лист.

по работе макроса вопросы будут могу подсказать что зачем.


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщение
Ответ удален администрацией - ТС пока не выполнил указание модератора

Если вы уже подключились к базе посмотрите в готовых решениях
тут

я из ексель через SQL читал данные из mdb файла

код только вам под себя придется переделывать
там запрос формируется на основании информации об имеющихся полях, с использование оператора Like
ищет все совпадения, можно использовать маски поиска (спецсимволы типа *, ?)

макрос выбранные строки копирует на лист.

по работе макроса вопросы будут могу подсказать что зачем.

Автор - K-SerJC
Дата добавления - 19.01.2017 в 14:22
Elhust Дата: Четверг, 19.01.2017, 14:36 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
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

'str2 = ActiveCell.Value

Texcel = ActiveWorkbook.Sheets("set").Cells(1, 3).Value
str = Workbooks(Texcel).Sheets("set").Cells(1, 1).Value

Dolby:
str2(t) = Workbooks(Texcel).Sheets(1).Cells(5, t).Value

If Workbooks(Texcel).Sheets(1).Cells(5, t + 1).Value <> "" Then t = t + 1: GoTo Dolby
Set ЭтаКнига.Dbase = DAO.OpenDatabase(str)

tn = Workbooks(Texcel).Sheets(1).Cells(3, 5 + Workbooks(Texcel).Sheets(1).Cells(2, 6).Value).Value
str = Workbooks(Texcel).Sheets(1).Cells(2, 1).Value
Workbooks(Texcel).Sheets(1).Range("A6:Z1000001").Clear

' ЭтаКнига.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

'str2 = ActiveCell.Value

Texcel = ActiveWorkbook.Sheets("set").Cells(1, 3).Value
str = Workbooks(Texcel).Sheets("set").Cells(1, 1).Value

Dolby:
str2(t) = Workbooks(Texcel).Sheets(1).Cells(5, t).Value

If Workbooks(Texcel).Sheets(1).Cells(5, t + 1).Value <> "" Then t = t + 1: GoTo Dolby
Set ЭтаКнига.Dbase = DAO.OpenDatabase(str)

tn = Workbooks(Texcel).Sheets(1).Cells(3, 5 + Workbooks(Texcel).Sheets(1).Cells(2, 6).Value).Value
str = Workbooks(Texcel).Sheets(1).Cells(2, 1).Value
Workbooks(Texcel).Sheets(1).Range("A6:Z1000001").Clear

' ЭтаКнига.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
Дата добавления - 19.01.2017 в 14:36
K-SerJC Дата: Четверг, 19.01.2017, 15:59 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
вот эта переменная [vba]
Код
ЭтаКнига.SQLstr
[/vba] хранит sql запрос
а тут [vba]
Код

Set ЭтаКнига.RS = ЭтаКнига.Dbase.OpenRecordset(ЭтаКнига.SQLstr)
[/vba]
устанавливаем переменную RS из базы ЭтаКнига.Dbase открываем запрос по sql
т.е. после этого в RS уже собраны вы выбраные по запросу данные.

затем вставляем их в ячейки:
[vba]
Код
Workbooks(Texcel).Sheets(1).Cells(6, 1).CopyFromRecordset ЭтаКнига.RS
[/vba]

вот эта конструкция добавляет в запрос в цикле поиск по всем полям

[vba]
Код
dolby2:

If str2(t + 1) <> "" Then t = t + 1: sstr = sstr & " OR " & str2(t) & " LIKE '*" & str & "*'": GoTo dolby2
ЭтаКнига.SQLstr = ЭтаКнига.SQLstr & sstr
[/vba]

только у тебя подключение по ADODB (у меня подключение через DAO), там немного отличается почитай инфы полно в интернете.


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениевот эта переменная [vba]
Код
ЭтаКнига.SQLstr
[/vba] хранит sql запрос
а тут [vba]
Код

Set ЭтаКнига.RS = ЭтаКнига.Dbase.OpenRecordset(ЭтаКнига.SQLstr)
[/vba]
устанавливаем переменную RS из базы ЭтаКнига.Dbase открываем запрос по sql
т.е. после этого в RS уже собраны вы выбраные по запросу данные.

затем вставляем их в ячейки:
[vba]
Код
Workbooks(Texcel).Sheets(1).Cells(6, 1).CopyFromRecordset ЭтаКнига.RS
[/vba]

вот эта конструкция добавляет в запрос в цикле поиск по всем полям

[vba]
Код
dolby2:

If str2(t + 1) <> "" Then t = t + 1: sstr = sstr & " OR " & str2(t) & " LIKE '*" & str & "*'": GoTo dolby2
ЭтаКнига.SQLstr = ЭтаКнига.SQLstr & sstr
[/vba]

только у тебя подключение по ADODB (у меня подключение через DAO), там немного отличается почитай инфы полно в интернете.

Автор - K-SerJC
Дата добавления - 19.01.2017 в 15:59
bmv98rus Дата: Четверг, 19.01.2017, 16:59 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
Elhust,

Я правильно понял, что нужно не только получить выборку из базы, но иметь соответвие строкам? Или слеп стал или не вижу этого в теле скрипта. recordset выдаст данные в последовательности хранимой в базе, что может не совпасть с вашим "Фильтром"

Тут или преварительныая сортировка и фильтра и в запросе , или перебор результата запроса с подбором необходимой записи , или ... вывод рзультата в отдельную таблицу и формулами подбор нужного значения, или PowerQuery.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Четверг, 19.01.2017, 17:00
 
Ответить
СообщениеElhust,

Я правильно понял, что нужно не только получить выборку из базы, но иметь соответвие строкам? Или слеп стал или не вижу этого в теле скрипта. recordset выдаст данные в последовательности хранимой в базе, что может не совпасть с вашим "Фильтром"

Тут или преварительныая сортировка и фильтра и в запросе , или перебор результата запроса с подбором необходимой записи , или ... вывод рзультата в отдельную таблицу и формулами подбор нужного значения, или PowerQuery.

Автор - bmv98rus
Дата добавления - 19.01.2017 в 16:59
anvg Дата: Четверг, 19.01.2017, 17:53 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе вермя суток.
или перебор результата запроса с подбором необходимой записи

Можно ещё и создать временную таблицу на сервере, залить туда данные для фильтрации и через Join вернуть только требуемые записи из требуемой таблицы.
Просто советовать сложно, что почём - описание скудное и не внятное.
 
Ответить
СообщениеДоброе вермя суток.
или перебор результата запроса с подбором необходимой записи

Можно ещё и создать временную таблицу на сервере, залить туда данные для фильтрации и через Join вернуть только требуемые записи из требуемой таблицы.
Просто советовать сложно, что почём - описание скудное и не внятное.

Автор - anvg
Дата добавления - 19.01.2017 в 17:53
Elhust Дата: Четверг, 19.01.2017, 22:36 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
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]
К сообщению приложен файл: VlookUP___.xlsm (23.4 Kb)


Каждый сам выбирает правила игры
 
Ответить
Сообщение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]

Автор - Elhust
Дата добавления - 19.01.2017 в 22:36
SLAVICK Дата: Четверг, 19.01.2017, 22:56 | Сообщение № 12
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
такой код это ВПР который работает с массивом, но тут реализован поиск по одному аргументу а мне надо хотя бы по двум

ну так добавьте аргументы:
тут:
[vba]
Код
.Item(b(i, 10)) = i
[/vba]
[vba]
Код
.Item(b(i, 10) & b(i, 11)) = i
[/vba]

А потом тут
[vba]
Код
.exists(a(i, 1))
[/vba]
[vba]
Код
.exists(a(i, 1) & a(i, 2))
[/vba]

в вашем примере не увидел столбцов с другими аргументами - поэтому пример кода - приблизительный


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
такой код это ВПР который работает с массивом, но тут реализован поиск по одному аргументу а мне надо хотя бы по двум

ну так добавьте аргументы:
тут:
[vba]
Код
.Item(b(i, 10)) = i
[/vba]
[vba]
Код
.Item(b(i, 10) & b(i, 11)) = i
[/vba]

А потом тут
[vba]
Код
.exists(a(i, 1))
[/vba]
[vba]
Код
.exists(a(i, 1) & a(i, 2))
[/vba]

в вашем примере не увидел столбцов с другими аргументами - поэтому пример кода - приблизительный

Автор - SLAVICK
Дата добавления - 19.01.2017 в 22:56
bmv98rus Дата: Четверг, 19.01.2017, 23:43 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
Elhust,

Что-то я не понял, есть доступ к SQL или нет? Если таки есть, то сколько строк в "фильтре" . Порой проще сделать несколько запросов по каждой строке и если есть понимание, как связать информацию, то это не проблема , а лишний раз дернуть SQL не стоит боятся., переварит. К стати если изветно поле что вам нужно Select * тоже, как бы лишнеее.

anvg,
Join - Идеальный вариант, я его не стал рассматривать, предположив что доступ максимум на Read. Будь я DBA я б точно токое не поволил.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеElhust,

Что-то я не понял, есть доступ к SQL или нет? Если таки есть, то сколько строк в "фильтре" . Порой проще сделать несколько запросов по каждой строке и если есть понимание, как связать информацию, то это не проблема , а лишний раз дернуть SQL не стоит боятся., переварит. К стати если изветно поле что вам нужно Select * тоже, как бы лишнеее.

anvg,
Join - Идеальный вариант, я его не стал рассматривать, предположив что доступ максимум на Read. Будь я DBA я б точно токое не поволил.

Автор - bmv98rus
Дата добавления - 19.01.2017 в 23:43
anvg Дата: Пятница, 20.01.2017, 00:27 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
доступа к базе не

Это как нет доступа к базе данные, когда вы к ней запрос выполняете?
проблема в том что уникальных полей нет
Тогда как вы собираетесь сопоставлять данные на листе с данными запроса? К чему тогда нужен искомый вами "ВПР" по нескольким полям?

Набросок кода для обдумывания
[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
    
    pConn.Open "Provider=SQLOLEDB.1;Data Source=177.17.3.176;Initial Catalog=MainDWH;User ID=Login;Password=Password;"
    pConn.Execute "Create Table #selTable (FirstName nvarchar(32), LastName nvarchar(32))", Options:=adExecuteNoRecords
    
    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 должна быть подключена явно. Естественно, какой подход выбрать - фильтровать ли на стороне сервера или клиента зависит от объёма передаваемых данных, по крайней мере, логически.

Будь я DBA я б точно токое не поволил.
Запретить доступ к 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
    
    pConn.Open "Provider=SQLOLEDB.1;Data Source=177.17.3.176;Initial Catalog=MainDWH;User ID=Login;Password=Password;"
    pConn.Execute "Create Table #selTable (FirstName nvarchar(32), LastName nvarchar(32))", Options:=adExecuteNoRecords
    
    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 должна быть подключена явно. Естественно, какой подход выбрать - фильтровать ли на стороне сервера или клиента зависит от объёма передаваемых данных, по крайней мере, логически.

Будь я DBA я б точно токое не поволил.
Запретить доступ к tempdb (а именно там создаются временные таблицы) - это всё равно как запретить пользователю Windows доступ к его папке Temp :) . Конечно можно, только после запуска сервера - слетит и потребует настройки (да можно конечно и job на запуск повесить).
Временные таблицы удаляются при закрытии подключения автоматически, ну, или по закрытию Excel, если пользователь "забыл" это выполнить в коде.

Автор - anvg
Дата добавления - 20.01.2017 в 00:27
bmv98rus Дата: Пятница, 20.01.2017, 09:29 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
[offtop]
Запретить доступ к tempdb
Согласен. Ступил. Редко пользуюсь и как правило хранимки заказываю, про tempdb забыл окнчательно.[/offtop]


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение[offtop]
Запретить доступ к tempdb
Согласен. Ступил. Редко пользуюсь и как правило хранимки заказываю, про tempdb забыл окнчательно.[/offtop]

Автор - bmv98rus
Дата добавления - 20.01.2017 в 09:29
Elhust Дата: Четверг, 26.01.2017, 13:34 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
[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

Conn.Execute = "CREATE TABLE #AFS" _
             & "(BPID int," _
             & "lastName nvarchar(20)," _
             & "firstName nvarchar(20)," _
             & "secondName nvarchar(20)," _
             & " birthDate datetime," _
             & "sex nvarchar(1)," _
             & "seriesNumber nvarchar(12)," _
             & " docdate datetime," _
             & "AfsMessage nvarchar(1000));" _
             & "INSERT INTO #AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)" _
             & "SELECT ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT" _
             & "FROM Port.Ankets"

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

Conn.Execute = "CREATE TABLE #AFS" _
             & "(BPID int," _
             & "lastName nvarchar(20)," _
             & "firstName nvarchar(20)," _
             & "secondName nvarchar(20)," _
             & " birthDate datetime," _
             & "sex nvarchar(1)," _
             & "seriesNumber nvarchar(12)," _
             & " docdate datetime," _
             & "AfsMessage nvarchar(1000));" _
             & "INSERT INTO #AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)" _
             & "SELECT ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT" _
             & "FROM Port.Ankets"

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
Дата добавления - 26.01.2017 в 13:34
anvg Дата: Четверг, 26.01.2017, 18:59 | Сообщение № 17
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Цитата
Conn.Open
А где собственно подключение? В том смысле, что вы открываете?


Сообщение отредактировал anvg - Четверг, 26.01.2017, 19:00
 
Ответить
СообщениеДоброе время суток.
Цитата
Conn.Open
А где собственно подключение? В том смысле, что вы открываете?

Автор - anvg
Дата добавления - 26.01.2017 в 18:59
Elhust Дата: Пятница, 27.01.2017, 08:23 | Сообщение № 18
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
Sub test_conn()
Dim Conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set Conn = New ADODB.Connection

Conn.ConnectionString = "driver={SQL Server};server=177.17.3.176;uid=MyLog;pwd=MyPass;database=MainDWH"
Conn.Open

Set rs = Conn.Execute(ActiveWorkbook.Sheets("Лист2").Range("A1").Value)

End Sub
[/vba]
в ячейке вот это
[vba]
Код
CREATE TABLE ##AFS
(
BPID int,
lastName nvarchar(20),
firstName nvarchar(20),
secondName nvarchar(20),
birthDate datetime,
sex nvarchar(1),
seriesNumber nvarchar(12),
docdate datetime,
AfsMessage nvarchar(1000)
);
INSERT INTO ##AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)
SELECT TOP 100 ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT
FROM Port.Ankets
[/vba]
вот так ошибки не выдаёт


Каждый сам выбирает правила игры
 
Ответить
Сообщение[vba]
Код
Sub test_conn()
Dim Conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set Conn = New ADODB.Connection

Conn.ConnectionString = "driver={SQL Server};server=177.17.3.176;uid=MyLog;pwd=MyPass;database=MainDWH"
Conn.Open

Set rs = Conn.Execute(ActiveWorkbook.Sheets("Лист2").Range("A1").Value)

End Sub
[/vba]
в ячейке вот это
[vba]
Код
CREATE TABLE ##AFS
(
BPID int,
lastName nvarchar(20),
firstName nvarchar(20),
secondName nvarchar(20),
birthDate datetime,
sex nvarchar(1),
seriesNumber nvarchar(12),
docdate datetime,
AfsMessage nvarchar(1000)
);
INSERT INTO ##AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)
SELECT TOP 100 ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT
FROM Port.Ankets
[/vba]
вот так ошибки не выдаёт

Автор - Elhust
Дата добавления - 27.01.2017 в 08:23
Elhust Дата: Пятница, 27.01.2017, 09:06 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
а если пишу код методом
[vba]
Код

Set rs = Conn.Execute("CREATE TABLE #AFS" _
            & "(BPID int," _
            & "lastName nvarchar(20)," _
            & "firstName nvarchar(20)," _
            & "secondName nvarchar(20)," _
            & " birthDate datetime," _
            & "sex nvarchar(1)," _
            & "seriesNumber nvarchar(12)," _
            & " docdate datetime," _
            & "AfsMessage nvarchar(1000));" _
            & "INSERT INTO #AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)" _
            & "SELECT ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT" _
            & "FROM Port.Ankets")
[/vba]
то та же ошибка и + лимит строк 15 для ввода


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Пятница, 27.01.2017, 09:08
 
Ответить
Сообщениеа если пишу код методом
[vba]
Код

Set rs = Conn.Execute("CREATE TABLE #AFS" _
            & "(BPID int," _
            & "lastName nvarchar(20)," _
            & "firstName nvarchar(20)," _
            & "secondName nvarchar(20)," _
            & " birthDate datetime," _
            & "sex nvarchar(1)," _
            & "seriesNumber nvarchar(12)," _
            & " docdate datetime," _
            & "AfsMessage nvarchar(1000));" _
            & "INSERT INTO #AFS(BPID,lastName, firstName,secondName,birthDate,sex,seriesNumber,docdate)" _
            & "SELECT ANKETA_ID,ANKETA_FAM,ANKETA_IM,ANKETA_OT,ANKETA_BIRTH_DATE,ANKETA_SEX,ANKETA_SERIESPASSPORT,ANKETA_DATEPASSPORT" _
            & "FROM Port.Ankets")
[/vba]
то та же ошибка и + лимит строк 15 для ввода

Автор - Elhust
Дата добавления - 27.01.2017 в 09:06
Elhust Дата: Пятница, 27.01.2017, 12:27 | Сообщение № 20
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код

Set rs = Conn.Execute("CREATE TABLE #AFS" &  _
            "(BPID int")
[/vba]
Вот оно как оказывается )


Каждый сам выбирает правила игры
 
Ответить
Сообщение[vba]
Код

Set rs = Conn.Execute("CREATE TABLE #AFS" &  _
            "(BPID int")
[/vba]
Вот оно как оказывается )

Автор - Elhust
Дата добавления - 27.01.2017 в 12:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подключиться к базе "SSMSE" с проверкой данных (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!