Passar um conteúdo de célula como um parâmetro para uma consulta do Excel no Excel 2007

2

Eu tentei realmente resolver esse problema, mas acho que vou precisar de um pouco de ajuda. Eu posso programar em diferentes idiomas, mas eu não tenho nenhuma experiência com Excel, VBA ou as consultas que você pode fazer, então sinta-se à vontade para me tratar como uma criança e mencionar todos os pequenos detalhes.

O que eu gostaria de fazer é pegar o conteúdo em três células diferentes e usá-las como parâmetros em uma consulta SQL.

No momento, não tenho problemas para criar a consulta como mencionado aqui Executar uma consulta SQL com um parâmetro do Excel 2007 e posso escolher os parâmetros das células ONCE (substituindo as strings por '?').

Mas eu gostaria de chamar a consulta várias vezes como uma função normal, apenas colocando-a em uma célula como '= MyQuery ($ A $ 1, $ A $ 2, $ A $ 3)'

O "Banco de dados" é apenas outro arquivo do Excel escolhido a partir de fontes externas, então não sei se as coisas mudam no código do VBA.

Eu seria realmente útil se você pudesse me apontar na direção certa, mesmo que sejam apenas peças do quebra-cabeça. Eu preciso de uma maneira de chegar à consulta, uma maneira de modificá-lo e uma maneira de executar ... mas, como de costume, o diabo está nos detalhes.

    
por Terco 09.06.2011 / 01:23

2 respostas

3

Aqui está a maneira dinâmica do SQL, ADODB para fazer isso (certifique-se e adicione a referência ADODB). Isto foi construído para valores de string nas células. Também não há código para captura de erros, por favor adicione isso conforme necessário:

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

Aqui está o ADODB, o Parâmetro de Comando, um pouco mais complicado. Este é apenas configurado para caracteres únicos:

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
    
por 09.06.2011 / 09:11
0

Você pode manipular as conexões em sua pasta de trabalho usando o vba. Por exemplo, você pode criar uma string de consulta sql e aplicá-la à propriedade CommandText e, em seguida, Refresh

Aqui está um degustador

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
    
por 09.06.2011 / 08:34