2017-02-03 1 views
4

Ich habe der Variablen eine Arbeitsmappe zugewiesen. Dann mache ich ein paar Sachen und speichere die Datei und schließe die Arbeitsmappe:Arbeitsmappenvariable in einer Schleife löschen

Stellt Arbeitsmappe auf nichts eine gute Idee, wenn ich diesen Code in einer Schleife verwenden möchte?

For i = 1 To UBound(a_ven_lst1) 
     Set wb_input1 = Application.Workbooks.Add 
     Set ws_input1 = wb_input1.Sheets(1) 
     .Rows(1).Copy ws_input1.Rows(1) 
     .Rows(d_fst_ven_row & ":" & d_lst_ven_row).Copy ws_input1.Rows(2) 
     s_save_path = f_str_file_name(ws_input1.Cells(2, i_ven_col_cnt).Value) 
     s_file_path = s_path & "\" & s_save_path & ".xlsx" 
     a_ven_lst1(i, 2) = s_file_path 
     wb_input1.SaveAs Filename:=s_file_path 
     wb_input1.Close True 
     Set wb_input1 = Nothing 
    Next i 

Töte ich diese Variable auf eine ordnungsgemäße Weise? Ich sah einige Objekte noch im VBA-Editor vorhanden, nachdem der Code aber weit über diesen Punkt hinaus zerquetscht wurde.

+0

IMO zu sorgen, ist der beste Ansatz ist es, 'Dim' die Variablen auf den kleinsten Umfang es für erforderlich. In diesem Fall würde ich 'wb_input1' innerhalb der Schleife deklarieren. Sie müssten es dann nicht aufheben. –

+0

Da Sie es in der Schleife wiederverwenden, müssen Sie es innerhalb der Schleife nicht wirklich auf nichts einstellen. Realistisch, solange es lokal auf das Subsystem beschränkt ist, wird es standardmäßig bereinigt. – Zerk

+2

@ A.S.H der kleinste Bereich in VBA ist Prozedur-Ebene; Eine Schleife hat keinen eigenen Bereich. Ich würde den Schleifenkörper in eine eigene Prozedur extrahieren und die Variable * dort * deklarieren. –

Antwort

3

alternativer Code nicht über Arbeitsmappe mit variabler Einstellung und Entschärfen

With ws_input 

    '... 

    Dim rowToCopy1 As Range, rowToCopy2 As Range   
    Set rowToCopy1 = .Rows(1) '<--| set first row to copy, since it's "constant" against the subsequent loop 
    Set rowToCopy2 = .Rows(d_fst_ven_row & ":" & d_lst_ven_row) '<--| set second row to copy, since it's "constant" against the subsequent loop 

    For i = 1 To UBound(a_ven_lst1) 
     With Application.Workbooks.Add '<--| open a new workbook and reference its instance 
      With .Sheets(1) '<--| reference referenced workbook sheet(1) 
       rowToCopy1.Copy .Rows(1) 
       rowToCopy1.Copy .Rows(2) 
       s_save_path = f_str_file_name(.Cells(2, i_ven_col_cnt).Value) 
      End With 
      s_file_path = s_path & "\" & s_save_path & ".xlsx" 
      a_ven_lst1(i, 2) = s_file_path 
      .SaveAs Filename:=s_file_path 
      .Close True 
     End With '<--| discard the instance of the opened workbok 
    Next i 

    '... 

End With 
+0

Ordentlich! Wie ich mir wünsche, dass jeder einzelne 'With'-Block in der Welt die Objektreferenz besitzt und hält ... traurig, dass' With'-Blöcke zu oft nur verwendet werden, um die Anzahl der zum Schreiben des Codes erforderlichen Tastenanschläge zu reduzieren. –

+0

Etwas, das NET-Welt vollständig losgeworden ist ... – user3598756

+0

Gute Idee, ein indirekter Weg, um das Scoping zu erreichen;) –