Test existence colonne dans xls pour suppression de la colonne
jeanluc065
Messages postés134Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention 1 juin 2007
-
7 nov. 2006 à 14:34
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 2022
-
10 nov. 2006 à 00:20
Bonjour à toutes et tous,
En access 2002, catégorie super novice, ...
J'utlise un code ( qui m'a été écrit par de sympas contributeurs de ce site ) pour standardiser des feuilles de fichiers xls de manière à les importer en boucle par la suite dans ma db access.
Certaines feuilles contiennent PARFOIS une colonne "C-party" que je voudrais supprimer.
Ma question : insérer un test pour vérifier l'existence de la colonne "C-party".
Si présente = delete.
Qui pourrait m'aider pour le code, svp ?
Merci d'avance.
JL
*************************************************************
Function ShowFolderListbelga(path)
'présentation originale: 1 feuille In 1 feuille Out
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim Dossiers: Set Dossiers = fso.GetFolder(path)
Dim fichiers: Set fichiers = Dossiers.Files
Dim fichier, f, strListe
' *** toutes tes variables sont de type Variant !
For Each fichier In fichiers
DoCmd.Hourglass True
Set f = fso.GetFile(fichier)
If fso.GetExtensionName(fichier) = "xls" Then
Dim objExcel, objClasseur
Set objExcel = CreateObject("Excel.Application")
Set objClasseur = objExcel.Workbooks.Open(fichier)
' détermine IN OUT
objExcel.ActiveWorkbook.Sheets(1).Select
If objExcel.Cells(1, 6).Value = "A-Nom" Then
objClasseur.Sheets(1).Name = "IN"
ElseIf objExcel.Cells(1, 6).Value = "B-Nom" Then
objClasseur.Sheets(1).Name = "OUT"
End If
objExcel.ActiveWorkbook.Sheets(2).Select
If objExcel.Cells(1, 6).Value = "A-Nom" Then
objClasseur.Sheets(2).Name = "IN"
ElseIf objExcel.Cells(1, 6).Value = "B-Nom" Then
objClasseur.Sheets(2).Name = "OUT"
End If
je pense que c'est ici que la commande devrait être insérée
'WScript.Sleep "500"
'MsgBox objClasseur.Sheets(1).Name,,"Nom de la Feuil1 après modification"
objExcel.ActiveWorkbook.SaveAs fichier 'sauvegarde sous le même nom
objExcel.ActiveWorkbook.Saved = True 'sauvegarde true=oui false=non
'objExcel.DisplayAlerts=True 'remet l'alerte
'objExcel.Application.Visible=True 'remet la visibilité
objExcel.ActiveWorkbook.Close 'Fermeture d'Excel
Set objExcel = Nothing
Set objClasseur = Nothing
End If
Next fichier
Set f = Nothing
Set fichiers = Nothing
Set Dossiers = Nothing
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 7 nov. 2006 à 15:22
Bonjour,
IL n'y a pas de raison de modifier les feuilles Excel qui servent de source. C'est dans l'import sous Access qu'il faut ignorer la colonne.
Quels methode est-elle utilisée sous access :
- Table Excel Attachée
- Table Importée
- Requete ajout sql Direct ?
jeanluc065
Messages postés134Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention 1 juin 2007 7 nov. 2006 à 17:11
Bonjour Jcbé,
Merci pour la réponse mais si je dois supprimer la colonne car,
je reçois parfois des fichiers avec des noms de colonnes en français ou en anglais, donc, je dois renommer toutes les colonnes.
Et je sais que si j'ai la colonne "C-party", elle sera intercalée entre les colonnes que je dois importer.
Donc, je dois la supprimer
Jl
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 7 nov. 2006 à 17:57
En fait ce n'est pas un problème qu'elle soit au milieu. Il suffit d'injecter tes données à partir d'une requête basée sur la feuille excel attachée (temporairement) à la base access. Dans la requête, tu ne selectionnes, une fois pour toute, que les champs qui t'interressent, et tu en proffite pour mettre des alias aux champs que tu veux renommer.(En mode modification ou création, tu tapes LeNouveauNom:AncienNom ce qui sera traduit en sql par SELECT AncienNom As LeNouveauNom .... from latable where....;
Si le nom de la feuille excel change, tu modifie le nom de la table dans la requete par un replace() sur le membre SQL de qdf
Exemple
Sub RemplacerNomtableDansRequete(nomrequete as string, Anciennom as string, NouveauNom as string)
dim qdf as querydef
for each qdf in currentdb.querydefs
if qdf.name=nomrequete then
replace(qdf.Name,anciennom,nouveaunom)
exit sub
end if
next
end sub
Voila. Je continue à penser que c'est une mauvaise idée de modifier le fichier Excel source.
Car pour bien faire il faudrait le modifier à partir du vba d'accès en créant une instance de l'objet Application d'Excel et lancer ta moulinette.
...et ceux qui savent te le diront, il est parfois difficile de "tuer" Excel une fois le boulot fait...c'est une "faille" de Krosoft qui n'a toujours pas trouvé de solution "propre".
A+
Jcbé[^]
Vous n’avez pas trouvé la réponse que vous recherchez ?
jeanluc065
Messages postés134Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention 1 juin 2007 7 nov. 2006 à 19:11
BonsoirJcbé,
Tu as certainement raison, mais maintenant, je dois faire avec mon code existant qui fonctionne bien car mes feuilles ont toujours la même structure ; sauf quand j'ai une colonne "C-party".
Merci, bonne soirée
JL
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 8 nov. 2006 à 00:14
Salut,
Tiens voilà un bout de code que tu peux étoffer
Dim Myrange As Range
Dim MyCell As Range
'Ici on détermine la plage des titres de colonnes
'On peu faire une recherche auto de la dernière colonne utilisée
'Si ça t'intéresse je te donnerais le code
Set Myrange = Range("A1:F1")
'ici on determine la colonne est on l'efface
For Each MyCell In Myrange
If MyCell.Value = "C-party" Then 'Attention à la Case .....
MyCell.EntireColumn.Delete xlShiftToLeft
End If
Next
End Sub
' donc si on adapte à ton code cela donne ....
Dim Myrange As Range
Dim MyCell As Range
With objExcel.ActiveSheet
Set Myrange = .Range("A1:F1")
For Each MyCell In Myrange
If MyCell.Value = "C-party" Then 'Attention à la Case .....
MyCell.EntireColumn.Delete xlShiftToLeft
End If
Next
End With
Je n'ai pas tester le deuxième code si t'as des probs n'hésites pas à m'envoyer un message.
jeanluc065
Messages postés134Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention 1 juin 2007 9 nov. 2006 à 05:48
Bonjour Jean-Paul,
Merci pour ton aide,
J'ai essayé ton code mais çà ne fonctionne pas.
Voici comment j'e l'ai intégré dans mon apli et j'obtiens un message d'erreur
"la méthode Range de l'objet Global a échoué" et Set My Range... est en surbrillance .
si j'écris comme tu me l'as donné (avec le point ) Set Myrange = . Range("A1:F1")
j'ai aussi un message d'erreur
Merci
JL
******************************
If fso.GetExtensionName(fichier) = "xls" Then
Dim objExcel, objClasseur
Dim Myrange As Range
Dim MyCell As Range
Set objExcel = CreateObject("Excel.Application")
Set objClasseur = objExcel.Workbooks.Open(fichier)
' détermine IN OUT
objExcel.ActiveWorkbook.Sheets(1).Select
Set Myrange = Range("A1:F1")
For Each MyCell In Myrange
If MyCell.Value = "C-party" Then 'Attention à la Case .....
MyCell.EntireColumn.Delete xlShiftToLeft
End If
Next
If objExcel.Cells(1, 6).Value = "A-Nom" Then
objClasseur.Sheets(1).Name = "IN"
ElseIf objExcel.Cells(1, 6).Value = "B-Nom" Then
jeanluc065
Messages postés134Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention 1 juin 2007 9 nov. 2006 à 05:58
Bonjour MPI,
Merci pour ton aide.
J'ai testé ton code simple : OK
Pour la boucle, çà coince et j'obtiens le message d'erreur "l'indice n'appartient pas à la sélection"
Merci
Bonne journée
JL
**************************
For Each fichier In fichiers
DoCmd.Hourglass True
Set f = fso.GetFile(fichier)
If fso.GetExtensionName(fichier) = "xls" Then
Dim objExcel, objClasseur
Dim Myrange As Range
Dim MyCell As Range
Set objExcel = CreateObject("Excel.Application")
Set objClasseur = objExcel.Workbooks.Open(fichier)
' détermine IN OUT
objExcel.ActiveWorkbook.Sheets(1).Select
For I = 1 To NombreDeColonnes
If Cells(1, I) = "C-Party" Then Columns(I).Delete
Next
If objExcel.Cells(1, 6).Value = "A-Nom" Then
objClasseur.Sheets(1).Name = "IN"
ElseIf objExcel.Cells(1, 6).Value = "B-Nom" Then
objClasseur.Sheets(1).Name = "OUT"
End If
objExcel.ActiveWorkbook.Sheets(2).Select
For I = 1 To NombreDeColonnes
If Cells(1, I) = "C-Party" Then Columns(I).Delete
Next
If objExcel.Cells(1, 6).Value = "A-Nom" Then
objClasseur.Sheets(2).Name = "IN"
ElseIf objExcel.Cells(1, 6).Value = "B-Nom" Then
objClasseur.Sheets(2).Name = "OUT"
End If
'renomme les colonnes
objExcel.ActiveWorkbook.Sheets("IN").Select
drikce06
Messages postés2236Date d'inscriptionlundi 29 mai 2006StatutMembreDernière intervention29 mai 200810 9 nov. 2006 à 08:19
Salut je ne vois ou tu détermine ton nombredecolonnes donc d'après ce que je vois si tu fais ta boucle nombredecolonnes est égale à 0 donc tu ne peut pas selectionner la cellule (1,I) étant donné qu'elle n'existe pas!
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 10 nov. 2006 à 00:20
Re,
teste avec un with, et là tu mets le point
If fso.GetExtensionName(fichier) = "xls" Then
Dim objExcel, objClasseur
Dim Myrange As Range
Dim MyCell As Range
Set objExcel = CreateObject("Excel.Application")
Set objClasseur = objExcel.Workbooks.Open(fichier)
objExcel.DisplayAlerts = False 'enlève l'alerte
objExcel.Application.Visible = False
' détermine IN OUT
'objExcel.ActiveWorkbook.Sheets(1).Select
With objExcel.ActiveWorkbook.Sheets(1)
Set Myrange = .Range("A1:F1")
For Each MyCell In Myrange
If MyCell.Value = "C-party" Then 'Attention à la Case .....
MyCell.EntireColumn.Delete xlShiftToLeft
End If
Next
End With