OVH Cloud OVH Cloud

Données externes pbme de nom

9 réponses
Avatar
ticegestion
Bonjour,
Dans une appli excel, j'ai besoin de créer une source de données externes
dans une feuille nommée "liaison Access".
Les données ainsi récupérées sont exploitées dans d'autres feuilles du même
classeur via la fonction RECHERCHEV(...;TABLIASSE;...;Faux)
La zone contenant les données externes est donc nommé TABLIASSE.
Problème :
Quand j'exécute la macro, Excel ne reprend pas le nom TABLIASSE, il nomme la
zone TABLIASSE_1, TABLIASSE_2 (à chaque fois que j'exécute la macro.
Pourtant la portion de code me semble bon :
Worksheets("liaison access").Select
Cells.Select 'on sélectionne tout
Selection.ClearContents 'on efface le contenu
ActiveWorkbook.Names("TabLiasse").Delete ' on efface le nom TabLiasse
Range("A1").Select
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _ '2
"ODBC;DSN=MS Access Database;DBQ=" & Cdialog.Filename &
";DefaultDir=" & Cdialog.Filename), Array( _
";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;")),
Destination:=Range("A1"))
.CommandText = Array( "SELECT R_Regroupement_par_rubrique_N.CodeRub,
etc, etc" _
)
.Name = "TabLiasse" 'Affectation du nom à la source de données :

Cordialement et merci d'avance
Fred Redonnet
http://www.ticegestion.com

'...

9 réponses

Avatar
ticegestion
Bonjour,
J'ai réussi à trouver une solution (peut être pas la meilleure) :
Avant création de la source de données, je parcours la collection Names et
dès que je rencontre TabLiasse, je supprime le nom :
For Each nom In ActiveWorkbook.Names
If Mid(nom.Name, 18, 9) = "TabLiasse" Or nom.Name = "TabLiasse" Then
nom.Delete
End If
Next
ainsi un nom comme 'Liaison Access'!TabLiasse_17 sera repéré et effacé

