VBA Import CSV : Problème de nom de plage

Pti Guily

XLDnaute Nouveau
Bonjour à tous,

Premier post sur ce site qui m'a tant aidé jusqu'ici.
Je suis certain que ce sujet doit être déjà traité mais je n'ai pas trouvé de post en ce sens.

J'importe un fichier CSV dans Excel via un code VBA. Tout vas bien jusque là.
Ce fichier peut avoir n ligne. Je souhaite donc nommer cet import et mon code VBA le fait par defaut. La plage se nomme "WO_Data"
Mon problème vient du fait qui si je fais retourner l'import, il nomme la plage "WO_DATA_1" et non "WO_DATA".
J'ai bien essayé de rajouter un code issue d'une macro pour supprimer le nom de la plage avant, mais Excel doit tout de même garder cela en mémoire qlq part car l'import continue de s'incrémenter.

NB : La raison pour nommer cette plage est pour la réutiliser comme définition de la source dans des tableaux croiséé dynamiques.
Mon code pricipalement réalisé via l'enregistrement de macro.

Sub Impor_WO_Detail_CSV_FILE()
'
' Impor_WO_Detail_CSV_FILE Macro
' Macro recorded 05/04/2012 by Tutu

'define file location details from Excel file information
var_path_CSVfile = Worksheets("Settings").Range("C3").Value
var_name_CSVfile = Worksheets("Settings").Range("C4").Value
var_name_InsertWorkSheet = Worksheets("Settings").Range("C5").Value

'start importing CSV

Sheets(var_name_InsertWorkSheet).Select
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.ClearContents
' ActiveWorkbook.Names("WO_Data").Delete
Range("A1").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & var_path_CSVfile & var_name_CSVfile _
, Destination:=Range("A1"))
.Name = "WO_Data"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Range("A1:R1").Select
Selection.AutoFilter
Sheets("FDT").Select
Range("A5").Select
End Sub
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : VBA Import CSV : Problème de nom de plage

Bonjour
Je ne comprends pas bien le code , mais n'as tu paas quelque part une variable, nom...etc qui s'appelle aussi WO_DATA ? qui serait prioritaire
As tu essayé de changer ce nom pour voir ? c'est juste une idée ( j'ai rencontré du même genre avec les Graphs)
 

Pti Guily

XLDnaute Nouveau
Re : VBA Import CSV : Problème de nom de plage

Hervé,
Merci pour ta réponse.
Le code est un peu long car il provient d'une macro et non d'une création VBA ex nihilo.
Mais je ne pense pas que ce soit l'origine de mon pb.
Il va chercher les chemin d'accès, le nom de fichier CSV et l'onglet de destination de l'import dans des cellules pré-remplis du fichier Excel contenant les macro et les TCD.

J'ai donc modifié mon nom de cellule de WO_DATA en WO_toto (.Name = "WO_toto")
Au premier import, il m'a créé une plage WO_toto. Au second import la nouvelle plage s'appelle WO_toto_1 (en plus de WO_toto). C'est la même chose si je supprime la plage WO_toto avant de faire tourner le script.
Plus je réfléchit, plus je me dis que je dois mal aborder mon pb.

Au final, je souhaite avoir une plage de donnée importée avec un nom toujours le même pour que je puisse y faire référence avec les TCD qui exploitent ces données.
 

Dranreb

XLDnaute Barbatruc
Re : VBA Import CSV : Problème de nom de plage

Bonjour.
J'avoue que l'utilisation des objet QueryTable est un domaine qui manque complètement à ma culture.
Toutefois quelques recherches dans l'aide me démontrent que le nom d'un tel objet n'a rien à voir avec les noms de plages.
Ça s'apparenterait plutôt au nom d'un Shape ou d'un ChartObject et permet de le ravoir une fois qu'il existe.
Je trouve qu'il est même gentil d'accepter quand même votre nom quitte à y ajouter "1" derrière au lieu de vous jeter !
Vous voulez en ajouter constamment des centaines comme ça de ces objets dans la feuille sans jamais les supprimer ?
Étudiez plus avant leurs méthodes Refresh et surtout Delete.
Coirdialement.
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re : VBA Import CSV : Problème de nom de plage

SLt Dran
Oui, cela revient un peu à l'idée que j'avais ( en rapport avec les SHape , ou Chart) , ou l'on donne un .name au graph MAIS
derrière il faut aller tester s'il existe des formes et les EFFACER !!!
Donc là son nom est WO_TOTO : Ok la 1ere fois , mais si pas supprimé ensuite donne WO_TOTO1
Je ne connais pas QUERY TABLE , mais il y a peut-etre moyen de faire un : .COUNT ? pour voir ( comme pour les formes) ce qui existe déjà
 

Dranreb

XLDnaute Barbatruc
Re : VBA Import CSV : Problème de nom de plage

Est-ce qu'un code écrit comme ça marcherait ?
VB:
Dim QTbl As QueryTable, Connx As String
Connx = "TEXT;" & var_path_CSVfile & var_name_CSVfile
On Error Resume Next
Set QTbl = ActiveSheet.QueryTables("WO_Data")
On Error GoTo 0
If Not QTbl Is Nothing Then
   QTbl.Connection = Connx
Else
   Set QTbl = ActiveSheet.QueryTables.Add(Connection:=Connx, Destination:=Range("A1"))
   With QTbl
      .Name = "WO_Data"
      .FieldNames = True
      .RowNumbers = False
      .FillAdjacentFormulas = False
      ' etc. etc.
      ' ...
      End With
   End If
QTbl.Refresh BackgroundQuery:=False
 

Pti Guily

XLDnaute Nouveau
Re : VBA Import CSV : Problème de nom de plage

