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