Você pode utilizar a função DLookup para obter o valor de um determinado campo de um conjunto especificado de registros (um domínio). Utilize a função DLookup em um módulo do VBA, uma macro, uma expressão de consulta ou um controle calculado de um formulário ou relatório.
É possível utilizar a função DLookup para exibir o valor de um campo que não esteja na origem de registro do seu formulário ou relatório. Por exemplo, suponhamos que tenha um formulário baseado em uma tabela Order Details. O formulário exibe os campos OrderID, ProductID, UnitPrice, Quantity e Discount. No entanto, o campo ProductName está em outra tabela. Você poderia utilizar a função DLookup em um controle calculado para exibir oProductName no mesmo formulário.
Sintaxe: DLookup (expr, domínio [, critérios] )
exprEste parâmetro é obrigatório. Uma expressão que identifica o campo numérico cujos valores deseja retornar. Pode ser uma expressão em seqüência que identifica um campo em uma tabela ou consulta, ou pode ser uma expressão que realiza um cálculo de dados daquele campo. Em expr, você pode incluir o nome de um campo em uma tabela, um controle em um formulário, uma constante ou uma função. Se expr incluir uma função, ela poderá ser interna ou definida pelo usuário, mas não pode ser outra função de agregação de domínio ou de agregação SQL.domínioTambém obrigatório. Uma expressão em seqüência que identifica o conjunto de registros que constitui o domínio. Pode ser um nome de tabela ou de consulta para uma consulta que não requer um parâmetro.critériosEste é opcional. Uma expressão em seqüência que limita o intervalo de dados em que a função DLookup é executada. Por exemplo, geralmente, critérios é equivalente à cláusula WHERE de uma expressão SQL, sem a palavra WHERE. Se critérios for omitido, a função DLookup avaliará expr em relação a todo o domínio. Qualquer campo que seja incluído em critérios deverá também ser um campo em domínio; caso contrário, a função DLookup retornará um Null.
Dicas
Embora você possa utilizar a função DLookup para exibir um valor em um campo de uma tabela externa, pode ser mais eficiente criar uma consulta que contenha os campos necessários em ambas as tabelas e basear seu formulário ou relatório nessa consulta.
Também é possível usar o Assistente de Pesquisa para localizar valores em uma tabela externa.
As alterações feitas em registros de domínio e que não foram salvas não serão incluídas quando essa função for usada. Para que a função DLookup seja baseada nos valores alterados, primeiramente, é preciso salvar as alterações clicando em Salvar Registro, em Registros, na guia Dados, movendo o foco para outro registro ou utilizando o método Update.
Talvez possa usar esse código pronto que poderá lhe auxiliar. Ele foi desenvolvido pelo Allen Browne.
Às vezes quando vemos um comando, funcionalidade sendo utilizado de outra maneira, acabamos compreendendo-o melhor.
- CÓDIGO: SELECIONAR TUDO
Public Function ELookup(Expr As String, Domain As String, Optional Criteria As Variant, _
Optional OrderClause As Variant) As Variant
On Error GoTo Err_ELookup
'Purpose: Faster and more flexible replacement for DLookup()
'Arguments: Same as DLookup, with additional Order By option.
'Return: Value of the Expr if found, else Null.
' Delimited list for multi-value field.
'Author: Allen Browne. allen@allenbrowne.com
'Updated: December 2006, to handle multi-value fields (Access 2007 and later.)
'Examples:
' 1. To find the last value, include DESC in the OrderClause, e.g.:
' ELookup("[Surname] & [FirstName]", "tblClient", , "ClientID DESC")
' 2. To find the lowest non-null value of a field, use the Criteria, e.g.:
' ELookup("ClientID", "tblClient", "Surname Is Not Null" , "Surname")
'Note: Requires a reference to the DAO library.
Dim db As DAO.Database 'This database.
Dim rs As DAO.Recordset 'To retrieve the value to find.
Dim rsMVF As DAO.Recordset 'Child recordset to use for multi-value fields.
Dim varResult As Variant 'Return value for function.
Dim strSql As String 'SQL statement.
Dim strOut As String 'Output string to build up (multi-value field.)
Dim lngLen As Long 'Length of string.
Const strcSep = "," 'Separator between items in multi-value list.
'Initialize to null.
varResult = Null
'Build the SQL string.
strSql = "SELECT TOP 1 " & Expr & " FROM " & Domain
If Not IsMissing(Criteria) Then
strSql = strSql & " WHERE " & Criteria
End If
If Not IsMissing(OrderClause) Then
strSql = strSql & " ORDER BY " & OrderClause
End If
strSql = strSql & ";"
'Lookup the value.
Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset(strSql, dbOpenForwardOnly)
If rs.RecordCount > 0 Then
'Will be an object if multi-value field.
If VarType(rs(0)) = vbObject Then
Set rsMVF = rs(0).Value
Do While Not rsMVF.EOF
If rs(0).Type = 101 Then 'dbAttachment
strOut = strOut & rsMVF!FileName & strcSep
Else
strOut = strOut & rsMVF![Value].Value & strcSep
End If
rsMVF.MoveNext
Loop
'Remove trailing separator.
lngLen = Len(strOut) - Len(strcSep)
If lngLen > 0& Then
varResult = Left(strOut, lngLen)
End If
Set rsMVF = Nothing
Else
'Not a multi-value field: just return the value.
varResult = rs(0)
End If
End If
rs.Close
'Assign the return value.
ELookup = varResult
Exit_ELookup:
Set rs = Nothing
Set db = Nothing
Exit Function
Err_ELookup:
MsgBox Err.Description, vbExclamation, "ELookup Error " & Err.number
Resume Exit_ELookup
End Function
Mas é também verdade que se eu fosse compara o Dlookup vs Recordset Eficiente, escolheria o segundo. Sim, os Recordset podem beneficiar-se de campos previamente indexados, o que em bases de dados grandes, pode fazer a diferença.
Tags: VBA, Access, DLook, recordset,