VBA-Résultat de diff. fichiers dans 1 fichier

Fermé
Nicoolax - 9 mars 2010 à 12:34
 Nicoolax - 10 mars 2010 à 10:04
Bonjour,

Je réalise tous les jours un fichier différent nommé "PRIX_AAMMJJ.XLS" avec une série de calculs et des links vers d'autres fichiers. Le résultat de mes calculs se trouve toujours en cellule I7.

Je désire creer un listing par ligne me reprenant automatiquement les résultats de la cellule I7 jour par jour.
Le problème est que je dois linker ce résultat avec un fichier changeant de nom tous les jours.

PRIX_100101 pour le 01 janv 2010, PRIX_100102 pour le 02 janv....

J'aimerais avoir au final une liste sous format excel avec le résultat suivant :

Colonne A...... : Colonne B
01 janv 2010 : 'PRIX_100101'!I7
02 janv 2010 : 'PRIX_100102'!I7


Une macro_type sous la main?

Merci de votre aide!
...
A voir également:

1 réponse

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
9 mars 2010 à 13:55
Bonjour,

C'est un peu plus qu'une simple macro ...

On considère que la cellule I7 se trouve toujours dans la feuille 1 de chaque fichier et que tous les fichiers sont dans un même répertoire. Afin de ne pas ouvrir et fermer les fichiers un à un, on va utiliser une connexion ADO qui permet de lire dans un fichier fermé.

Voilà ce que je propose:

1 - Dans un module que tu nommes ModMain
Option Explicit

Private myTabFile()
Private Const dossier = "C:\Temp"  'Mettre ici le chemin du répertoire qui contient les fichiers xls

Public Sub Main()
Dim i As Long
Dim ValCell As Variant
Dim mDate As String
Dim lig As Long

    If ModTools.AllFilesInFolder(dossier, myTabFile(), "xls") = False Then
        MsgBox "Merci de vérifier le chemin d'accès au dossier.", vbExclamation, "Erreur"
        Exit Sub
    End If
    
    For i = LBound(myTabFile()) To UBound(myTabFile())
        If InStr(1, myTabFile(i), "Prix_") <> 0 Then
            ValCell = ModCnx.ExtractCellValue(myTabFile(i))
            mDate = ModTools.ExtractFileName(myTabFile(i))
            mDate = ModTools.returnDateFile(mDate)
            lig = 2
            ThisWorkbook.Worksheets(1).Range("A" & lig).Value = mDate
            ThisWorkbook.Worksheets(1).Range("B" & lig).Value = ValCell
            lig = lig + 1
        End If
    Next i
    
End Sub


2 - Dans un module que tu nommes ModTools :
Option Explicit

'/!\ NECESSITE LA REFERENCE Microsoft Scripting Runtime

Public Function AllFilesInFolder(ByVal NomDossier As String, ByRef myTab, Optional ByVal ExtentionType As String) As Boolean
Dim fso As Object, dossier As Object, Fich As Object
Dim Files As Object, File As Object
Dim max As Long, ext As String

    'Initialisation du tableau
    ReDim myTab(0)
    '
    ' Création de l'objet FSO
    On Error Resume Next ' AllFilesInFolder_Error

    Set fso = CreateObject("Scripting.FileSystemObject")
    ' Si le nom du dossier est vide, alors je sort de la fonction
    If NomDossier = "" Then Exit Function
    ' Stock les sous-répértoires dans l'objet dossier
    Set dossier = fso.GetFolder(NomDossier)
    
    ' stock dans l'objet Files tous les fichiers de l'objet dossier
    Set Files = dossier.Files
    ' s'il y a plus d'un fichier
    If Files.Count <> 0 Then
        max = 0
        ' pour tous les objets fichiers dans l'objet files
        For Each File In Files
          '
          ' je récupère le nom du fichier via l'objet Fich
          Set Fich = fso.GetFile(File)
          ' si l'extension n'est pas renseignée
          ext = ExtentionType
          If ExtentionType = "" Then ext = fso.GetExtensionName(File)
          '
          If UCase(fso.GetExtensionName(File)) = UCase(ext) Then
            max = max + 1
            ' j'augmente la taille de mon tableau résultat
            ReDim Preserve myTab(1 To max)
            ' Je stock en fin de tableau mon nom de fichier
            myTab(max) = File
          End If
        Next
    End If
    '
    ' Libère tous les objets
    Set fso = Nothing
    Set dossier = Nothing
    Set Fich = Nothing
    Set Files = Nothing
    Set File = Nothing
    '
    
    If Err.Number = 0 Then
        AllFilesInFolder = True
        Exit Function
    Else
        AllFilesInFolder = False
    End If
End Function

Public Function ExtractFileName(ByVal sFullPath As String) As String
    If InStr(sFullPath, "\") = 0 Or Right(sFullPath, 1) = "\" Then
        ExtractFileName = ""
        Exit Function
    End If
    ExtractFileName = Mid(sFullPath, InStrRev(sFullPath, "\") + 1)
End Function


Public Function returnDateFile(ByVal str As String) As String
Dim tmp As String
Dim tmp2 As String

    tmp = Mid(str, 6, 6)
    tmp2 = Mid(tmp, 5, 6) & "/"
    tmp2 = tmp2 & Mid(tmp, 3, 2) & "/"
    tmp2 = tmp2 & Mid(tmp, 1, 2)
    
    returnDateFile = Format(tmp2, "dd mmmm yyyy")
    
End Function


3 - Dans un module que tu nommes ModCnx
Option Explicit
'/!\ NECESSITE LA REFERENCE Microsoft ActivX Data Objects x.x Library


Private cnx As ADODB.Connection
Private Rst As ADODB.Recordset
Private ADOCommand As ADODB.Command

Public Function ExtractCellValue(ByVal nomFile As String)
Dim feuille As String
Dim cellule As String

    feuille = "Feuil1$"      'Mettre ici le nom de feuille où récupérer la cellule I7. 
                                    'Attention de bien mettre le signe $ en fin de nom
    cellule = "I7:I7"
    
    Set cnx = New ADODB.Connection
    cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & nomFile & ";Extended Properties=""Excel 8.0;HDR=No;"";"
                
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = cnx
        .CommandText = "SELECT * FROM [" & feuille & cellule & "]"
    End With
                  
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
                  
    Set Rst = cnx.Execute("[" & feuille & cellule & "]")
    
    ExtractCellValue = Rst.Fields(0)
    
    Rst.Close
    cnx.Close
    
    Set Rst = Nothing
    Set cnx = Nothing
    Set ADOCommand = Nothing
    
End Function



Bon courage.

;o)
0
Merci Pollux...

Pas sur que je puisse y arriver... c'est chaud tout ca! Merci pour t'avoir decarcassé!
0