【问题标题】:Array not Repopulating数组未重新填充
【发布时间】:2022-02-09 17:53:10
【问题描述】:

在我的 Excel 文件中,我有 10 个工作表,代表从 9 月到 6 月的月份。下载 csv 文件并对数据进行排序(按月然后按天)后,我使用以下代码将每个月的范围添加到数组中。

Function findLastRow(ws As Worksheet, column As String) As Integer 
    findLastRow = ws.Cells(ws.Rows.Count, column).End(xlUp).row
End Function

Function searchColumn(ws As Worksheet, column As String, value As Integer) As Boolean
    Dim rng As Range
    Dim cell As Range
    Dim search As String
    Dim startRow As Integer
    Dim endRow As Integer
    
    Set rng = ws.Range("J2:J" & findLastRow(ws, column))

    Set cell = rng.Find(what:=value, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
    
    If cell Is Nothing Then
        searchColumn = False
    Else
        searchColumn = True
    End If
End Function

Sub UpdateAttendance()
    Dim attendanceArr As Variant
    Dim i As Integer

    For i = 10 To 10
        nameCheck = False
        
        If searchColumn(attendanceSheet, "J", i) = True Then
            With attendanceSheet
                startRow = .Range("J1:J" & findLastRow(attendanceSheet, "J")).Find(what:=i, after:=.Range("J1")).row
                endRow = .Range("J1:J" & findLastRow(attendanceSheet, "J")).Find(what:=i, after:=.Range("J1"), searchdirection:=xlPrevious).row
            End With
            
            attendanceArr = Range("A" & startRow & ":" & attendanceSheetLastLetter & endRow)
                
            Select Case i
            
                Case 1
                    populateAttendance ThisWorkbook.Sheets("January"), attendanceArr
                   
                Case 2 
                    populateAttendance ThisWorkbook.Sheets("February"), attendanceArr
                    
                Case 3
                    populateAttendance ThisWorkbook.Sheets("March"), attendanceArr
                    populateAttendance ThisWorkbook.Sheets("April"), attendanceArr
                    
                Case 5
                    populateAttendance ThisWorkbook.Sheets("May"), attendanceArr
                    
                Case 6
                    populateAttendance ThisWorkbook.Sheets("June"), attendanceArr
                    
                Case 9
                    populateAttendance ThisWorkbook.Sheets("September"), attendanceArr
                    
                Case 10 
                    populateAttendance ThisWorkbook.Sheets("October"), attendanceArr
                    
                Case 11
                    populateAttendance ThisWorkbook.Sheets("November"), attendanceArr
                    
                Case 12
                    populateAttendance ThisWorkbook.Sheets("December"), attendanceArr
                   
            End Select
        End If
    Next i
End Sub

当我单步执行代码时,它会跳过案例 1 到 8(1 月到 8 月),这是它应该做的。
当 i 为 9(9 月)时,成功执行 subpopulateAttendance。

当 i 为 10(10 月)时,它成功检测到 startRow 和 endRow(它指出 10 开始的行是 1302 并结束于 2211 行,这是正确的)。
然后它执行 admissionArr 行,结果是

数组为空。但是,当我将 For 循环更改为 For i = 10 To 10 时,只关注 10 月,宏就起作用了。

【问题讨论】:

  • 你试过调试吗?例如,您是否获得了 startRow/endRow 的预期值?
  • 您提供的少量代码并没有给我们您在问题中描述的所有信息,包括数组的定义(大小,维度),i 是如何迭代的然后用作索引等。请编辑问题以显示更多代码。

标签: excel vba


【解决方案1】:

首先Case 4 不见了!但请注意,您可以使用以下代码,而不是整个 Select Case i 块(包含大量重复代码):

' define this before your for loop starts
Dim MonthsList As Variant
MonthsList = Array("January", "February", "March", "April", "May", "June", "September", "October", "November", "December")

用这一行代替整个Select Case i … End Select 块:

populateAttendance ThisWorkbook.Sheets(MonthsList(i - 1)), attendanceArr

注意这里

attendanceArr = Range("A" & startRow & ":" & attendanceSheetLastLetter & endRow)

没有定义Range 在哪个工作表中,因此它可能会选择错误的工作表,如果此工作表为 epmty,则您的数组为空。使用更具体的内容,例如:

attendanceArr = attendanceSheet.Range("A" & startRow & ":" & attendanceSheetLastLetter & endRow).Value

始终定义必须在哪个工作表中找到范围,否则 Excel 有机会选择错误的工作表。

【讨论】:

  • 感谢您的反馈,一切正常。保重。
猜你喜欢
  • 2011-09-19
  • 2023-03-20
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多