Après création de la source de données, j'affecte la plage d'adresses de la
source de données au nom TabLiasse
For Each nom In ActiveWorkbook.Names
If Mid(nom.Name, 18, 9) = "TabLiasse" Then
Names.Add Name:="TabLiasse", RefersTo:=nom.RefersToRange
Exit For
End If
Next
J'avais essayé au départ de renommer le nom de la source de données mais en
faisant ça, la source était supprimée et les mises à jour étaient
impossibles.
Cette solution permet de faire fonctionner mon appli (réalisation
automatique des bilans, compte de résultat... de la liasse fiscale à partir
d'une balance gérée sous Access) mais, à chaque recréation de la source de
données, le nom de la source finit toujours pas un numéro qui s'incrémente
(TabLiasse_17, ..._18, ...) et j'aurais qd même bien voulu éviter cette
incrémentation.
Cordialement
Fred Redonnet
http://www.ticegestion.com

"ticegestion" a écrit dans le message de
news:bn5vou$9q8$
Bonjour,
Dans une appli excel, j'ai besoin de créer une source de données externes
dans une feuille nommée "liaison Access".
Les données ainsi récupérées sont exploitées dans d'autres feuilles du
même

classeur via la fonction RECHERCHEV(...;TABLIASSE;...;Faux)
La zone contenant les données externes est donc nommé TABLIASSE.
Problème :
Quand j'exécute la macro, Excel ne reprend pas le nom TABLIASSE, il nomme
la

zone TABLIASSE_1, TABLIASSE_2 (à chaque fois que j'exécute la macro.


Avatar
Lydya
Bonsoir Fred,

As-tu essayé de déplacer l'instruction de définition du nom après le bloc:
With ActiveSheet.QueryTables.Add...
...
End with
Ainsi:
ActiveSheet.UsedRange.Name = "TabLiasse"

Cela dit, le problème aurait peut-être pu être contourné en utilisant, une
fois pour
toutes, une fonction "dynamique" pour définir le nom de la plage des
données, ainsi, celle-ci est recalculée automatiquement et plus besoin de la
supprimer pour la recréer à chaque importation des nouvelles données dans la
feuille, par exemple :
Insertion / Nom / Définir (CTRL F3)
Nom: TabLiasse
Fait référence à :
ÞCALER(Liste!$A$1;0;0;NBVAL(Liste!$A:$A);NBVAL(Liste!$1:$1))
Où Liste est le nom de la feuille, A1 la première cellule de la plage, les
deux fonctions NBVAL renvoient respectivement le nombre de valeurs (cellules
contenant une donnée) dans la colonne A et dans la ligne 1, celles-ci ne
doivent donc pas contenir de cellules vides pour que le résultat soit
pertinent.
(Les noms définis ainsi ne sont pas visibles dans la zone de nom ni avec la
commande Edition / Atteindre, il faut retourner dans Insertion / Nom /
Définir pour les voir).

Lydya

---
"ticegestion" a écrit dans le message de
news:bn67su$go5$
Bonjour,
J'ai réussi à trouver une solution (peut être pas la meilleure) :
Avant création de la source de données, je parcours la collection Names et
dès que je rencontre TabLiasse, je supprime le nom :
For Each nom In ActiveWorkbook.Names
If Mid(nom.Name, 18, 9) = "TabLiasse" Or nom.Name = "TabLiasse"
Then

nom.Delete
End If
Next
ainsi un nom comme 'Liaison Access'!TabLiasse_17 sera repéré et effacé

Après création de la source de données, j'affecte la plage d'adresses de
la

source de données au nom TabLiasse
For Each nom In ActiveWorkbook.Names
If Mid(nom.Name, 18, 9) = "TabLiasse" Then
Names.Add Name:="TabLiasse", RefersTo:=nom.RefersToRange
Exit For
End If
Next
J'avais essayé au départ de renommer le nom de la source de données mais
en

faisant ça, la source était supprimée et les mises à jour étaient
impossibles.
Cette solution permet de faire fonctionner mon appli (réalisation
automatique des bilans, compte de résultat... de la liasse fiscale à
partir

d'une balance gérée sous Access) mais, à chaque recréation de la source de
données, le nom de la source finit toujours pas un numéro qui s'incrémente
(TabLiasse_17, ..._18, ...) et j'aurais qd même bien voulu éviter cette
incrémentation.
Cordialement
Fred Redonnet
http://www.ticegestion.com

"ticegestion" a écrit dans le message de
news:bn5vou$9q8$
Bonjour,
Dans une appli excel, j'ai besoin de créer une source de données
externes


dans une feuille nommée "liaison Access".
Les données ainsi récupérées sont exploitées dans d'autres feuilles du
même

classeur via la fonction RECHERCHEV(...;TABLIASSE;...;Faux)
La zone contenant les données externes est donc nommé TABLIASSE.
Problème :
Quand j'exécute la macro, Excel ne reprend pas le nom TABLIASSE, il
nomme


la
zone TABLIASSE_1, TABLIASSE_2 (à chaque fois que j'exécute la macro.






Avatar
ticegestion
Bonsoir Lydya,
As-tu essayé de déplacer l'instruction de définition du nom après le bloc:
With ActiveSheet.QueryTables.Add...
...
End with
Ainsi:
ActiveSheet.UsedRange.Name = "TabLiasse"
Merci pour ta réponse, cette propriété UsedRange représente la toute

dernière plage nommée utilisée, c'est ça ? Dans ce cas, cela pourrait
marcher.

Cela dit, le problème aurait peut-être pu être contourné en utilisant, une
fois pour
toutes, une fonction "dynamique" pour définir le nom de la plage des
données, ainsi, celle-ci est recalculée automatiquement et plus besoin de
la

supprimer pour la recréer à chaque importation des nouvelles données dans
la

feuille, par exemple :
Insertion / Nom / Définir (CTRL F3)
Nom: TabLiasse
Fait référence à :
ÞCALER(Liste!$A$1;0;0;NBVAL(Liste!$A:$A);NBVAL(Liste!$1:$1))
Où Liste est le nom de la feuille, A1 la première cellule de la plage, les
deux fonctions NBVAL renvoient respectivement le nombre de valeurs
(cellules

contenant une donnée) dans la colonne A et dans la ligne 1, celles-ci ne
doivent donc pas contenir de cellules vides pour que le résultat soit
pertinent.


Un grand merci pour cette formule, je ne savais pas qu'on pouvait utiliser
une formule dans la zone "référe à", même si je ne l'utilise pas (car un
code "violent" efface tout avant de créer la source de données), ce type de
formule peut avoir des utilisations monumentales (notamment avec les
recherches verticales)
Chapeau !
J'ai publié sur mon site la première version de l'application en question
(mais c'est peu parlant si on ne dispose pas d'un logiciel comptable pour
exporter au préalable une balance)
Bien cordialement et encore merci
Fred Redonnet
http://www.ticegestion.com (suivre bts cgo P10)

Avatar
Lydya
Fred,

La propriété UsedRange renvoie un objet Range représentant la plage
contenant des données dans une feuille, indépendamment des noms qui ont été
définis.
A bientôt.

Lydya


"ticegestion" a écrit dans le message de
news:bn6ss2$146$
Bonsoir Lydya,
As-tu essayé de déplacer l'instruction de définition du nom après le
bloc:


With ActiveSheet.QueryTables.Add...
...
End with
Ainsi:
ActiveSheet.UsedRange.Name = "TabLiasse"
Merci pour ta réponse, cette propriété UsedRange représente la toute

dernière plage nommée utilisée, c'est ça ? Dans ce cas, cela pourrait
marcher.

Cela dit, le problème aurait peut-être pu être contourné en utilisant,
une


fois pour
toutes, une fonction "dynamique" pour définir le nom de la plage des
données, ainsi, celle-ci est recalculée automatiquement et plus besoin
de


la
supprimer pour la recréer à chaque importation des nouvelles données
dans


la
feuille, par exemple :
Insertion / Nom / Définir (CTRL F3)
Nom: TabLiasse
Fait référence à :
ÞCALER(Liste!$A$1;0;0;NBVAL(Liste!$A:$A);NBVAL(Liste!$1:$1))
Où Liste est le nom de la feuille, A1 la première cellule de la plage,
les


deux fonctions NBVAL renvoient respectivement le nombre de valeurs
(cellules

contenant une donnée) dans la colonne A et dans la ligne 1, celles-ci ne
doivent donc pas contenir de cellules vides pour que le résultat soit
pertinent.


Un grand merci pour cette formule, je ne savais pas qu'on pouvait utiliser
une formule dans la zone "référe à", même si je ne l'utilise pas (car un
code "violent" efface tout avant de créer la source de données), ce type
de

formule peut avoir des utilisations monumentales (notamment avec les
recherches verticales)
Chapeau !
J'ai publié sur mon site la première version de l'application en question
(mais c'est peu parlant si on ne dispose pas d'un logiciel comptable pour
exporter au préalable une balance)
Bien cordialement et encore merci
Fred Redonnet
http://www.ticegestion.com (suivre bts cgo P10)





Avatar
Lydya
Re,

même si je ne l'utilise pas (car un
code "violent" efface tout avant de créer la source de données),
Le fait de supprimer toutes les données de la feuille ne trouble aucunement

la fonction à laquelle fait référence le nom. Tant que ni la feuille ni le
nom ne sont pas supprimés, elle reste effective.

J'irai faire un petit tour sur ton site !

Lydya


"ticegestion" a écrit dans le message de
news:bn6ss2$146$
Bonsoir Lydya,
As-tu essayé de déplacer l'instruction de définition du nom après le
bloc:


With ActiveSheet.QueryTables.Add...
...
End with
Ainsi:
ActiveSheet.UsedRange.Name = "TabLiasse"
Merci pour ta réponse, cette propriété UsedRange représente la toute

dernière plage nommée utilisée, c'est ça ? Dans ce cas, cela pourrait
marcher.

Cela dit, le problème aurait peut-être pu être contourné en utilisant,
une


fois pour
toutes, une fonction "dynamique" pour définir le nom de la plage des
données, ainsi, celle-ci est recalculée automatiquement et plus besoin
de


la
supprimer pour la recréer à chaque importation des nouvelles données
dans


la
feuille, par exemple :
Insertion / Nom / Définir (CTRL F3)
Nom: TabLiasse
Fait référence à :
ÞCALER(Liste!$A$1;0;0;NBVAL(Liste!$A:$A);NBVAL(Liste!$1:$1))
Où Liste est le nom de la feuille, A1 la première cellule de la plage,
les


deux fonctions NBVAL renvoient respectivement le nombre de valeurs
(cellules

contenant une donnée) dans la colonne A et dans la ligne 1, celles-ci ne
doivent donc pas contenir de cellules vides pour que le résultat soit
pertinent.


Un grand merci pour cette formule, je ne savais pas qu'on pouvait utiliser
une formule dans la zone "référe à", même si je ne l'utilise pas (car un
code "violent" efface tout avant de créer la source de données), ce type
de

