I ended this approach using AD authentication. I used the example in this post for inspiration: http://www.eggheadcafe.com/community/sql-server/13/10141669/using-excel-to-update-data-on-ms-sql-tables.aspx
Note that these functions live in different areas of the Excel workbook (objects, modules, this workbook), but here is a short link.
I also have each of the columns that the FKs check for the tables that they reference.
Here are some sample code:
Public aCon As New ADODB.Connection Public aCmd As New ADODB.Command Private Sub Workbook_Open() Application.EnableEvents = False PopulateSheet Application.EnableEvents = True End Sub Sub Connect() Dim sConn As String sConn = "Provider=SQLOLEDB;Trusted_Connection=Yes;Server=[SVR];Database=[DB]" With aCon .ConnectionString = sConn .CursorLocation = adUseClient .Open End With BuildProcs End Sub Sub BuildProcs() With aCmd .ActiveConnection = aCon .CommandType = adCmdStoredProc .CommandText = "[SPROC]" .Parameters.Append .CreateParameter("@in_EmployeeID", adInteger, adParamInput) End With End Sub Sub PopulateSheet() Dim n As Integer, r As Long Dim aCmdFetchEmployees As New ADODB.Command Dim aRstEmployees As New ADODB.Recordset If aCon.State = adStateClosed Then Connect With aCmdFetchEmployees .ActiveConnection = aCon .CommandType = adCmdStoredProc .CommandText = "[SPROC]" Set aRstEmployees = .Execute End With r = aRstEmployees.RecordCount Worksheets(1).Activate Application.ScreenUpdating = False Cells(2, 1).CopyFromRecordset aRstEmployees For n = 1 To aRstEmployees.Fields.Count Cells(1, n) = aRstEmployees(n - 1).Name Cells(1, n).EntireColumn.AutoFit Next Cells(1).EntireColumn.Hidden = True End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim cell As Range If aCon.State = adStateClosed Then Connect With aCmd .Parameters(0) = Cells(Target.Row, 1) .Parameters(1) = Cells(Target.Row, 4) .Parameters(2) = Cells(Target.Row, 5) .Parameters(3) = Cells(Target.Row, 6) .Parameters(4) = Cells(Target.Row, 7) .Parameters(5) = Cells(Target.Row, 8) .Parameters(6) = Cells(Target.Row, 10) .Parameters(7) = Cells(Target.Row, 11) .Parameters(8) = Cells(Target.Row, 12) .Parameters(9) = Cells(Target.Row, 13) .Parameters(10) = Cells(Target.Row, 14) .Parameters(11) = Cells(Target.Row, 15) .Parameters(12) = Cells(Target.Row, 16) .Execute , , adExecuteNoRecords End With End Sub
source share