Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

MAJ liaison vers BD d'un Tableau Croisé Dynamique

3 réponses
Avatar
Nabil
Bonjour

J'ai un souci avec un XLS contenant un tableau crois=E9=20
dynamique et se trouvant sur un r=E9seau.
Il est utilis=E9 sous NT et sous XP (donc sous 97 et 2002).
Il est li=E9 =E0 une base Access et lors du passage sous XP il=20
perd la liaison vers le fichier.=20
Apparemment il faut passer obligatoirement par une=20
connexion de type ODBC.

La solution que j'ai trouv=E9e est d'utiliser une connexion=20
via une source de donn=E9es de type fichier (extension .dsn)
Du coup =E7a marche sous NT et XP et quelque soit la machine=20
(ce n'est pas une source syst=E8me) et c'est transparent=20
quelque soit l'utilisateur.
Si quelqu'un peut me confirmer que c'est une bonne=20
solution et qu'il n'y en a pas d'autres .

De plus je ne suis pas arriv=E9 via l'interface =E0 modifier=20
cette source.=20
Pour ne pas avoir un recr=E9er le TCD j'ai du faire cette=20
proc=E9dure qui me permet de modifier directement la liaison=20
=E0 la base de donn=E9es d'un TCD.
Quelqu'un pourrait me confirmer que =E7a marche (mes tests=20
sont bons) et qu'il n'y a pas de solution plus simple.

Merci par avance



*****************

sub updateTCD()

Dim deb, fin As Long
Dim listeparam() As String
Dim feuille As Worksheet
Dim tableau As PivotTable
Dim sdArray As Variant
Dim j As Integer

