只要列相同,就循环遍历Excel文件

时间:2014-07-28 07:43:27

标签: excel vba

我在列A中有一个Excel文件:A是名称,B列:B是相关的月份。 同样地(A,B):Tom JAN Tom Jan Tom NOV Tom DEC Jack SEP Jack DEC Jack AUG ......

我现在正试图循环使用它。我通过使用这个"脚本"循环到列的(未知)结尾来克服第一个障碍。

Sub DoWhile()

Dim i As Long
Dim c As Collection
Set c = New Collection


c.Add Cells(1, 1), "Name"
c.Add Cells(1, 2), "Month"
c.Add Cells(1, 3), "Volume"

i = 2
With ActiveSheet
    Do While i <= .Rows.Count
        If .Cells(i, 1) <> "" Then
            c.Add Cells(i, 1), "Name"
            c.Add Cells(i, 2), "Month"
            c.Add Cells(i, 3), "Volume"
            MsgBox c.Item("Name")
            MsgBox c.Item("Month")
            MsgBox c.Item("Volume")
        Else
            Exit Do
        End If
        i = i + 1
    Loop
End With
End Sub

问题: 运行时错误&#39; 457&#39;: 此键已与此集合的元素相关联。

似乎我不允许每个键使用多个值。我该如何绕过这个问题?

使用其他语言执行此操作非常简单。我创建一个包含相应列值的列表,只要列表[i-1] == list [i] ...

,就循环显示该列表

有人可以帮助我吗?

简而言之:

输入:

  

A B

     

Tom JAN

     

Tom MAR

     

John NOV

     

John NOV

     

John DEC

     

Marc JUN

     

Marc JAN

     

...

输出应该是excel表格:

  

A B C D

     

Tom JAN - MAR

     

约翰 - - -

     

Marc JAN - - -

     

等等......

2 个答案:

答案 0 :(得分:0)

我认为这更简单:

Dim i As Long
Dim nA(1 To 10000) As String
Dim nB(1 To 10000) As String

i = 2
e = 0
With ActiveSheet
    Do While i <= .Rows.Count
        If .Cells(i, 1) <> "" Then
            If Cells(i - 1, 1) = Cells(i, 1) Then
                nB(e) = nB(e) & " - " & Cells(i, 2)
            Else
                e = e + 1
                nA(e) = Cells(i, 1)
                nB(e) = Cells(i, 2)
            End If
            MsgBox nA(e) & " : " & nB(e)
        Else
            Exit Do
        End If
        i = i + 1
    Loop
End With

你不能在集合中使用相同的密钥......

答案 1 :(得分:0)

我建议使用类似下面的内容。代码将找到当前区域,然后根据A1和前3列中的行调整大小。然后我打印到MsgBox,但如果需要,您可以将它们粘贴到另一个工作表上。

Dim arr As Variant
Dim i As Integer

arr = Range("A1").CurrentRegion.Resize(Range("A1").End(xlDown).Row, 3).Value

For i = 1 To UBound(arr)

    MsgBox arr(i, 1)
    MsgBox arr(i, 2)
    MsgBox arr(i, 3)

Next i