2017-10-19 18 views
1

J'ai une macro qui ouvre un classeur, copie des données pendant 24 heures dans un tableau à l'aide de VLOOKUP puis colle le tableau dans le classeur principal, puis revient au classeur ouvert et copie un autre ensemble de données dans le tableau. Malheureusement, après avoir copié le premier ensemble de données, j'obtiens "Indice hors limites". Je sais que la raison est que macro tente d'activer un classeur qui ne peut pas trouver même si elle est déjà ouvertRéactivation du classeur précédent dans la boucle for VBA

Sub main() 

Dim fname As String, pathfile As String, year As Long, month As Long, day As Long 
Dim version As Long, nazwa_raportu As String, miesiac As String, dzien As String 
Dim hour As Long, godzina As Long 
Dim Arr(1 To 10) As String, Data(0 To 23) As Long 
Dim i As Long, fullname As String 

Arr(1) = "somename1" 
Arr(2) = "somename2" 
Arr(3) = "somename3" 
Arr(4) = "somename4" 
Arr(5) = "somename5" 
Arr(6) = "somename6" 
Arr(7) = "somename7" 
Arr(8) = "somename8" 
Arr(9) = "somename9" 
Arr(10) = "somename10" 

For month = 1 To 12 
    If month < 10 Then 
     miesiac = "0" & month 
    Else 
     miesiac = month 
    End If 

    For day = 1 To 31 
     If day < 10 Then 
      dzien = "0" & day 
     Else 
      dzien = day 
     End If 

     Do 
      pathfile = "C:\Users\M\Documents\Reports\XXXX\ARDR\" 
      fname = pathfile & miesiac & "_" & dzien & "_" & ".xls" 
      ' if file not present skip 
      If Len(Dir(fname)) = 0 Then 
       Exit Do 
      End If 
      Workbooks.Open (fname) 
      fullname = Application.ActiveWorkbook.fullname 

      For i = 1 To 10 
       For hour = 0 To 23 
        Data(hour) = Application.WorksheetFunction.VLookup(Arr(i), Range(Cells(1, 1), Cells(100, 80)), 4 + 3 * hour, False) 
       Next hour 
       For godzina = 0 To 23 
        Workbooks("main.xlsm").Activate 
        Cells(3 + godzina * day, 1 + i * 2) = Dane(godzina) 
       Next godzina 
       Workbooks(fullname).Activate 
      Next i 

     Loop While False 
    Next day 
Next month 

Comment puis-je réactiver classeur que j'ai ouvert avant la boucle

For i = 1 To 10 

Bien que Je suis toujours dans cette boucle?

+0

Vous pouvez faire 'Set srcWB = Workbooks (source nom de classeur)' et 'Set trgWB = Workbooks (cible nom du classeur) 'de cette façon vous pouvez basculer en arrière. – ian0411

Répondre

2

essayez le code ci-dessous (je l'ai commenté les nouvelles lignes que j'ai ajouté):

Dim NewWB As Workbook ' <-- New Workbook Object declaration 

For month = 1 To 12 
    If month < 10 Then 
     miesiac = "0" & month 
    Else 
     miesiac = month 
    End If 

    For day = 1 To 31 
     If day < 10 Then 
      dzien = "0" & day 
     Else 
      dzien = day 
     End If 

     Do 
      pathfile = "C:\Users\M\Documents\Reports\XXXX\ARDR\" 
      fname = pathfile & miesiac & "_" & dzien & "_" & ".xls" 
      ' if file not present skip 
      If Len(Dir(fname)) = 0 Then 
       Exit Do 
      End If 
      Set NewWB = Workbooks.Open(fname) '<-- Set the Opened workbook to a Workbook Object 

      For i = 1 To 10 
       For hour = 0 To 23 
        Data(hour) = Application.WorksheetFunction.VLookup(Arr(i), Range(Cells(1, 1), Cells(100, 80)), 4 + 3 * hour, False) 
       Next hour 
       For godzina = 0 To 23 
        Workbooks("main.xlsm").Activate 
        Cells(3 + godzina * day, 1 + i * 2) = Dane(godzina) 
       Next godzina 
       NewWB.Activate ' <-- activate again (inside the loop) 
      Next i 

     Loop While False 

     Set NewWB = Nothing '<-- Clear Object 
    Next day 
Next month 
+0

Fonctionne bien! Merci beaucoup! – Seidhe

+0

Je wiil dès que je reçois 15 rep. :) Je suis à 11 en ce moment. – Seidhe