Elephant
-
Modifié par Elephant le 28/02/2012 à 11:28
Elephant -
28 févr. 2012 à 11:52
Bonjour,
Je suis en train d'essayer d'améliorer mon code. Je ne m'y connais pas bien en vba. Le but mon code est d'ouvrir 12 fichiers , chaque fichier contenant des informations sur un mois de données. Les 12 fichiers sont contenus dans un dossier...et le problème c'est que j'ai 100 dossiers, ayant donc chacuns 12 fichiers excel.
Mon code actuel permet uniquement d'ouvrir manuellement chaque fichier avec un GetOpenFile...ce qui risque d'être trop long a faire sur les 1200 fichiers.
Je souhaiterai pouvoir les ouvrir automatiquement puisqu'on peut les identifier de la sorte (éléments en gras):
2011-01 etc
2011-02 etc
2011-03 etc
Et en fait, les infos du mois de janvier sont répertoriés dans la feuille 1 de mon fichier, celles su mois de février, dans la feuille 2 etc.
Cependant, mon code étant très très long (60 pages)(car je n'arrivais pas à boucler sur des worksheet j'ai fait des copier coller...et je ne voyais pas comment faire une boucle pour changer de worksheet....bref), je l'ai subdivisé en plusieurs 'Private Sub'
J'aimerai savoir comment on peut faire pour qu'on puisse comme manipulation faire que :
1) une fenetre s'ouvre pour aller ouvrir le dossier qui nous intéresse
2) que ça traite les fichiers automatiquement J'ai essayé ce début de code mais il ne fonctionne pas....
Dim chemin As String
chemin = InputBox("Entrez le nom de votre dossier qui contient les fichiers à analyser exemple : \1 ATL ", "CODE AITA AEROPORT")
On Error Resume Next
monfichier = Application.FileSearch
monfichier.LookIn = "C:\Users\Tami\Desktop\Connections at airports\" & chemin
MsgBox ("C:\Users\Tami\Desktop\Connections at airports" & chemin)
monfichier.Filename = "*.xls"
If monfichier.Execute > 0 Then
For x = 1 To monfichier.FoundFiles.Count
MsgBox (Mid(monfichier.FoundFiles(x), 6, 2))
If Mid(monfichier.FoundFiles(x), 6, 2) = "01" Then
Workbooks.Open Filename:=monfichier.FoundFiles(x)
End If
Next x
Else
MsgBox ("fichier 01 pas trouvé")
End If
Je sais pas comment faire pour joindre mon code en entier en *.zip... alors voila le début de code comment il est à lorigine, et ce que j'aimerai faire c'est donc remplacer tous les GETOPENFILE par l'ouverture automatique
Private Sub Code()
Call Janvier
Call Fevrier
Call Mars
Call Avril
Call Mai
Call Juin
Call Juillet
Call Aout
Call Septembre
Call Octobre
Call Novembre
Call Decembre
Call Annee
Call Saison
End Sub
Private Sub Janvier()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim caractere As String
Dim ligne As Integer
Dim colonne As Integer
Dim aa As Variant
Dim bb As Variant
Dim departs As Integer
Dim Code As String
Dim ref As Variant
Dim compteur As Integer
'____________________________________________________________________________________________
'
'MOIS DE JANVIER
'____________________________________________________________________________________________
'Feuille un du fichier opérations, jour : 1
'---------------------------------------------
MsgBox ("Aller chercher le fichier à analyser intitule : année-01 OAG Connections at aéroport")
monfichier = Application.GetOpenFilename()
'ouvre le fichier Excel
Set Wb = Workbooks.Open(monfichier)
'ouvre la feuille 1
Set Ws = Wb.Worksheets(1)
Sheets(2).Cells(1, 2) = "Heures de départ"
Sheets(2).Cells(1, 3) = "Départs jour 1"
Sheets(2).Cells(1, 4) = "Départs jour 2"
Sheets(2).Cells(1, 5) = "Départs jour 3"
Sheets(2).Cells(1, 6) = "Départs jour 4"
Sheets(2).Cells(1, 7) = "Départs jour 5"
Sheets(2).Cells(1, 8) = "Départs jour 6"
Sheets(2).Cells(1, 9) = "Départs jour 7"
Sheets(2).Cells(1, 10) = "Départs par semaine"
Sheets(2).Cells(1, 11) = "Départs mois de janvier"
'lit les données dans le fichier Excel
For ligne = 3 To 50
For colonne = 15 To 24
'extraction des heures
Sheets(2).Cells(ligne, 2) = Ws.Cells(ligne, 14)
If InStr(1, Sheets(2).Cells(ligne, 2).Value, " ") > 0 Then
bb = Split(Sheets(2).Cells(ligne, 2).Value, " ")
Sheets(2).Cells(ligne, 1) = bb(0)
End If
Next colonne
Next ligne
Set Ws = Wb.Worksheets(1)
'comptage des avions single aisle
For ligne = 3 To 50 '3 to 50
departs = 0
For i = 2 To 23 'pour lire les codes sur les 2 à 23 lignes
' extraction du code
Code = Sheets(1).Cells(i, 1).Value
For colonne = 15 To 24
'comptage si on a une cellule qui a un des codes
If InStr(1, Wb.Worksheets(1).Cells(ligne, colonne).Value, Code, vbTextCompare) > 0 Then
departs = departs + 1
End If
Next
'on va compter combien y'a de code dans la cellule colonne 24 où y'a plein de code avions dans monfichier
If InStr(1, Wb.Worksheets(1).Cells(ligne, 25).Value, ",") > 0 Then 'si on a une cellule avec plein de codes avion
aa = Split(Wb.Worksheets(1).Cells(ligne, 25).Value, Code) 'on compte combien de fois on a le code
'For i = 0 To UBound(aa)
departs = UBound(aa) + departs 'occurences avion + compteur
Else
If InStr(1, Wb.Worksheets(1).Cells(ligne, 25).Value, Code, vbTextCompare) > 0 Then
departs = departs + 1
End If
End If
Sheets(2).Cells(ligne, 3).Value = departs
Next
Next
'Feuille un du fichier opérations, jour : 2
'---------------------------------------------
Set Ws = Wb.Worksheets(2)
'comptage des avions single aisle
For ligne = 3 To 50 '3 to 50
departs = 0
For i = 2 To 23 'pour lire les codes sur les 23 lignes
' extraction du code
Code = Sheets(1).Cells(i, 1).Value
For colonne = 15 To 24
'comptage si on a une cellule qui a un des codes
If InStr(1, Wb.Worksheets(2).Cells(ligne, colonne).Value, Code, vbTextCompare) > 0 Then
departs = departs + 1
End If
ça continue comme ça jusqu'à la worksheet 7 :
St Ws = Wb.Worksheets(7)
'comptage des avions single aisle
For ligne = 3 To 50 '3 to 50
departs = 0
For i = 2 To 23 'pour lire les codes sur les 23 lignes
' extraction du code
Code = Sheets(1).Cells(i, 1).Value
For colonne = 15 To 24
'comptage si on a une cellule qui a un des codes
If InStr(1, Wb.Worksheets(7).Cells(ligne, colonne).Value, Code, vbTextCompare) > 0 Then
departs = departs + 1
End If
Next
'on va compter combien y'a de code dans la cellule colonne 24 où y'a plein de code avions dans monfichier
If InStr(1, Wb.Worksheets(7).Cells(ligne, 25).Value, ",") > 0 Then 'si on a une cellule avec plein de codes avion
aa = Split(Wb.Worksheets(7).Cells(ligne, 25).Value, Code) 'on compte combien de fois on a le code
'For i = 0 To UBound(aa)
departs = UBound(aa) + departs 'occurences avion code + compteur
Else
If InStr(1, Wb.Worksheets(7).Cells(ligne, 25).Value, Code, vbTextCompare) > 0 Then
departs = departs + 1
End If
End If
Sheets(2).Cells(ligne, 9).Value = departs
Next
Next
'*********************
'*ANALYSE DES DONNEES*
'*********************
'Addition pour calcul départs par semaine
'----------------------------------------
For i = 3 To 50
Sheets(2).Cells(i, 10).Clear
For j = 3 To 9
Sheets(2).Cells(i, 10) = Sheets(2).Cells(i, j) + Sheets(2).Cells(i, 10)
Next
Next
'Addition pour calcul départs par mois
'en janvier 2011 il y a eu 5 lundi, samedi et dimanche et 4 mardi mercredi jeudi vendredi
'----------------------------------------------------------------------------------------
For i = 3 To 50
Sheets(2).Cells(i, 11) = 5 * Sheets(2).Cells(i, 3) + 4 * Sheets(2).Cells(i, 4) + 4 * Sheets(2).Cells(i, 5) + 4 * Sheets(2).Cells(i, 6) + 4 * Sheets(2).Cells(i, 7) + 5 * Sheets(2).Cells(i, 8) + 5 * Sheets(2).Cells(i, 9)
Next
'ferme le fichier Excel
Wb.Close SaveChanges:=False
End Sub
et ça recommence, le même code pour février mais qui écrit dans une feuille différente du workbook....
Private Sub Fevrier()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim caractere As String
Dim ligne As Integer
Dim colonne As Integer
Dim aa As Variant
Dim bb As Variant
Dim departs As Integer
Dim Code As String
Dim ref As Variant
Dim compteur As Integer
'____________________________________________________________________________________________
'
'MOIS DE FEVRIER
'____________________________________________________________________________________________
'
'Feuille un du fichier opérations, jour : 1
'---------------------------------------------
MsgBox ("Aller chercher le fichier à analyser intitule : année-02 OAG Connections at aéroport")
monfichier = Application.GetOpenFilename()
'ouvre le fichier Excel
Set Wb = Workbooks.Open(monfichier)
'ouvre la feuille 1
Set Ws = Wb.Worksheets(1)
Sheets(3).Cells(1, 2) = "Heures de départ"
Sheets(3).Cells(1, 3) = "Départs jour 1"
Sheets(3).Cells(1, 4) = "Départs jour 2"
Sheets(3).Cells(1, 5) = "Départs jour 3"
Next
Je sais que c'est vachement indigeste :'(
Merci pour toute aide....
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 20242 751 28 févr. 2012 à 11:31
Bonjour,
Pour choisir un répertoire et ensuite boucler sur tous les fichiers qu'il contient :
Option Explicit
Sub BouclerFichierMemeRepertoire()
'sources : https://excel.developpez.com/faq/
Dim oShell As Object
Dim oFolder As Object
Dim oFolderItem As Object
Dim Chemin As String, Fichier As String
Set oShell = CreateObject("Shell.Application")
Set oFolder = oShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&, "c:\")
If oFolder Is Nothing Then
MsgBox "Abandon opérateur", vbCritical
Else
Set oFolderItem = oFolder.Self
Chemin = oFolderItem.Path & "\"
End If
Fichier = Dir(Chemin & "*.xls")
'Boucle sur les fichiers
Do While Len(Fichier) > 0
'ICI ON PEUX TESTER PAR EXEMPLE LE NOM DU FICHIER
'AVANT DE L'OUVRIR
Workbooks.Open Chemin & Fichier
'blablablabla
'MsgBox ActiveWorkbook.Name
ActiveWorkbook.Close
Fichier = Dir
Loop
End Sub
Merci beaucoup !!!!!!!!! je crois avoir compris, donc je dois rajouter en dessous de WhileLen le test que j'ai écrit avec MID etc.
Par contre j'ai une question, comment faire pour que ça garde en mémoire le dossier où je suis allée?
Car mon problème est le suivant :
J'ai un programme "principal" qui appelle avec "call" 12 sous programmes (équivalents aux mois de l'année et donc aux 12 différents fichiers). Du coup je dois mettre le code que tu m'as filé, amélioré bien sur, dans le programme principal, pour que ça boucle, car le truc c'est que si je le mets dans tous mes "sous programmes", je vais devoir choisir 12 fois le dossier ce qui revient à la même chose que getopenfile...
En fait j'avais essayé de mettre les Getopenfile dans le fichier principal et après de tester pour voir si ça marchait toujours et ça marche pas et j'ai peur que ça fasse pareil...je sais pas si j'ai été claire... :x
Le code ne marche pas quand je teste le nom de fichier, enfin si il y a affichage avec msgbox du nom du fichier mais après ça bugg....
Private Sub Code()
Dim oShell As Object
Dim oFolder As Object
Dim oFolderItem As Object
Dim Chemin As String, Fichier As String
Set oShell = CreateObject("Shell.Application")
Set oFolder = oShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&, "c:\")
If oFolder Is Nothing Then
MsgBox "Abandon opérateur", vbCritical
Else
Set oFolderItem = oFolder.Self
Chemin = oFolderItem.Path & "\"
End If
Fichier = Dir(Chemin & "*.xls")
'Boucle sur les fichiers
Do While Len(Fichier) > 0
'ICI ON PEUX TESTER PAR EXEMPLE LE NOM DU FICHIER
'AVANT DE L'OUVRIR
'MsgBox (Fichier)
If Mid$(Fichier, 6, 2) = "01" Then
Workbooks.Open Chemin & Fichier
MsgBox (Fichier)
'blablablabla
'MsgBox ActiveWorkbook.Name
ActiveWorkbook.Close
Fichier = Dir
End If
Loop
End Sub
Trouvez des réponses à vos questions sur les langages, les frameworks et les astuces de codage. Échangez avec d'autres développeurs passionnés pour améliorer vos compétences en programmation et rester au fait des dernières tendances du secteur.
Modifié par Elephant le 28/02/2012 à 12:15
Par contre j'ai une question, comment faire pour que ça garde en mémoire le dossier où je suis allée?
Car mon problème est le suivant :
J'ai un programme "principal" qui appelle avec "call" 12 sous programmes (équivalents aux mois de l'année et donc aux 12 différents fichiers). Du coup je dois mettre le code que tu m'as filé, amélioré bien sur, dans le programme principal, pour que ça boucle, car le truc c'est que si je le mets dans tous mes "sous programmes", je vais devoir choisir 12 fois le dossier ce qui revient à la même chose que getopenfile...
En fait j'avais essayé de mettre les Getopenfile dans le fichier principal et après de tester pour voir si ça marchait toujours et ça marche pas et j'ai peur que ça fasse pareil...je sais pas si j'ai été claire... :x
Le code ne marche pas quand je teste le nom de fichier, enfin si il y a affichage avec msgbox du nom du fichier mais après ça bugg....