Optimisation du code d"Import de fichiers fermés de type différents

KIM

XLDnaute Accro
Bonjour le forum et les ami(e)s,
Avec votre aide j'importe des fichiers de type xls en utilisant plusieurs techniques dans le fichier joint TDB_RecapFv1.xls : Choix du répertoire à scanner, lecture de fichiers fermés et sans les ouvrir, progressbar de traitement de fichiers, lancement de macro selon le contenu d'une cellule par select/case, etc..

J'importe plusieurs types de fichiers (une dizaine) avec un test sur les noms des fichiers. Par ex fichier de type DRxx-.xls, ou de type DRxx-SURF.xls, etc... Tous les types de fichiers commencent à la 1ere ligne avec une ligne de titre et avec un nombre de colonnes différent. L'importation se fait dans un onglet pour chaque type de fichiers. Dans l'onglet Menu, je récupère certaines informations.

a) Mes variables et fonctions globales sont dans le module G0_VarPubliq
b) L'initialisation spécifique pour chaque type de fichiers à importer sont dans le module M0_Menu : Init-Surf_F() et scan() pour les fichiers de type DRxx-SURF.xls et Init-SurfG_F() et scanG() pour les fichiers de type DRxx-.xls
c) Les macros d'exécution sont dans un module dédié pour chaque type de fichiers

Tout fonctionne bien mais je cherche un moyen d'éviter des copies de macros qui ne se différencient que par la recherche des fichiers selon le type de nom et par le nombre de colonnes.

la différence entre les macros scan et scanG :
Scan :
If Len(Fichier.Name) = 13 Then 'Recherche des fichiers dont le nom fait 9 caractères ex DRxx-SURF.xls
If Right$(Fichier, 8) = "SURF.xls" Then 'Recherche des fichiers DRxx-SURF.xls

ScanG :
If Len(Fichier.Name) = 9 And Right$(Fichier, 5) = "-.xls" Then


La différence entre RecopieDRSurf_F et RecopieDRSurfG_F se retrouve au niveau du nom du type de fichiers et du nombre de colonne :
RecopieDRSurf_F:
If Len(Fichier.Name) = 13 Then 'Recherche des fichiers dont le nom fait 9 caractères ex DRxx-SURF.xls
If Right$(Fichier, 8) = "SURF.xls" Then 'Recherche des fichiers DRxx-SURF.xls
et
Range(C, C(t - 1, 1)).AutoFill Range(C, C(t - 1, 21))
Range(C, C(t - 1, 21)).Value = Range(C, C.Offset(t - 1, 21)).Value


RecopieDRSurfG_F :
If Len(Fichier.Name) = 9 Then 'Recherche des fichiers dont le nom fait 8 caractères ex DRxx-.xls
If Left$(Fichier.Name, 2) = "DR" Then ' et des fichiers qui commencent par DR


et
Range(C, C(t - 1, 1)).AutoFill Range(C, C(t - 1, 15))
Range(C, C(t - 1, 15)).Value = Range(C, C.Offset(t - 1, 15)).Value

Ma question : J'ai plus d'une dizaine de types de fichiers à importer. Est-il possible d'intégrer ces conditions dans une seule macro et selon le choix du type de fichiers sélectionné dans la cellule A8 de l'onglet Menu positionnées des paramètres qui seront utilisés dans un seul ensemble unique des fichiers scan et RecopieDRSurf_F. Ainsi quand j'ai un nouveau type de fichiers à importer, je rajoute une condition dans cette nouvelle macro et je créé le fichier d'initialisation des variables correspondantes dans le module M0_Menu

Cela me fait encore gagner du temps dans la lecture et la modification du code. Par avance je vous remercie de votre aide.
KIM
 

Pièces jointes

  • SG.zip
    144.2 KB · Affichages: 30

Odesta

XLDnaute Impliqué
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour

