Avevo anche lo stesso esatto requisito e sebbene la doppia domanda Excel macro to change external data query connections - e.g. point from one database to another fosse utile, dovevo ancora modificarla per soddisfare i requisiti precisi sopra. Stavo lavorando con una connessione specifica, mentre quella risposta mirava a più connessioni. Quindi, ho incluso il mio lavoro qui. Grazie @Rory per il suo codice.
Anche grazie a Luke Maxwell per la sua funzione a search a string for matching keywords.
Assegna questo sottotitolo a un pulsante o chiamalo quando il foglio di calcolo è aperto.
Sub GetConnectionUserPassword()
Dim Username As String, Password As String
Dim ConnectionString As String
Dim MsgTitle As String
MsgTitle = "My Credentials"
If vbOK = MsgBox("You will be asked for your username and password.", vbOKCancel, MsgTitle) Then
Username = InputBox("Username", MsgTitle)
If Username = "" Then GoTo Cancelled
Password = InputBox("Password", MsgTitle)
If Password = "" Then GoTo Cancelled
Else
GoTo Cancelled
End If
ConnectionString = GetConnectionString(Username, Password)
' MsgBox ConnectionString, vbOKOnly
UpdateQueryConnectionString ConnectionString
MsgBox "Credentials Updated", vbOKOnly, MsgTitle
Exit Sub
Cancelled:
MsgBox "Credentials have not been changed.", vbOKOnly, MsgTitle
End Sub
La funzione GetConnectionString memorizza la stringa di connessione che si inserisce il nome utente e la password in. Questo è per una connessione OLEDB ed è ovviamente diverso a seconda dei requisiti del Provider.
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
Questo codice fa il lavoro di realtà l'aggiornamento di una connessione denominata con la nuova stringa di connessione (per la connessione OLE DB).
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
Al contrario, è possibile utilizzare questa funzione per ottenere qualunque sia la stringa di connessione corrente.
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
Io uso questo sub per aggiornare i dati quando si apre la cartella di lavoro, ma controlla che ci sia un nome utente e una password nella stringa di connessione prima di fare l'aggiornamento. Ho appena chiamato questo sub da 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
Ecco la funzione ListSearch di Luke. Restituisce il numero di corrispondenze che ha trovato.
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
Infine, se si vuole essere in grado di rimuovere le credenziali, basta assegnare questo sub a un pulsante.
Sub RemoveCredentials()
Dim ConnectionString As String
ConnectionString = GetConnectionString("None", "None")
UpdateQueryConnectionString ConnectionString
MsgBox "Credentials have been removed.", vbOKOnly, "Your Credentials"
End Sub
Spero che questo aiuti un'altra persona come me, che stava cercando di risolvere questo problema in fretta.
http://support.microsoft.com/kb/257819 è probabilmente un punto di partenza. –
non ci limitiamo a dare il codice ... un suggerimento sarebbe di usare il sotto workbook_open per mostrare un userform o caselle di testo che richiedono le credenziali. salvandolo nelle variabili globali quindi utilizzandole nella stringa di connessione. –
@mehow Capisco, non ho mai chiesto una soluzione diretta. Stavo chiedendo esempi di casi simili. Mi dispiace se ti ha offeso. In secondo luogo, voglio fare ciò che hai menzionato, ma non è questo il problema che sto affrontando. Sto cercando un modo per modificare la stringa di connessione ESISTENTE di una connessione dati che ho impostato (vedi screenshot sopra). Spero che aiuti? Grazie mille, Pranav – SillyCoda