Test existence colonne dans xls pour suppression de la colonne

jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 1 juin 2007 - 7 nov. 2006 à 14:34
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Derniè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)


        objExcel.DisplayAlerts = False 'enlève l'alerte
        objExcel.Application.Visible = False
      
        ' 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
        
    
                'renomme les colonnes
                objExcel.ActiveWorkbook.Sheets("IN").Select
                objExcel.Cells(1, 1).Value = "Date Début"
                objExcel.Cells(1, 2).Value = "Heure Début"
               
              
                objExcel.ActiveWorkbook.Sheets("OUT").Select
                objExcel.Cells(1, 1).Value = "Date Début"
                objExcel.Cells(1, 2).Value = "Heure Début"
              
          
                '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

15 réponses

TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
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 ?

Jcbé[^]
0
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Derniè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
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
7 nov. 2006 à 17:16
Salut!
Juste pour info comment tu fais pour nommer une colonne? Tu selectionne la colonne et tu fais insertion > nom > definir?
Merci

 Drikce 06
0
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
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é[^]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 1 juin 2007
7 nov. 2006 à 19:05
Bonsoir Drickce 06, 

Voilà comment renommer la colonne.
JL

  'renomme les colonnes
                objExcel.ActiveWorkbook.Sheets("IN").Select
                objExcel.Cells(1, 1).Value = "Date Début"
                objExcel.Cells(1, 2).Value = "Heure Début"
0
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Derniè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
0
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
7 nov. 2006 à 19:30
OK. pas de prob.

Jcbé[^]
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 nov. 2006 à 23:58
Par nom de colonne entends-tu l'entête de la colonne ?

Est-ce qu'elle est toujours à la même position (Colonne C, F, ...) ?


Si elle est toujours à la même position, tu pourrais écrire If
Range("C1")= "C-Party" then Columns("C:C").delete  (Changer C1 par
ce qu'il faut)


Si elle peut être à différents endroits, alors il faudrait boucler jusqu'à ce qu'elle soit trouvée ou non


For i = 1 to NombreDeColonnes

if Cells(1,i) = "C-Party" then Columns(i).delete

next

MPi
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
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.



Cordialement, Jean-Paul  

______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 1 juin 2007
8 nov. 2006 à 06:48
Bonjour à toutes et tous,
 
Merci pour votre aide, je vais tester et je vous tiens au courant mais j'opterai pour la vérification en boucle, c'est plus sûr.
Bonne journée.
JL
0
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Derniè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)


        objExcel.DisplayAlerts = False 'enlève l'alerte
        objExcel.Application.Visible = False
      
        ' 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
0
jeanluc065 Messages postés 134 Date d'inscription samedi 23 septembre 2006 Statut Membre Derniè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)


        objExcel.DisplayAlerts = False 'enlève l'alerte
        objExcel.Application.Visible = False
      
        ' 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
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
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!

 Drikce 06
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
9 nov. 2006 à 11:39
Tu peux utiliser différentes méthodes:


Pour la boucle, tu dois déclarer une variable NombreDeColonnes as integer

NombreDeColonnes = Rows(1).Find("*",Range("A1"),,,xlByColumns,xlPrevious).Column

For i = 1 to NombreDeColonnes

    if UCASE(Cells(1,i)) = "C-PARTY" then

    Columns(i).Delete

    exit for

Next


Tu pourrais aussi y aller avec Find pour trouver l'occurence

    Dim Recherche As Range, Colonne As Integer, Valeur As String

   

    Valeur = "C-Party"

   

    Set Recherche = Rows(1).Find(Valeur)

    If Not Recherche Is Nothing Then

        Colonne = Range(Recherche.Address).Column

        Columns(Colonne).Delete

    End If

MPi
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
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

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
Rejoignez-nous