Ich hatte auch genau diese Anforderung und obwohl die doppelte Frage Excel macro to change external data query connections - e.g. point from one database to another war nützlich, musste ich noch ändern, um die genauen Anforderungen zu erfüllen. Ich arbeitete mit einer bestimmten Verbindung, während diese Antwort auf mehrere Verbindungen abzielte. Also habe ich meine Arbeitsweise hier aufgenommen. Danke @Rory für seinen Code.
Auch dank Luke Maxwell für seine Funktion zu search a string for matching keywords.
Weisen Sie diese Schaltfläche einer Schaltfläche zu oder rufen Sie sie auf, wenn die Tabelle geöffnet wird.
Die GetConnectionString-Funktion speichert die Verbindungszeichenfolge, in die Sie Ihren Benutzernamen und Ihr Kennwort eingeben. Dieser ist für eine OLEDB-Verbindung und unterscheidet sich offensichtlich in Abhängigkeit von den Anforderungen des Providers.
Function GetConnectionString(Username As String, Password As String)
Dim result As Variant
result = "OLEDB;Provider=Your Provider;Data Source=SERVER;Initial Catalog=DATABASE" _
& ";User ID=" & Username & ";Password=" & Password & _
";Persist Security Info=True;Extended Properties=" _
& Chr(34) & "PORT=1706;LOG=ON;CASEINSENSITIVEFIND=ON;INCLUDECALCFIELDS=ON;" & Chr(34)
' MsgBox result, vbOKOnly
GetConnectionString = result
End Function
Dieser Code macht den Job tatsächlich eine benannte Verbindung mit dem neuen Verbindungszeichenfolge (für eine OLEDB-Verbindung) zu aktualisieren.
Sub UpdateQueryConnectionString(ConnectionString As String)
Dim cn As WorkbookConnection
Dim oledbCn As OLEDBConnection
Set cn = ThisWorkbook.Connections("Your Connection Name")
Set oledbCn = cn.OLEDBConnection
oledbCn.Connection = ConnectionString
End Sub
Umgekehrt können Sie diese Funktion verwenden, um die aktuelle Verbindungszeichenfolge abzurufen.
Function ConnectionString()
Dim Temp As String
Dim cn As WorkbookConnection
Dim oledbCn As OLEDBConnection
Set cn = ThisWorkbook.Connections("Your Connection Name")
Set oledbCn = cn.OLEDBConnection
Temp = oledbCn.Connection
ConnectionString = Temp
End Function
Ich benutze diese Unter den Daten zu aktualisieren, wenn die Arbeitsmappe geöffnet wird, aber es überprüft, ob es ein Benutzername und Kennwort in der Verbindungszeichenfolge, bevor die Refresh tun. Ich rufe gerade dieses Sub aus dem Private Sub Workbook_Open().
Sub RefreshData()
Dim CurrentCredentials As String
Sheets("Sheetname").Unprotect Password:="mypassword"
CurrentCredentials = ConnectionString()
If ListSearch(CurrentCredentials, "None", "") > 0 Then
GetConnectionUserPassword
End If
Application.ScreenUpdating = False
ActiveWorkbook.Connections("My Connection Name").Refresh
Sheets("Sheetname").Protect _
Password:="mypassword", _
UserInterfaceOnly:=True, _
AllowFiltering:=True, _
AllowSorting:=True, _
AllowUsingPivotTables:=True
End Sub
Hier ist die ListSearch-Funktion von Luke. Es gibt die Anzahl der Übereinstimmungen zurück, die es gefunden hat.
Function ListSearch(text As String, wordlist As String, seperator As String, Optional caseSensitive As Boolean = False)
Dim intMatches As Integer
Dim res As Variant
Dim arrWords() As String
intMatches = 0
arrWords = Split(wordlist, seperator)
On Error Resume Next
Err.Clear
For Each word In arrWords
If caseSensitive = False Then
res = InStr(LCase(text), LCase(word))
Else
res = InStr(text, word)
End If
If res > 0 Then
intMatches = intMatches + 1
End If
Next word
ListSearch = intMatches
End Function
Schließlich, wenn Sie in der Lage sein möchten, die Anmeldeinformationen zu entfernen, ordnen Sie dieses Sub nur einer Schaltfläche zu.
Ich hoffe, dies hilft einer anderen Person wie mir, die dieses Problem schnell lösen wollte.
http://support.microsoft.com/kb/257819 ist wahrscheinlich ein Ort zum Starten. –
geben wir nicht einfach Code ... ein Vorschlag wäre, workbook_open sub zu verwenden, um ein Benutzerformular oder Eingabefelder anzuzeigen, die nach den Anmeldeinformationen fragen. Speichern Sie es in die globalen Variablen und verwenden Sie sie dann in der Verbindungszeichenfolge. –
@mehow Ich verstehe, ich habe nie nach einer direkten Lösung gefragt. Ich habe nach ähnlichen Fällen gefragt. Es tut mir leid, wenn dich das beleidigt hat. Zweitens möchte ich tun, was Sie erwähnten, aber das ist nicht das Problem, das ich habe. Ich suche nach einer Möglichkeit, die bestehende Verbindungszeichenfolge einer Datenverbindung, die ich eingerichtet habe, zu editieren (siehe Screenshot oben). Ich hoffe das hilft? Vielen Dank, Pranav – SillyCoda