J'ai fais quelques chose dans le genre, et j'avais utilisé une fonction où j'y placais mes parametres :
(ce code n'est pas tester, mais vue votr eniveau de compétence, je pense que vous serez l'adtper, j'ai compris que vous cherchier surtout une idée)

VB:
Sub Test_Fichier(nom_Fic)

' ###############################################
'Ici tous les parametres par type de fichier
' ###############################################

ma_reponse = False 'valeur par défaut
    Select Case choix
        Case "DRxx-.xls"
            If Len(Fichier.Name) = 9 And Right$(Fichier, 5) = "-.xls" Then
                ma_reponse = True
            End If
        Case "DRxx-SURF.xls"
            If Len(Fichier.Name) = 13 And Right$(Fichier, 8) = "SURF.xls" Then
                ma_reponse = True
            End If
        End If
    
    End Select
    
Test_Fichier = ma_reponse
End Sub

Et pour la macro "générique"
VB:
Public Sub Scan_generique(Répertoire)
'Détermine le nbre de fichiers qu'il va y avoir à traiter
    Dim Fso As Scripting.FileSystemObject
    Dim RépSource As Scripting.Folder
    Dim SousRép As Scripting.Folder
    Dim Fichier As Scripting.File
    
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set RépSource = Fso.GetFolder(Répertoire)
    Application.ScreenUpdating = False
    
'Test pour la recherche des fichiers
    For Each Fichier In RépSource.Files
        If Test_Fichier(Fichier.Name) Then
            TotalFichiers = TotalFichiers + 1
        End If
    Next Fichier

'--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
    For Each SousRép In RépSource.SubFolders
        ScanG SousRép.Path
    Next SousRép
End Sub

Après, la logique est transposable

J'espère vous avoir fait un peu avancer de par mon expérience

Cdt

Olivier
 

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour Olivier et le forum,
Merci pour ta proposition,
Avant de la tester il me manque la solution du nombre de colonne qui est différent d'un type de fichiers à un autre sinon je suis encore obligé de recopier autant de fois que de types de fichiers la macro RecopieDRSurf_F :
Range(C, C(t - 1, 1)).AutoFill Range(C, C(t - 1, 21))
Range(C, C(t - 1, 21)).Value = Range(C, C.Offset(t - 1, 21)).Value
21 est la dernière colonne du fichier du type DRxx-SURF.xls
15 est celle du fichier du type DRxx-.xls.
As-tu une idée?
Merci d'avance
KIM
 

flyonets44

XLDnaute Occasionnel
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour
voici du code pour trouver la dernière colonne occupée dans une feuille excel
Sub Maxcol()
la derniere colonne occupée
Dim dercol As Variant
dercol = Cells.Find("*", [A1], -4123, , 2, 2).Column
If IsError(dercol) Then
MsgBox "not found"
Else
'selection de la premiere colonne vide
Cells(1, 1+dercol).Activate
End If
End Sub
Cordialement
Flyonets
 

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour Olivier, Flyonets et le forum,
@Flyonets,
Merci pour ta proposition. Par contre je n'ai pas su l'intégrer dans la macro RecopieDRSurf_F qui recherche les fichiers et les traite sans les ouvrir.
Merci d'avance de votre aide
KIM
 

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour Olivier, Flyonets et le forum,
1- J'ai essayé d'utiliser le code d'Olivier, j'ai des erreurs de compilation. Je pense un problème de d"claration et d'échange de variable inter macro. l'appel des macros se fait dans la procédure Worksheet_Change(ByVal Target As Range) de la feuille Menu. Merci de votre aide.
Ci-joint le fichier xls. Les fichiers de données sont dans mon 1er message.
2- Comme je connais mes fichiers importés, j'ai déclaré le nombre de colonnes de chaque type de fichiers dans la macro d'initialisation de chaque type de fichiers importé.
dcol est déclarée comme var publique dans G0_VarPubliq et initialisée, par ex pour les fichiers de type DRxx-.xls, dans Init_Surf_F à 21 et le code est devenu :
Range(C, C(t - 1, 1)).AutoFill Range(C, C(t - 1, dcol_F))
Range(C, C(t - 1, 21)).Value = Range(C, C.Offset(t - 1, dcol_F)).Value
Je n'ai pas pu tester car j'ai des erreurs de compilation. Merci d'avance de votre aide
KIM
 

Pièces jointes

  • TDB_RecapFv2.zip
    106.2 KB · Affichages: 21
  • TDB_RecapFv2.zip
    106.2 KB · Affichages: 20
  • TDB_RecapFv2.zip
    106.2 KB · Affichages: 23

Bebere

XLDnaute Barbatruc
Re : Optimisation du code d"Import de fichiers fermés de type différents

bonjour Kim,Flyonets,Odesta

comme suit changer sub en function
Public Function Type_Fichier(Fichier) as boolean

' ###############################################
'Ici tous les parametres par type de fichier
' ###############################################

Trouver = False 'valeur par défaut
Select Case choix
Case "DRxx-.xls"
If Len(Fichier.Name) = 9 And Right$(Fichier, 5) = "-.xls" Then
Trouver = True
End If
Case "DRxx-SURF.xls"
If Len(Fichier.Name) = 13 And Right$(Fichier, 8) = "SURF.xls" Then
Trouver = True
End If


End Select

Type_Fichier = Trouver
End Function

et changer test par type

If Test_Fichier(Fichier.Name) Then

à bientôt
 

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour Bebere, Olivier, Flyonets et le forum,
@Bebere,
Ravi de se retrouver,
J'ai fait les modifs proposées. Rien ne se passe, la progressbar ne se lance pas, aucun message d'erreur et J'ai l'impression que la fonction Type_Fichier(Fichier) ne trouve aucun fichiers à importer. Merci d'avance de votre aide
KIM
 

Pièces jointes

  • TDB_RecapFv2.zip
    106.4 KB · Affichages: 19
  • TDB_RecapFv2.zip
    106.4 KB · Affichages: 19
  • TDB_RecapFv2.zip
    106.4 KB · Affichages: 18

Odesta

XLDnaute Impliqué
Re : Optimisation du code d"Import de fichiers fermés de type différents

BOnjour à tous

J'ai plus donner une logique qu'autre chose... il y a plein d'information à renseigner ou à modifier.
par exemple : choix : il faut qu'il vienne du menu déroulant. mon petit bout de code ne le propose pas.
"If Len(Fichier.Name) = 9 And Right$(Fichier, 5) = "-.xls" Then"
Il aura fallut que j'écrive plutot "If Len(nom_fic) = 9 And Right(nom_fic, 5) = "-.xls" Then"
ect...


En fait, je pensais que vous aviez fait ce programme vous-même et que vous cherchiez à l'améliorer. C'est pour cela que je n'ai pas donné une réponse "prete-à-coller"...


cdt
 

Bebere

XLDnaute Barbatruc
Re : Optimisation du code d"Import de fichiers fermés de type différents

KIm

j'ai eu une erreur sur Type_fichier et fait en sorte de la supprimer
après test est apparu msgbox avec temps écoulé
pas été plus loin
tantôt je fais plus de test,pas le temps pour le moment
à bientôt
 

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonjour le fil,
J'ai suivi les recommandations d'Olivier et de Bebere et je n'ai pas réussi à régler mon probléme.
Je n'arrive pas à utiliser correctement la fonction d'Olivier Type_Fichier
Merci d'avance pour votre aide
KIM
 

Pièces jointes

  • TDB_RecapFv2.zip
    111.9 KB · Affichages: 30
  • TDB_RecapFv2.zip
    111.9 KB · Affichages: 23
  • TDB_RecapFv2.zip
    111.9 KB · Affichages: 26

Odesta

XLDnaute Impliqué
Re : Optimisation du code d"Import de fichiers fermés de type différents

Qui est à l'origine du reste du code ? car c'est quand meme d'un certain niveau...

Quelles recommandations ont été suivis ?
(pour exemple, si on a "Option Explicit" il faut que toutes les fonctions soient déclarées. Mon petit bout de code ne pourra jamais marcher...)


Pardon d'être sévère, mais vous avez plus besoin de qu'un qui reprend la solution que d'un peu d'aide à l'amélioration/optimisation.
 

Bebere

XLDnaute Barbatruc
Re : Optimisation du code d"Import de fichiers fermés de type différents

Kim

liste validation remplacer xx par ??(? joker pour un caractère)
déclaré une variable public choix qui est égale à target.value(A8)
emploi de l'opérateur like pour comparer les noms des fichiers
le reste tu découvriras en exécutant le code pas à pas(F8) ou en mettant des points d'arrêt
à bientôt
 

Pièces jointes

  • TDB_RecapFv2.zip
    113 KB · Affichages: 26
  • TDB_RecapFv2.zip
    113 KB · Affichages: 30
  • TDB_RecapFv2.zip
    113 KB · Affichages: 27

KIM

XLDnaute Accro
Re : Optimisation du code d"Import de fichiers fermés de type différents

Bonsoir le fil,
Je viens de découvrir les 2 réponses de Bebere en me connectant sur le forum.
@Bebere,
Comme d'habitude, ton code est très lisible et fonctionne bien. Ta propositions de remplacer xx par ??, est très astucieuse et ta v3 est compacte et rapide.
Encore Merci et Bonne soirée à vous tous et Merci le forum.
KIM
 

Discussions similaires

Statistiques des forums

Discussions
312 273
Messages
2 086 701
Membres
103 373
dernier inscrit
Edouard007