2016-09-09 3 views
1

나는 VBA 및 ADODB의 도움으로 Excel에서 검색하는 액세스 데이터베이스를 가지고 있습니다.둘 이상의 열에서 검색

완벽하게 작동하지만 한 번에 한 가지만 검색 할 수 있습니다. 열 [2]의 "성"이있는 [1] 열에서 "이름"의 모든 인스턴스를 검색하려고한다고 가정 해보십시오. 또는 컬럼 [1]의 "first name"과 컬럼 [3]의 "address".

사용자 폼의 텍스트 상자에서 어떻게 처리할까요?

"Firstname + Lastname"등을 추가하려고 생각했지만 코드의 논리를 파악할 수 없습니다. 어떤 제안?

이것은 내가 지금 가지고있는 것입니다. 제안에 대한

Private Sub cmd_lookup_Click() 

    Dim cn As Object 
    Dim rs As Object 

    Set cn = CreateObject("ADODB.Connection") 
    Set sqlConnect = New ADODB.Connection 
    Set rs = CreateObject("ADODB.RecordSet") 

    sqlConnect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Source\database.accdb;Persist Security Info=False;" 

    cn.Open sqlConnect 

    rs.ActiveConnection = cn 

    SearchCriteria = "%" & searchCrit.Text & "%" 

    rs.Open "SELECT [1],[2] ,[3],[4], [5] FROM [tblDatabase]" & _ 
    "WHERE  [1] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [2] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [3] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [4] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [5] LIKE '" & SearchCriteria & "' " & _ 
    "ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 

Dim i As Integer 
If Not rs.EOF Then 
    rs.MoveFirst 
    i = 0 
    With lstLookup 
     'Code not relevant 
    End With 

    rs.Close 
    cn.Close 
    Set rs = Nothing 
    Set cn = Nothing 
    End If 
End Sub 

감사합니다 :)

+0

이렇게하는 방법에는 여러 가지가 있습니다. 나는 정보를 입력하기 위해 사용자 폼을 사용하는 경향이있다. 그런 다음 해당 입력을 변수로 저장하십시오. 비어있는 것들을 생략하기 위해서 그것은 어떤 조건부 로직 (If If If If If If If)을 요구할 것입니다. 원하는 출력을 알지 못하면 구체적으로 말하기 어렵습니다. – Kyle

+0

을 사용하면 where 문을 동적으로 OR을 포함하여 AND 또는 OR을 포함하여 동적으로 작성할 수 있습니다. 합병증은 gui와 매개 변수가 될 것이고 언제 AND 또는 OR가 될지 식별 할 수 있습니다. 그러나 AND/OR에 대해 드롭 다운 목록이나 체크 박스를 사용하고 SQL 문을 작성할 때이 값을 사용하면됩니다. – Matt

+0

여러 입력 상자가 있습니까? 양식에? 예를 들어, 세 개의 상자가있는 경우 이들을 채울 수 있습니다. 그런 다음 해당 값으로 쿼리에 AND 문을 추가하면됩니다. 상자가 비어 있으면 빈 문자열 대신 와일드 카드를 삽입 할 수 있습니다. – SandPiper

답변

0

OR 사업자로 구분 AND 페어링을 고려하십시오. 하지만 먼저 별도의 텍스트 필드 구조 정의 폼을 (각각 다른 필수 필드해야 동적 WHERE 절을 구축해야) :

First Name Search:_____________ 
Last Name Search: _____________ 
Address Search: _______________ 

을 그리고 함께 기준을 바인딩합니다. , 또는

rs.Open "SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [2] LIKE '%" & LastNameSearch & "%') " & _ 
     " OR ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " OR ([2] LIKE '%" & LastNameSearch & "%' " & _ 
     " AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 

을가 UNION vs OR 사이의 효율성을 설명하는 SQL 세계에서 자주 통합 쿼리를 사용 : 또한, 디버깅을 이유로 번호가 있지만라는 이름의 필드를 조언하지 않을 것입니다. 진정으로 동등하려면 중복을 제거하기 위해 위에 모두 DISTINCT을 추가해야합니다.

rs.Open "SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [2] LIKE '%" & LastNameSearch & "%') " & _ 
     " UNION" _ 
     " SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " UNION" _ 
     " SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([2] LIKE '%" & LastNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 
+0

안녕하세요, 제안 주셔서 감사합니다. 열 이름이 지정되었으므로 코드를 실용적인 용도로 변경했습니다. 나는 또한 단지 하나의 텍스트 상자를 사용하고 싶다. 나는 5 개 이상의 열을 검색 할 수 있습니다 (25 정도) 그리고 그들은 날짜와 시간에서 이름과 주소를 구성 요소 이름 등등에 이르기까지 모든 것입니다. "criteria1 + criteria2"를 작성하고 SQL을 가질 수 있기를 바랍니다. 열의 값과 열의 값을 찾을 수 있는지 확인하십시오. 내가 바라던 것보다 훨씬 어려워 보입니다. – Thomas

관련 문제