Excel VBA查找数组中的最后一个条目(但不在电子表格中)

问题描述 投票:1回答:3

我有一些Excel代码组装了一个文件名数组,然后循环并从中提取一些数据。数据不在电子表格中 - 它完全在VBA中组装。每个月都会添加新文件,因此数量会有所不同。

我的问题是,正在运行的代码不再有效,我正试图找出一种解决方法。 (相关:Error: Microsoft Excel has stopped working - But I didn't change anything

UBound找到数组的大小。但是阵列并没有完全充满数据。如何在数组中找到包含其中某些内容的最后一项?

我正在搜索并找到与查找电子表格中的项目数相关的答案,但这并不真正使用工作表。看起来CountA可能就像我想要的那样,但是Excel: Find last value in an array没有一个我能想出来的例子。

换句话说,我想在下面的代码中使用除了UBound之外的东西,所以我不会超过其中包含某些内容的条目。

    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
arrays excel vba excel-vba excel-2016
3个回答
1
投票

使用Filter函数

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)

我不确定FName2FName3等应该是什么。你说有阵列元素没有数据,所以也许它们只是展示的占位符。

无论如何,我过滤了一个点,因此筛选出不是文件名的内容。您可能希望过滤不同的内容。


0
投票

你可以在通过FName数组开始循环之前做这样的事情:

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

然后用UBound(FName)替换你的LastFilled


0
投票

而不是跳过错误,检查数组中的条目是否为空并且路径是否存在。

如果ChDir没有返回预期的目录,您可能还必须使用CurDir更改当前目录。

就像是:

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
© www.soinside.com 2019 - 2024. All rights reserved.