2015-03-26 2 views
0

J'ai l'intention de créer une macro qui trouve un fichier correspondant à l'année en cours et boucle ses feuilles. Les noms des feuilles correspondent aux noms des mois (en suédois). Mon problème est cependant que, en raison de la suppression possible des données, etc. dans les fichiers que j'importe, je ne veux pas importer les données entrées il y a plus de 2 mois et faire une boucle du mois correspondant au mois d'aujourd'hui. UBound (MyHeadings) car certaines données que je veux extraire sont constantes sur l'année).Boucler en novembre, décembre et janvier en utilisant VBA

Dim MonthNo As Integer 'Makes MonthNo = Month(Date) return an integer, instead of actual month name 
MonthNo = Month(Date) 
myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",") 
p3file = "C:\pathtofile\" 'Because Dir does not return pathfile. 
YearNo = Year(Date) 
path3 = IIF(MonthNo-2, Dir("C:\pathtofile\" & "-" & YearNo-1 & ".xlsx"),Dir("C:\pathtofile\" & "-" & YearNo & ".xlsx")) 

Do While Len(path3) > 0 
    Set openWb = Workbooks.Open(p3file & path3) 
    For i = MonthNo To UBound(myHeadings) 
     Set openWs = openWb.Sheets(CStr(YearNo)) 
     'Do things 
     End If 
    Next i 
YearNo = YearNo + 1 
path3 = Dir("C:\pathtofile\" & YearNo & ".xlsx") 
Loop 

Ce qui précède est ce que j'ai essayé. Le problème se pose si MonthNo -2 est inférieur à 0, puisque je dois importer le fichier de l'année précédente (ce que je fais par l'instruction IIf). La boucle devient cependant erronée. Si le mois en cours est, par exemple, janvier 2015, je veux ouvrir le fichier de 2014, boucler jusqu'en novembre et décembre, puis ouvrir le fichier 2015 et boucler jusqu'en janvier. Existe-t-il un moyen efficace d'y parvenir?

+1

Votre condition 'MonthNo-2' dans l'instruction IIF ne semble pas correcte. C'est faux seulement pour 'MonthNo = 2', je suppose que cela devrait être' MonthNo-2 <= 0'. Aussi je ne comprends pas pourquoi la boucle commence à 'MonthNo' et pas à' MonthNo-2'. 'CStr (YearNo)' dans la première ligne des regards suspects aussi - probablement ce devrait être 'myHeadings (i)'. – BrakNicku

+0

Faites-le donc si MonthNo = 0 puis son Décembre de l'année précédente et si MonthNo = -1 alors c'est Novembre – phil652

+0

@ user3964075 Oui c'est vrai! J'ai édité mon code dans mon programme pendant que je l'ai écrit ici, donc j'ai défini MonthNo différemment. MonthNo = Month (Date) -2, ce qui motive pourquoi il provient de MonthNo Bon point avec myHeadings (i) <=. Éditera demain, devra aller ASAP – Cenderze

Répondre

1

Votre code pourrait ressembler à ceci:

Dim MonthNo As Integer, YearNo As Integer 
Dim CurrentYear As Integer 
Dim StartDate As Date 
Dim i As Integer 

Const MonthOffset As Integer = -2 

CurrentYear = Year(Date) 

StartDate = DateAdd("m", MonthOffset, Date) 
MonthNo = Month(StartDate) 
YearNo = Year(StartDate) 

Do While YearNo <= CurrentYear 
'Open file here 
    For i = MonthNo To 12 

    'Process sheets here 

    Next i 
    MonthNo = 1 
    YearNo = YearNo + 1 
Loop 

Ce code devrait fonctionner OK pour un mois de décalage défini dans la constante.

+0

Cela m'a aidé à se débarrasser du problème, et en raison de la clarté de la réponse, il m'a aidé à résoudre mon problème avec les deux boucles restantes qui étaient d'un genre différent. Merci spécialement pour la fonction "DateAdd". J'ai pensé que je devais faire un tas de déclarations if. – Cenderze