2013-05-22 10 views
5

Ich habe eine ziemlich einfache Frage. Ich versuche, eine Möglichkeit zu finden, eine Verbindungszeichenfolge für eine vorhandene Datenverbindung in einer Excel-Arbeitsmappe über VBA (Makrocode) zu ändern, und zu ändern. Der Hauptgrund, warum ich das versuche, besteht darin, den Benutzer zu finden, der die Arbeitsmappe öffnet, um ihre Anmeldeinformationen einzugeben (Benutzername/Passwort) oder ein Kontrollkästchen für Vertrauenswürdige Verbindung, das in der Verbindungszeichenfolge der vorhandenen verwendet wird Datenverbindungen.Microsoft Excel-Datenverbindungen - Ändern der Verbindungszeichenfolge über VBA

Data Connection Properties

Gerade jetzt die Datenverbindungen führen eine Probe Benutzer aus, die ich erstellt und das muss in der Produktionsversion der Arbeitsmappe gehen weg. Hoffnung, die Sinn macht?

Ist das möglich? Wenn ja, könnten Sie mir bitte einen Beispiel-/Beispielcodeblock geben? Ich würde an dieser Stelle alle Vorschläge sehr begrüßen.

+1

http://support.microsoft.com/kb/257819 ist wahrscheinlich ein Ort zum Starten. –

+1

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. –

+0

@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

Antwort

8

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.

+0

Gern geschehen! – Rory