J'ai un document Excel qui a une macro qui, une fois exécutée, modifiera une CommandText
de cette connexion pour transmettre des paramètres de la feuille de calcul Excel, comme suit:
Sub RefreshData()
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary")
.OLEDBConnection.CommandText = "Job_Cost_Code_Transaction_Summary_Percentage_Pending @monthEndDate='" & Worksheets("Cost to Complete").Range("MonthEndDate").Value & "', @job ='" & Worksheets("Cost to Complete").Range("Job").Value & "'"
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Refresh
End Sub
J'aimerais que l'actualisation modifie non seulement la commande de connexion, mais également la connexion, car je souhaiterais également l'utiliser avec une autre base de données:
Tout comme la macro remplace les paramètres de commande par les valeurs de la feuille de calcul, j'aimerais qu'elle remplace également le nom du serveur de base de données et le nom de la base de données des valeurs de la feuille de calcul.
Une implémentation complète n'est pas nécessaire, seul le code pour modifier la connexion avec les valeurs de la feuille suffira, je devrais pouvoir le faire fonctionner à partir de là.
J'ai essayé de faire quelque chose comme ça:
ActiveWorkbook
.Connections("Job_Cost_Code_Transaction_Summary")
.OLEDBConnection.Connection = "new connection string"
mais ça ne marche pas. Merci.
La réponse à ma question est ci-dessous.
Toutes les autres réponses sont généralement correctes et se concentrent sur la modification de la connexion en cours, mais je veux simplement savoir comment définir la chaîne de connexion sur la connexion.
Le bug est venu à cela. Si vous regardez ma capture d'écran, vous verrez que la chaîne de connexion était:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ADCData_Doric;Data Source=doric-server5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LHOLDER-VM;Use Encryption for Data=False;Tag with column collation when possible=False
J'essayais de définir cette chaîne avec ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.Connection = "connection string"
Je recevais une erreur quand j'essayais simplement d'attribuer la chaîne complète à la connexion. J'ai pu envoyer à MsgBox la chaîne de connexion en cours avec cette propriété, mais je n'ai pas redéfini la chaîne de connexion sans obtenir l'erreur.
Depuis, j'ai constaté que la chaîne de connexion devait avoir OLEDB;
ajouté à la chaîne.
alors ça marche maintenant !!!
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.Connection = "OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ADCData_Doric;Data Source=doric-server5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LHOLDER-VM;Use Encryption for Data=False;Tag with column collation when possible=False"
très subtil mais c’était la punaise!
Je pense que vous êtes si près d'atteindre ce que vous voulez.
J'ai pu changer pour ODBCConnection . Désolé de ne pouvoir configurer OLEDBConnection pour tester, vous pouvez modifier les occurrences de ODBCConnection en OLEDBConnection dans votre cas.
Essayez d’ajouter ces 2 abonnés avec modification, et ajoutez ce que vous devez remplacer dans les commandes CommandText et Connection String . Remarque Si je mets .Refresh
pour mettre à jour la connexion, vous n'aurez peut-être pas besoin jusqu'à ce que l'actualisation des données soit nécessaire.
Vous pouvez modifier d'autres champs en utilisant la même idée de fractionnement, puis rejoignez-le plus tard:
Private Sub ChangeConnectionString(sInitialCatalog As String, sDataSource As String)
Dim sCon As String, oTmp As Variant, i As Long
With ThisWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection
sCon = .Connection
oTmp = Split(sCon, ";")
For i = 0 To UBound(oTmp) - 1
' Look for Initial Catalog
If InStr(1, oTmp(i), "Initial Catalog", vbTextCompare) = 1 Then
oTmp(i) = "Initial Catalog=" & sInitialCatalog
' Look for Data Source
ElseIf InStr(1, oTmp(i), "Data Source", vbTextCompare) = 1 Then
oTmp(i) = "Data Source=" & sDataSource
End If
Next
sCon = Join(oTmp, ";")
.Connection = sCon
.Refresh
End With
End Sub
Private Sub ChangeCommanText(sCMD As String)
With ThisWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection
.CommandText = sCMD
.Refresh
End With
End Sub
Vous pouvez utiliser une fonction qui prend la connexion OLEDBConnection et les paramètres à mettre à jour en tant qu'entrées et renvoie la nouvelle chaîne de connexion. Elle ressemble à la réponse de Jzz mais offre une certaine flexibilité sans avoir à modifier la chaîne de connexion dans le code VBA à chaque fois que vous souhaitez la modifier. Au pire, vous devrez ajouter de nouveaux paramètres aux fonctions.
Function NewConnectionString(conTarget As OLEDBConnection, strCatalog As String, strDataSource As String) As String
NewConnectionString = conTarget.Connection
NewConnectionString = ReplaceParameter("Initial Catalog", strCatalog)
NewConnectionString = ReplaceParameter("Data Source", strDataSource)
End Function
Function ReplaceParameter(strConnection As String, strParamName As String, strParamValue As String) As String
'Find the start and end points of the parameter
Dim intParamStart As Integer
Dim intParamEnd As Integer
intParamStart = InStr(1, strConnection, strParamName & "=")
intParamEnd = InStr(intParamStart + 1, strConnection, ";")
'Replace the parameter value
Dim strConStart As String
Dim strConEnd As String
strConStart = Left(strConnection, intParamStart + Len(strParamName & "=") - 1)
strConEnd = Right(strConnection, Len(strConnection) - intParamEnd + 1)
ReplaceParameter = strConStart & strParamValue & strConEnd
End Function
Notez que j'ai modifié ceci à partir du code existant que j'ai utilisé pour une application particulière. Il est donc partiellement testé et peut nécessiter quelques modifications avant qu'il ne réponde totalement à vos besoins.
Notez également qu'il faudra également un code d'appel, à savoir (en supposant que le nouveau catalogue et la nouvelle source de données soient stockés dans des cellules de la feuille de calcul):
Sub UpdateConnection(strConnection As String, rngNewCatalog As Range, rngNewSource As Range)
Dim conTarget As OLEDBConnection
Set conTarget = ThisWorkbook.Connections.OLEDBConnection(strConnection)
conTarget.Connection = NewConnectionString(conTarget, rngNewCatalog.Value, rngNewSource.Value)
conTarget.Refresh
End Sub
Je souhaiterais donner ma petite contribution ici à cet ancien sujet . Si vous avez plusieurs connexions dans votre fichier Excel et que vous souhaitez modifier le nom de la base de données et le serveur de base de données pour chacun d'eux, vous pouvez utiliser le code suivant bien:
De cette façon, vous n'avez pas besoin d'utiliser replace et de connaître la valeur précédente, et le reste de la chaîne restera intact .. .. Nous pouvons également faire référence à un nom de cellule afin que vous puissiez avoir des noms dans votre fichier Excel.
J'espère que ça peut aider
Sub RelinkConnections()
Dim currConnValues() As String
For Each currConnection In ThisWorkbook.Connections
currConnValues = Split(currConnection.OLEDBConnection.Connection, ";")
For i = 0 To UBound(currConnValues)
If (InStr(currConnValues(i), "Initial Catalog") <> 0) Then
currConnValues(i) = "Initial Catalog=" + Range("DBName").value
ElseIf (InStr(currConnValues(i), "Data Source") <> 0) Then
currConnValues(i) = "Data Source=" + Range("DBServer").value
End If
Next
currConnection.OLEDBConnection.Connection = Join(currConnValues, ";")
currConnection.Refresh
Next
End Sub
Cela devrait faire l'affaire:
Sub jzz()
Dim conn As Variant
Dim connectString As String
For Each conn In ActiveWorkbook.Connections
connectString = conn.ODBCConnection.Connection
connectString = Replace(connectString, "Catalog=ADCData_Doric", "Catalog=Whatever")
connectString = Replace(connectString, "Data Source=doric-server5", "Data Source=Whatever")
conn.ODBCConnection.Connection = connectString
Next conn
End Sub
Il boucle toutes les connexions de votre classeur et modifie la chaîne de connexion (dans les 2 instructions de remplacement).
Donc pour modifier votre exemple:
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").ODBCConnection.Connection = "new connection string"
Je suppose qu'il est nécessaire que vous gardiez le même nom de connexion? Sinon, il serait plus simple de l'ignorer et de créer une nouvelle connexion.
Vous pouvez renommer la connexion et en créer une nouvelle en utilisant le nom suivant:
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Name = "temp"
'or, more drastic:
'ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").Delete
ActiveWorkbook.Connections.Add "Job_Cost_Code_Transaction_Summary", _
"a description", "new connection string", "command text" '+ ,command type
Ensuite, Delete
cette connexion et rétablir l’ancienne connexion/nom. (Je suis incapable de le tester moi-même actuellement, donc marchez prudemment .)
Vous pouvez également modifier les connexions en cours SourceConnectionFile
:
ActiveWorkbook.Connections("Job_Cost_Code_Transaction_Summary").OLEDBConnection.SourceConnectionFile = "..file location.."
Cela fait généralement référence à un fichier .odc (connexion de données Office) enregistré sur votre système contenant les détails de la connexion. Vous pouvez créer ce fichier à partir du panneau de configuration de Windows.
Vous n'avez pas spécifié, mais un fichier .odc peut être ce que votre connexion actuelle utilise.
Encore une fois, je ne suis pas en mesure de tester ces suggestions. Vous devez donc vous renseigner davantage et prendre certaines précautions afin de ne pas risquer de perdre les informations de connexion actuelles.