Est-ce qu'un code écrit comme ça marcherait ?

Malheureusement non.
Le nom de la requête (et donc le nom de la plage) s'incrémente toujours!

J'ai trouvé ce code mais il ne tourne pas. Il paraissait pourtant bien.
VB:
'Delete Query Table before running
Sub QT_Delete()
Dim QTcount As Integer
QTcount = ActiveSheet.QueryTables.Count
If QTcount > 0 Then
For Index = 1 To QTcount
ActiveSheet.QueryTables(Index).Delete
Next
End If
End Sub
Il plante sur
Code:
ActiveSheet.QueryTables(Index).Delete

J'ai trouvé un site assez documenté sur les requêttes externes
Ce lien n'existe plus

J'ai donc intégré le code
Code:
Sub DeleteAllQueries()

     Dim qt As QueryTable
     Dim WSh As Worksheet

     For Each WSh In ThisWorkbook.Worksheets
          For Each qt In WSh.QueryTables
               qt.Delete
          Next qt
     Next WSh

End Sub
qui me créé un plage nommé WO_DATA_1 à chaque nouvel import.
C'est un peu l'arme atomique parce que j'aurai préféré ne supprimer que la requête "WO_DATA" et pas toutes celles que les utilisateurs pourraient créer dans le futur, mais bon!
Je vais faire encore qlq test pour valider mais ça, semble avoir réglé mon pb (pas très élégant mais fonctionnel!) :rolleyes:

Je vous dit ce qu'il en est d'ici 1 ou 2 jours mais je pense avoir grâce à vous trouvé un truc qui le fait. Merci bcp. Tout commentaire le bien venu.

Pour info, mon code devient
Code:
Sub Impor_WO_Detail_CSV_FILE()
'
' Impor_WO_Detail_CSV_FILE Macro
' Macro recorded 05/04/2012 by Tutu

'delete all Query tables of the worksheet frist
     Dim qt As QueryTable
     Dim WSh As Worksheet

     For Each WSh In ThisWorkbook.Worksheets
          For Each qt In WSh.QueryTables
               qt.Delete
          Next qt
     Next WSh

'define file location details from Excel file information
var_path_CSVfile = Worksheets("Settings").Range("C3").Value
var_name_CSVfile = Worksheets("Settings").Range("C4").Value
var_name_InsertWorkSheet = Worksheets("Settings").Range("C5").Value


'start importing CSV

    Sheets(var_name_InsertWorkSheet).Select
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.ClearContents
'    ActiveWorkbook.Names("WO_Data").Delete
    Range("A1").Select
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & var_path_CSVfile & var_name_CSVfile _
        , Destination:=Range("A1"))
        .Name = "WO_DATA"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    Range("A1:V1").Select
    Selection.AutoFilter
    Sheets("FDT").Select
    Range("A5").Select
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : VBA Import CSV : Problème de nom de plage

Bonjour.
Au lieu de ça :
For Index = 1 To QTcount
ActiveSheet.QueryTables(Index).Delete
Next
Essayez comme ça:
VB:
On Error Resume Next
Do: ActiveSheet.QueryTables(1).Delete: Loop Until Err
On Error Goto 0
Avec votre boucle, forcément ça ne pouvait en supprimer qu"une sur 2 et ça finissait en erreur par indice n'appartenant plus à la sélection.

Mais dans votre cas ceci devrait suffire :
VB:
ActiveSheet.QueryTables("WO_Data").Delete
À +
 
Dernière édition:

Pti Guily

XLDnaute Nouveau
Re : VBA Import CSV : Problème de nom de plage

Mais dans votre cas ceci devrait suffire :
VB:
ActiveSheet.QueryTables("WO_Data").Delete
À +

Oui je trouve aussi. J'avais déjà mis cela initialement mais ça ma retourne une "Runetime error 9, Script out of range" sur cette ligne que je ne sais pas interpréter.
Sub Impor_WO_Detail_CSV_FILE()
'define file location details from Excel file information
var_path_CSVfile = Worksheets("Settings").Range("C3").Value
var_name_CSVfile = Worksheets("Settings").Range("C4").Value
var_name_InsertWorkSheet = Worksheets("Settings").Range("C5").Value


'start importing CSV

Sheets(var_name_InsertWorkSheet).Select
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.ClearContents
ActiveSheet.QueryTables("WO_Data").Delete
Range("A1").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & var_path_CSVfile & var_name_CSVfile _
, Destination:=Range("A1"))
.Name = "WO_DATA"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Range("A1:V1").Select
Selection.AutoFilter
Sheets("FDT").Select
Range("A5").Select
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : VBA Import CSV : Problème de nom de plage

Je pense qu'il n'existe pas de QueryTable nommé WO_Data à ce moment là des tests.
Prévoyez On Error Resume Next devant puisque c'est ce qu'on veut: on s'en fout de ne pas pouvoir supprimer quelque chose qui n'existe déjà plus !
 

Pti Guily

XLDnaute Nouveau
Re : VBA Import CSV : Problème de nom de plage

Je pense qu'il n'existe pas de QueryTable nommé WO_Data à ce moment là des tests.
Prévoyez On Error Resume Next devant puisque c'est ce qu'on veut: on s'en fout de ne pas pouvoir supprimer quelque chose qui n'existe déjà plus !

Ah oui effectivement!:rolleyes:
J'ai au final également ajouté un champs dans mon fichier excel permettant à l'utilisateur de définir le chemin et les noms des fichiers CSV d'import en les prenant comme variable.

Merci bcp pour les précisions. Elles étaient super précieuses.
 

Discussions similaires

Réponses
3
Affichages
579
Réponses
2
Affichages
117

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine