2017-12-22 8 views
1

Ich habe einige Excel-Code, der ein Array von Dateinamen zusammenfügt und dann durchschleift und einige Daten von ihnen extrahiert. Die Daten befinden sich nicht in der Kalkulationstabelle selbst - sie ist vollständig in VBA zusammengestellt. Neue Dateien werden jeden Monat hinzugefügt, daher wird die Anzahl variieren.Excel VBA finden den letzten Eintrag in einem Array (aber nicht in der Kalkulationstabelle)

Mein Problem ist, dass Code, der funktionierte, nicht mehr funktioniert, und ich versuche, eine Abhilfe zu finden. (In Verbindung stehendes: Error: Microsoft Excel has stopped working - But I didn't change anything)

UBound findet die Größe des Feldes. Aber das Array ist nicht vollständig mit Daten gefüllt. Wie finde ich das letzte Element im Array, das etwas enthält?

Ich suche und finde Antworten, die sich auf die Anzahl der Elemente in einer Tabelle beziehen, aber das verwendet kein Arbeitsblatt. Es scheint, als wäre CountA, was ich will, aber Excel: Find last value in an array hat kein Beispiel, das ich herausfinden kann, um Arbeit in meinem Fall zu machen.

Mit anderen Worten, ich möchte etwas außer UBound in dem Code unten verwenden, also gehe ich nicht über die Einträge, die etwas in ihnen haben.

FName = Array("april2010.xls", "feb2010.xls", "jan2010.xls", "july2010.xls", "june2010.xls", _ 
      "mar2010.xls", "may2010.xls", "sep2010.xls", "..\FINAL-MO-BAL-2011\APRIL2011.xls", _ 
      "..\FINAL-MO-BAL-2011\AUG2011.xls", "..\FINAL-MO-BAL-2011\DEC2011.xls", _ 
      "..\FINAL-MO-BAL-2011\FEB2011.xls", "..\FINAL-MO-BAL-2011\JAN2011.xls", _ 
      "..\FINAL-MO-BAL-2011\JULY2011.xls", "..\FINAL-MO-BAL-2011\JUNE2011.xls", _ 
      "..\FINAL-MO-BAL-2011\MARCH2011.xls", "..\FINAL-MO-BAL-2011\MAY2011.xls", _ 
      "..\FINAL-MO-BAL-2011\NOV2011.xls", "..\FINAL-MO-BAL-2011\OCT2011.xls", _ 
      "..\FINAL-MO-BAL-2011\SEP2011.xls", FName2, FName3, FName4, FName5, FName6, _ 
      FName7, FName8, FName9, FName10, FName11, FName12, FName13, FName14, FName15, _ 
      FName16, FName17, FName18, FName19, FName20, FName21, FName22, FName23, FName24, _ 
      FName25, FName26, FName27, FName28, FName29, FName30, FName31, FName32, FName33, _ 
      FName34, FName35, FName36, FName37, FName38, , FName39, FName40, FName41, FName42, _ 
      FName43, FName44, FName45, FName46, FName47, FName48, FName49) 

If IsArray(FName) Then 
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1) 
    WorkbookName = ThisWorkbook.Name 
    rnum = 1 
    For Fnum = LBound(FName) To UBound(FName) 
     Set mybook = Nothing 
     On Error Resume Next 
     Set mybook = Workbooks.Open(Filename:=FName(Fnum), ReadOnly:=True) 

     With Application 
      CalcMode = .Calculation 
      .Calculation = xlCalculationManual 
      .ScreenUpdating = False 
      .EnableEvents = False 
      .CutCopyMode = False 
      .DisplayAlerts = False 
      .Visible = False 
     End With 

     On Error GoTo 0 

     If Not mybook Is Nothing Then 
      On Error Resume Next 
+0

leer es in in einem anderen Array (anfänglich die gleichen Größen sortiert ist) jedoch mit Ausnahme, wo LEN = 0 oder eine solche Logik, einen Zähler mit diesem inkrementieren und dann Zähler ReDim zu erhalten -1 bei Ende ? – QHarr

+0

Oder Schleife das Array und beenden Sie die Schleife, wenn die Testbedingung erfüllt ist, z. = VbNullString und nimm den aktuellen Index? – QHarr

+0

Können Sie weitere Informationen zu *** nicht mehr funktionierend *** und *** nicht vollständig mit Daten *** liefern? Meinst du, dass irgendeine 'FNameXX'-Variable leer ist oder sich auf eine Datei bezieht, die nicht in deinem Dateisystem existiert? –

Antwort

0

Man könnte so etwas wie dieses Recht tun, bevor Sie Ihre Schleife durch die FName Array starten:

Dim LastFilled As Integer 'a variable to hold the last location filled in the array 
'This is checking the array from the last to first 
For i = UBound(FName) To 1 Step -1 
    If FName(i) Is Not Empty Then 
     LastFilled = i 
     Exit For 
    End If 
Next i 

Dann ersetzen Sie UBound(FName) mit LastFilled

+0

Ich bekomme Laufzeitfehler '424': Objekt in der If FName (i) ist nicht leer Linie erforderlich. Aber das könnte immer noch ein nützlicher Hinweis sein. – thursdaysgeek

1

Verwenden Sie die Filter Funktion

Dim fName As Variant 
Dim fltName As Variant 

fName = Array("april2010.xls", "feb2010.xls", "jan2010.xls", "july2010.xls", "june2010.xls", _ 
      "mar2010.xls", "may2010.xls", "sep2010.xls", "..\FINAL-MO-BAL-2011\APRIL2011.xls", _ 
      "..\FINAL-MO-BAL-2011\AUG2011.xls", "..\FINAL-MO-BAL-2011\DEC2011.xls", _ 
      "..\FINAL-MO-BAL-2011\FEB2011.xls", "..\FINAL-MO-BAL-2011\JAN2011.xls", _ 
      "..\FINAL-MO-BAL-2011\JULY2011.xls", "..\FINAL-MO-BAL-2011\JUNE2011.xls", _ 
      "..\FINAL-MO-BAL-2011\MARCH2011.xls", "..\FINAL-MO-BAL-2011\MAY2011.xls", _ 
      "..\FINAL-MO-BAL-2011\NOV2011.xls", "..\FINAL-MO-BAL-2011\OCT2011.xls", _ 
      "..\FINAL-MO-BAL-2011\SEP2011.xls", "FName2", "FName3", "FName4", "FName5", "FName6", _ 
      "FName7", "FName8", "FName9", "FName10", "FName11", "FName12", "FName13", "FName14", "FName15", _ 
      "FName16", "FName17", "FName18", "FName19", "FName20", "FName21", "FName22", "FName23", "FName24", _ 
      "FName25", "FName26", "FName27", "FName28", "FName29", "FName30", "FName31", "FName32", "FName33", _ 
      "FName34", "FName35", "FName36", "FName37", "FName38", "", "FName39", "FName40", "FName41", "FName42", _ 
      "FName43", "FName44", "FName45", "FName46", "FName47", "FName48", "FName49") 

fltName = Filter(fName, ".") 

Debug.Print LBound(fltName), UBound(fltName) 

Ich bin mir nicht sicher, was FName2, FName3, etc sein soll. Sie haben gesagt, dass Array-Elemente ohne Daten vorhanden sind, also sollten sie nur Platzhalter sein, um sie zu demonstrieren.

Auf jeden Fall filter ich auf einen Punkt, also filter, was war kein Dateiname. Vielleicht möchten Sie etwas anderes filtern.

+0

Ich fltName als Typ Variant, wie FName, und wenn ich auf den Filter fltName = (FName, "."), Bekomme ich einen Typ Mismatch-Fehler. Auf der anderen Seite, da alle Dateien in .xlsx enden, ist eine Periode eine gute Sache zum Filtern. – thursdaysgeek

+0

Mit den angegebenen Beispieldaten, wenn Sie nach '.xlsx' filtern, wird 'fltName'' Nothing' sein, da kein Element übereinstimmt. Ansonsten ist dieser Code der schnellste, den Sie bekommen können. Stellen Sie sicher, dass Sie 'LBound (fltName)' in Ihrer Schleife verwenden, da das gefilterte Array immer bei Index 0 und nicht bei 1 beginnt (was Sie möglicherweise in Ihrem Code verwenden). – user1016274

+0

Typ Mismatch in der Funktion "Filter" bedeutet, dass 'fName' kein Array ist. Wenn Sie diesen Fehler bekommen, haben Sie das Direktes Fenster und geben '' typename (fname) 'ein und wenn Sie etwas anderes als' Variant() 'oder' String() 'oder einen anderen Array-Typ bekommen, dann sind Sie Code-Isn setze kein Array in fName. –

0

Anstatt den Fehler zu überspringen, überprüfen Sie, dass der Eintrag im Array nicht leer ist und dass der Pfad existiert.

Sie können auch nicht das aktuelle Verzeichnis mit ChDir wenn CurDir nicht wieder die erwartete man ändern.

Etwas wie:

Dim i As long, fname As String 

' set the current directory with the directory of this workbook ' 
ChDir ThisWorkbook.Path 

For i = LBound(FNames) To UBound(FNames) 
    fname = FNames(i) 

    ' if has entry ' 
    If Len(fname) Then 

     ' if file exists ' 
     If Len(Dir(fname)) Then 

      ' open workbook ' 
      Set wb = Workbooks.Open(Filename:=fname, ReadOnly:=True) 


     End If 
    End If 
Next 
Verwandte Themen