VBA-Résultat de diff. fichiers dans 1 fichier
Nicoolax
-
Nicoolax -
Nicoolax -
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!
...
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:
- VBA-Résultat de diff. fichiers dans 1 fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
1 réponse
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
2 - Dans un module que tu nommes ModTools :
3 - Dans un module que tu nommes ModCnx
Bon courage.
;o)
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)
Pas sur que je puisse y arriver... c'est chaud tout ca! Merci pour t'avoir decarcassé!