formule peut avoir des utilisations monumentales (notamment avec les
recherches verticales)
Chapeau !
J'ai publié sur mon site la première version de l'application en question
(mais c'est peu parlant si on ne dispose pas d'un logiciel comptable pour
exporter au préalable une balance)
Bien cordialement et encore merci
Fred Redonnet
http://www.ticegestion.com (suivre bts cgo P10)





Avatar
ticegestion
Bonjour Lydia
Merci pour cette précision, ça répond tout à fait au problème
Cordialement
Fred
http://www.ticegestion.com

"Lydya" a écrit dans le message de
news:%
Fred,

La propriété UsedRange renvoie un objet Range représentant la plage
contenant des données dans une feuille, indépendamment des noms qui ont
été

définis.
A bientôt.

Lydya



Avatar
AV
Juste comme ça...

La propriété UsedRange renvoie un objet Range représentant la plage
contenant des données dans une feuille,


ET les cellules qui ont été formatées différemment du format par défaut, même si
elles sont vides !

AV

Avatar
Lydya
Bonjour,

Il faut donc éviter de laisser traîner des formats dans des cellules vides
situées en dehors du UsedRange
;-)
Finalement, que nous conseilles-tu ? Eviter systématiquement d'utiliser
cette propriété ou ne l'utiliser qu'après un code de nettoyage ?
Merci !

Lydya


"AV" a écrit dans le message de
news:bn7tj0$1qv$
Juste comme ça...

La propriété UsedRange renvoie un objet Range représentant la plage
contenant des données dans une feuille,


ET les cellules qui ont été formatées différemment du format par défaut,
même si

elles sont vides !

AV





Avatar
AV
Ave Lydya,

Eviter systématiquement d'utiliser
cette propriété ?
Sauf certitude (un mien fichier), c'est ce que je fais !


ou ne l'utiliser qu'après un code de nettoyage ?
Pas toujours nickel le nettoyage...


AV