For Each feuille In Sheets
If feuille.PivotTables.Count > 0 Then
MsgBox "Dans """ & feuille.Name & """ il y a " &=20
feuille.PivotTables.Count & " TCD"
For Each tableau In feuille.PivotTables
sdArray =3D tableau.SourceData
str =3D sdArray(LBound(sdArray))
str2 =3D ""
str3 =3D ""
str4 =3D ""
message =3D ""

listeparam =3D Split(str, ";")
For j =3D 0 To UBound(listeparam())
str2 =3D str2 & Chr(13) & " " & listeparam(j)
Next
str2 =3D " Nom : " & tableau.Name & Chr(13) & str2
message =3D "Parametres de votre TCD : " & Chr(13) & str2

deb =3D InStr(1, str, "DBQ=3D", vbTextCompare)
If deb > 0 Then
fin =3D InStr(deb, str, ";", vbTextCompare)
str3 =3D Left(str, fin - 1)
str3 =3D Right(str3, Len(str3) - deb - 3)

message =3D message & Chr(13) & Chr(13) & _
"Voulez vous modifier cette r=E9f=E9rence ? " & Chr(13) & _
" Base de donn=E9e =3D " & str3

deb =3D InStr(1, str, "DSN=3D", vbTextCompare)
If deb > 0 Then
fin =3D InStr(deb, str, ";", vbTextCompare)
str4 =3D Left(str, fin - 1)
str4 =3D Right(str4, Len(str4) - deb - 3)
message =3D message & Chr(13) & _
" DSN =3D " & str4
End If



If MsgBox(message, vbYesNo) =3D vbYes Then
Stop
sdArray(LBound(sdArray)) =3D ""
tableau.SourceData =3D sdArray
End If
End If
Next
End If 'Feuille avec TCD
Next

end sub

**************

Nabil

3 réponses

Avatar
michdenis
Bonjour Nabil,

L'utilisation d'un fichier .DSN ( enregistrement d'une requête query) est destiné à cet objectif.

Ce fichier lorsqu'il est crée permet à tout utilisateur de l'appeler dans son application (si ce fichier est placé dans
un répertoire réseau accessible aux usagers).. sans avoir à refaire toutes les manipulations.

Attention : Lorsqu'une requête Via un fichier .DSN (ou sans) est effectué dans un fichier excel, la requête et la
liaison au fichier source sont enregistrées dans le fichier excel comme n'importe quelle donnée du classeur. En
conséquence, même si on modifie le fichier de la requête .DSN , cela n'a aucune incidence sur les fichiers excel ayant
déjà utilisés comme source cette requête.

Si on veut modifier la source (fichier) d'une requête ou la requête elle-même déjà existante dans un fichier excel, on
doit utiliser les propriétés suivantes de l'objet "querytable" : "Connection" et "CommandText" dans une procédure VBA.


Salutations!



"Nabil" a écrit dans le message de news:35dc01c375e2$c2486950$
Bonjour

J'ai un souci avec un XLS contenant un tableau croisé
dynamique et se trouvant sur un réseau.
Il est utilisé sous NT et sous XP (donc sous 97 et 2002).
Il est lié à une base Access et lors du passage sous XP il
perd la liaison vers le fichier.
Apparemment il faut passer obligatoirement par une
connexion de type ODBC.

La solution que j'ai trouvée est d'utiliser une connexion
via une source de données de type fichier (extension .dsn)
Du coup ça marche sous NT et XP et quelque soit la machine
(ce n'est pas une source système) et c'est transparent
quelque soit l'utilisateur.
Si quelqu'un peut me confirmer que c'est une bonne
solution et qu'il n'y en a pas d'autres .

De plus je ne suis pas arrivé via l'interface à modifier
cette source.
Pour ne pas avoir un recréer le TCD j'ai du faire cette
procédure qui me permet de modifier directement la liaison
à la base de données d'un TCD.
Quelqu'un pourrait me confirmer que ça marche (mes tests
sont bons) et qu'il n'y a pas de solution plus simple.

Merci par avance



*****************

sub updateTCD()

Dim deb, fin As Long
Dim listeparam() As String
Dim feuille As Worksheet
Dim tableau As PivotTable
Dim sdArray As Variant
Dim j As Integer

For Each feuille In Sheets
If feuille.PivotTables.Count > 0 Then
MsgBox "Dans """ & feuille.Name & """ il y a " &
feuille.PivotTables.Count & " TCD"
For Each tableau In feuille.PivotTables
sdArray = tableau.SourceData
str = sdArray(LBound(sdArray))
str2 = ""
str3 = ""
str4 = ""
message = ""

listeparam = Split(str, ";")
For j = 0 To UBound(listeparam())
str2 = str2 & Chr(13) & " " & listeparam(j)
Next
str2 = " Nom : " & tableau.Name & Chr(13) & str2
message = "Parametres de votre TCD : " & Chr(13) & str2

deb = InStr(1, str, "DBQ=", vbTextCompare)
If deb > 0 Then
fin = InStr(deb, str, ";", vbTextCompare)
str3 = Left(str, fin - 1)
str3 = Right(str3, Len(str3) - deb - 3)

message = message & Chr(13) & Chr(13) & _
"Voulez vous modifier cette référence ? " & Chr(13) & _
" Base de donnée = " & str3

deb = InStr(1, str, "DSN=", vbTextCompare)
If deb > 0 Then
fin = InStr(deb, str, ";", vbTextCompare)
str4 = Left(str, fin - 1)
str4 = Right(str4, Len(str4) - deb - 3)
message = message & Chr(13) & _
" DSN = " & str4
End If



If MsgBox(message, vbYesNo) = vbYes Then
Stop
sdArray(LBound(sdArray)) = ""
tableau.SourceData = sdArray
End If
End If
Next
End If 'Feuille avec TCD
Next

end sub

**************

Nabil
Avatar
Nabil
J'ai repris tes indication sur le code à utiliser pour
modifier la référence à la base.

Ca ne marche pas sur mon cas pour la simple raison que
c'est pas des "QueryTable" mais des "PivotTables" (pour
les TCD) et ca n'a pas les meme caracteristiques.

Merci quand meme et bonne journée
Nabil
Avatar
michdenis
Bonjour Nabil,

Tu sembles avoir compris l'essentiel de la donne.

À quoi cela sert un fichier DSN : à pouvoir récuperer une requête sans avoir besoin de la refaire, cette peut être assez
complexe lorsqu'elle fait référence à plusieurs tables...Il y a là une économie de temps, et cela facilite la tâche à
des utilisateurs qui sont pas nécessairement à l'aise avec cela. Mais lorsque ta requête a été enregistré dans un
fichier excel, le fait de modifier le fichier DSN, ne change en rien à la réalité de la requête de ton fichier excel. De
plus le fichier .DSN peut survivre à l'existence de ton fichier excel.. puisqu'il est indépendant.

Un QueryTable ou Pivottable ... c'est le même principe

Est-ce que ton tableau croisé est le résultat d'une plage de données dans une feuille de calcul obtenu à partir d'une
requête dans query , un OleCube ...c'est-à-dire que la requête est à la base de ton tableau croisé dynamique...

Un querytable est un objet de la feuille dans l'hiérarchie des objets
Un pivottable est un objet du classeur .....

'-----------------------------------
Sub TableauCroisé()

Dim Wk As Workbook
Set Wk = ThisWorkbook

With Wk
With .PivotCaches(1)
'Affiche la chaîne de texte de la requête
Wk.Worksheets("Feuil1").Range("A1") = .CommandText
'Affiche la chaîne de connection
Wk.Worksheets("Feuil1").Range("A2") = .Connection
End With
End With

End Sub
'-----------------------------------


Salutations!




"Nabil" a écrit dans le message de news:46b501c376a8$5f037030$

Bonjour
et merci pour la réponse
J'ai la solution et l'explication qui va avec.
Je vais formaliser tout cas et refaire une macro un peut
plus réglementaire.

Sinon pour être sur que j'ai bien compris, après avoir
créé le fichier DSN et l'avoir utilisé pour faire ma
connexion depuis un TCD, le fichier ne sert plus à rien
pour le TCD en question.
Modifier le fichier DSN pour renommer par exemple la base
ne sert a rien, sauf bien sur si je crée de nouveaux TCD.

Donc dans l'absolu ça ne sert à rien d'avoir un fichier
DSN puisque je ne peux changer la base référencée par ce
fichier lors de la première connexion !!

C'est bien ça ou je suis à coté ? !!!

Merci encore pour la réponse
Nabil


-----Message d'origine-----
Bonjour Nabil,

L'utilisation d'un fichier .DSN ( enregistrement d'une
requête query) est destiné à cet objectif.


Ce fichier lorsqu'il est crée permet à tout utilisateur
de l'appeler dans son application (si ce fichier est placé

dans
un répertoire réseau accessible aux usagers).. sans avoir
à refaire toutes les manipulations.


Attention : Lorsqu'une requête Via un fichier .DSN (ou
sans) est effectué dans un fichier excel, la requête et la

liaison au fichier source sont enregistrées dans le
fichier excel comme n'importe quelle donnée du classeur. En

conséquence, même si on modifie le fichier de la
requête .DSN , cela n'a aucune incidence sur les fichiers

excel ayant
déjà utilisés comme source cette requête.

Si on veut modifier la source (fichier) d'une requête ou
la requête elle-même déjà existante dans un fichier excel,

on
doit utiliser les propriétés suivantes de
l'objet "querytable" : "Connection" et "CommandText" dans

une procédure VBA.


Salutations!



"Nabil" a écrit dans le message de
news:35dc01c375e2$c2486950$

Bonjour

J'ai un souci avec un XLS contenant un tableau croisé
dynamique et se trouvant sur un réseau.
Il est utilisé sous NT et sous XP (donc sous 97 et 2002).
Il est lié à une base Access et lors du passage sous XP il
perd la liaison vers le fichier.
Apparemment il faut passer obligatoirement par une
connexion de type ODBC.

La solution que j'ai trouvée est d'utiliser une connexion
via une source de données de type fichier (extension .dsn)
Du coup ça marche sous NT et XP et quelque soit la machine
(ce n'est pas une source système) et c'est transparent
quelque soit l'utilisateur.
Si quelqu'un peut me confirmer que c'est une bonne
solution et qu'il n'y en a pas d'autres .

De plus je ne suis pas arrivé via l'interface à modifier
cette source.
Pour ne pas avoir un recréer le TCD j'ai du faire cette
procédure qui me permet de modifier directement la liaison
à la base de données d'un TCD.
Quelqu'un pourrait me confirmer que ça marche (mes tests
sont bons) et qu'il n'y a pas de solution plus simple.

Merci par avance



*****************

sub updateTCD()

Dim deb, fin As Long
Dim listeparam() As String
Dim feuille As Worksheet
Dim tableau As PivotTable
Dim sdArray As Variant
Dim j As Integer

For Each feuille In Sheets
If feuille.PivotTables.Count > 0 Then
MsgBox "Dans """ & feuille.Name & """ il y a " &
feuille.PivotTables.Count & " TCD"
For Each tableau In feuille.PivotTables
sdArray = tableau.SourceData
str = sdArray(LBound(sdArray))
str2 = ""
str3 = ""
str4 = ""
message = ""

listeparam = Split(str, ";")
For j = 0 To UBound(listeparam())
str2 = str2 & Chr(13) & " " & listeparam(j)
Next
str2 = " Nom : " & tableau.Name & Chr(13) & str2
message = "Parametres de votre TCD : " & Chr(13) & str2

deb = InStr(1, str, "DBQ=", vbTextCompare)
If deb > 0 Then
fin = InStr(deb, str, ";", vbTextCompare)
str3 = Left(str, fin - 1)
str3 = Right(str3, Len(str3) - deb - 3)

message = message & Chr(13) & Chr(13) & _
"Voulez vous modifier cette référence ? " & Chr(13) & _
" Base de donnée = " & str3

deb = InStr(1, str, "DSN=", vbTextCompare)
If deb > 0 Then
fin = InStr(deb, str, ";", vbTextCompare)
str4 = Left(str, fin - 1)
str4 = Right(str4, Len(str4) - deb - 3)
message = message & Chr(13) & _
" DSN = " & str4
End If



If MsgBox(message, vbYesNo) = vbYes Then
Stop
sdArray(LBound(sdArray)) = ""
tableau.SourceData = sdArray
End If
End If
Next
End If 'Feuille avec TCD
Next

end sub

**************

Nabil


.