2014-11-25 4 views
1
Option Explicit 
Public Sub Connect(strVar As String) 
Dim strEmps As String, strPath As String 
strEmps = "SELECT fldStudentNo, fldFirstName,fldLastName,fldTelephone, fldDepartmentName, fldClassDate, fldClassName" 
strEmps = strEmps & "FROM [tblDepartments] INNER JOIN tblStudents ON " 
strEmps = strEmps & "[tblDepartments].fldDepartmentNo = tblStudents.fldDeptNo " 
strEmps = strEmps & "WHERE fldDepartmentName = '" & strVar & "' ORDER BY fldLastName" 
strPath = ThisWorkbook.Path & cstrPath 
Set connEmp = New ADODB.Connection 
Set rstEmps = New ADODB.Recordset 
connEmp.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & strPath & "'" 
rstEmps.Open strEmps, connEmp, adOpenKeyset, adLockOptimistic 
Call DisplayData 
End Sub 

Мне нужно написать внутреннее соединение Access (ниже) в приведенный выше код в Excel. Я не понимаю, как делать несколько внутренних объединений. Спасибо за любую помощь, которую вы можете предоставить!Внутренний доступ MS Access к Excel

SELECT tblStudents.fldStudentNo, tblStudents.fldFirstName, tblStudents.fldLastName, tblStudents.fldTelephone, tblDepartments.fldDepartmentName, tblClasses.fldClassDate, tblClasses.fldClassName 
FROM (tblDepartments INNER JOIN tblStudents ON tblDepartments.[fldDepartmentNo] = tblStudents.[fldDeptNo]) INNER JOIN (tblClasses INNER JOIN tblStudentsAndClasses ON tblClasses.[fldClassNo] = tblStudentsAndClasses.[fldClassNo]) ON tblStudents.[fldStudentNo] = tblStudentsAndClasses.[fldStudentNo]; 

ответ

1

Если вы используете псевдонимы коротких таблиц, вы можете уйти от длинных имен таблиц, повторяющихся снова и снова. Это должно помочь уменьшить путаницу.

Option Explicit 
Public Sub Connect(strVar As String) 
    Dim strEmps As String, strPath As String 
    dim connEmp as New ADODB.Connection 
    dim rstEmps as New ADODB.Recordset 
    strEmps = "SELECT s.fldStudentNo, s.fldFirstName, s.fldLastName, s.fldTelephone, d.fldDepartmentName, c.fldClassDate, c.fldClassName" 
    strEmps = strEmps & " FROM tblDepartments d" 
    strEmps = strEmps & " INNER JOIN tblStudents s ON s.[fldDeptNo] = d.[fldDepartmentNo]" 
    strEmps = strEmps & " INNER JOIN tblStudentsAndClasses sc ON sc.[fldStudentNo] = s.[fldStudentNo]" 
    strEmps = strEmps & " INNER JOIN tblClasses c ON c.[fldClassNo] = sc.[fldClassNo]" 
    strEmps = strEmps & " WHERE d.fldDepartmentName = '×××' ORDER BY s.fldLastName;" 
    strEmps = replace(strEmps, "×××", strVar) 
    strPath = ThisWorkbook.Path & chr(92) & cstrPath '.Path doesn't usually end in a backslash 
    debug.print strPath 
    connEmp.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & strPath & "';" 
    set rstEmps = connEmp.Execute(strEmps) 
    Call DisplayData 
    rstEmps.close: set rstEmps = nothing 
    connEmp.close: set connEmp = nothing 
End Sub 

EDIT: без создания полной тестовой среды, это, вероятно, ближе к тому, что вы ищете. Поскольку вы не указали значение cstrPath, я добавил обратную косую черту к thisworkbook.path. Также обратите внимание, что я предварял конкатенированные строки пробелами, чтобы линии не попадали друг в друга.

Смежные вопросы