【问题标题】:VBA Arrays and LoopsVBA 数组和循环
【发布时间】:2016-05-26 19:45:58
【问题描述】:

我在循环遍历我已经定义的数组以查找超过 500 的值时遇到问题。它告诉我我的下标超出范围。

这是我目前所拥有的。有人可以帮我修复第二部分,这样它就会正确地循环遍历已经建立的数组。

Sub hishSale()

    Dim customers() As String
    Dim sale() As String
    Dim hiCustomer() As String
    Dim hiSale() As String
    Dim nCustomers As Integer
    Dim i As Integer
    Dim isOver As Integer


    'capture the number of customers and sales and put them in two seperate arrays
    With wsData.Range("A3")
        nCustomers = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
        ReDim customers(nCustomers)
        ReDim sale(nCustomers)
        For i = 1 To nCustomers
            customers(i) = .Offset(i, 0).Value
            sale(i) = .Offset(i, 1).Value
        Next
    End With

'Loop through arrays to find sales over $500

    With Range("A3")
    isOver = 0
        For i = 1 To nCustomers
            If .Offset(i, 1).Value > 500 Then
                isOver = isOver + 1
                hiCustomer(isOver) = .Offset(i, 0).Value
                hiSale(isOver) = .Offset(isOver, 1).Value
            End If
        Next
    End With

    'return results in columns D and E
    With Range("D3")
        For i = 1 To nCustomers
        .Offset(i, 0) = hiCustomer(isOver)
        .Offset(i, 1) = hiSale(isOver)
        Next
    End With

End Sub

【问题讨论】:

  • 循环数组做for lbound(customers()) to ubound(customers())
  • 在你的最后一个循环中,也许你打算使用 i 来索引到 hiCustomerhiSale ?你正在使用isOver,此时它的值是固定的
  • 您需要准确指出哪一行有错误...
  • 您似乎不喜欢这些answers。他们怎么了?这次你要给那些愿意花时间解决你在这里提出的问题的人一些反馈吗?
  • 有问题的行是:With Range("D3") For i = 1 To nCustomers .Offset(i, 0) = hiCustomer(isOver) .Offset(i, 1) = hiSale(isOver) Next End With .Offset(i, 0) = hiCustomer(isOver) --- 给我一个错误

标签: arrays vba excel loops


【解决方案1】:

我开始写一个详细的描述,介绍你的数组比需要的更大,以及它们的底数如何为零,但这样做我发现问题是你从来没有维度 hiCustomerhiSale

改变这个:-

'Loop through arrays to find sales over $500
With Range("A3")
isOver = 0
    For i = 1 To nCustomers
        If .Offset(i, 1).Value > 500 Then
            isOver = isOver + 1
            hiCustomer(isOver) = .Offset(i, 0).Value
            hiSale(isOver) = .Offset(isOver, 1).Value
        End If
    Next
End With

对此:-

ReDim hiCustomer(0)
ReDim hiSale(0)
With Range("A3")
    For i = 1 To nCustomers
        If .Offset(i, 1).Value > 500 Then
            ReDim Preserve hiCustomer(UBound(hiCustomer, 1) + 1)
            ReDim Preserve hiSale(UBound(hiSale, 1) + 1)
            hiCustomer(UBound(hiCustomer, 1)) = .Offset(i, 0).Value
            hiSale(UBound(hiCustomer, 1)) = .Offset(i, 1).Value
        End If
    Next
End With

如果我没看错,下一个循环也需要更改为:-

'return results in columns D and E
With Range("D3")
    For i = 1 To UBound(hiCustomer)
        .Offset(i, 0) = hiCustomer(i)
        .Offset(i, 1) = hiSale(i)
    Next
End With

以前它查看的是客户列表,而不仅仅是 >500 列表。

【讨论】:

  • 谢谢!这行得通。有没有办法不用Ubound就可以写代码?
  • @th65 是的,但会更长。添加它是一个新问题,我相信有人会提供帮助。我很好奇为什么。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多