2

Я очень старался решить эту проблему, но думаю, что мне понадобится небольшая помощь. Я могу программировать на разных языках, но у меня нет опыта работы с Excel, VBA или вопросами, которые вы можете задать, поэтому, пожалуйста, не стесняйтесь обращаться со мной как с маленьким ребенком и упоминать все мелочи.

Я хотел бы взять содержимое в трех разных ячейках и использовать их в качестве параметров в запросе SQL.

Прямо сейчас у меня нет проблем с созданием запроса, как упомянуто здесь. Выполните запрос SQL с параметром из Excel 2007, и я могу выбрать параметры из ячеек ОДИН РАЗ (заменяя строки на '?«).

Но я хотел бы вызывать запрос несколько раз как обычную функцию, просто поместив его в ячейку типа '= MyQuery($ A $ 1, $ A $ 2, $ A $ 3)'

"База данных" - это просто еще один файл Excel, выбранный из внешних источников, поэтому я не знаю, что изменится в коде VBA.

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

2 ответа2

3

Вот способ динамического SQL, ADODB, чтобы сделать это (убедитесь, и добавьте ссылку ADODB). Это было построено для строковых значений в ячейках. Также нет кода для отлова ошибок, добавьте его по мере необходимости:

Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer

Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSQL As String

cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"


strSQL = "Select col4 from Table_1 where col1='" & p1.Value & _
          "' and col2='" & p2.Value & _
          "' and col3='" & p3.Value & "'"

rst.Open strSQL, cnt, adOpenStatic, adLockReadOnly, adCmdText

Test = rst("col4")

rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing

End Function

Вот ADODB, способ Command-Parameter, немного сложнее. Этот просто настроен для одиночных символов:

Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer

Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ccmd As New ADODB.Command
Dim PA1 As New ADODB.Parameter, PA2 As New ADODB.Parameter  
Dim PA3 As New ADODB.Parameter

cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"
ccmd.ActiveConnection = cnt
ccmd.CommandText = _
    "SELECT col4 FROM Table_1 WHERE col1=? AND col2=? AND col3=?"
ccmd.CommandType = adCmdText

Set PA1 = ccmd.CreateParameter("first", adChar, adParamInput, 1, p1.Value)
Set PA2 = ccmd.CreateParameter("second", adChar, adParamInput, 1, p2.Value)
Set PA3 = ccmd.CreateParameter("third", adChar, adParamInput, 1, p3.Value)

ccmd.Parameters.Append PA1
ccmd.Parameters.Append PA2
ccmd.Parameters.Append PA3

Set rst = ccmd.Execute

Test = rst("col4")

rst.Close
Set rst = Nothing
cnt.Close
Set cnt = Nothing

End Function
0

Вы можете манипулировать соединениями в вашей книге с помощью vba. Например , вы можете создать строку SQL - запрос и применить его к свойству CommandText и затем Refresh

Вот дегустатор

Sub ExamineConnections()
    Dim con As WorkbookConnection

    For Each con In ActiveWorkbook.Connections
        Select Case con.Type
        Case xlConnectionTypeODBC
            Debug.Print con.Name
            Debug.Print "ODBC Connection"
            Debug.Print con.ODBCConnection.Connection
            Debug.Print con.ODBCConnection.CommandText
            Debug.Print
        Case xlConnectionTypeOLEDB
            Debug.Print con.Name
            Debug.Print "OLEDB Connection"
            Debug.Print con.OLEDBConnection.Connection
            Debug.Print con.OLEDBConnection.CommandText
            Debug.Print
        End Select
    Next
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .