Ranges VBA的迭代

时间:2015-06-11 14:27:16

标签: excel vba excel-vba

我在excel中遇到了一些VBA问题。我正在尝试做一些等效的迭代但是在Range类型中。当然它不起作用。是否有任何选项可以省略这种或某种能够实现我想要的功能?

Sub trial()
    Dim rng As Range
    Dim rng_tmp As Range
    Dim rngf As Range

    Dim lastrow As Long
    Dim lastcol As Long

    lastcol = Sheets("Data").Range("A1").End(xlToRight).Column
    lastrow = Sheets("Data").Range("B" & Sheets("Data").Rows.Count).End(xlUp).Row    

    For i = 2 To lastrow
        If Sheets("Data").Cells(i, 12).Value <= 5 Then
            Set rng_tmp = Sheets("Data").Range(Sheets("Data").Cells(i, 1), Sheets("Data").Cells(i, lastcol))
        End If

        With Sheets("Data").Cells(i, 12)
            If .Value = "11970BR" Or .Value = "13765BR" Or .Value = "14000BR" Or .Value = "14041BR" Or .Value = "14295BR" Or .Value = "14296BR" Or .Value = "14369BR" Or .Value = "14608BR" Or .Value = "14699BR" Then
                Set rng_tmp = Sheets("Data").Range(Sheets("Data").Cells(i, 1), Sheets("Data").Cells(i, lastcol)).Select
            End If
        End With

        ***Set rng = Union(rng, rng_tmp)***
    Next i

    rng.Select

End Sub

这个粗体和斜体(或*之间的代码片段)相当于i = i + 1。有没有办法将它应用于Range类型? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

如果您尝试遍历某个范围内的每个单元格,则以下操作:

For Each c In Worksheets("Sheet1").Range("A1:D10").Cells
    'do something with c here where c is the cell for this iteration
Next

来源: https://msdn.microsoft.com/en-us/library/office/aa221353%28v=office.11%29.aspx

答案 1 :(得分:0)

可能存在一些问题,但我特别发现,如果你的if状态之一不适用,其中一个范围将为空(或者我认为excel不使用),你就不能这样做了。什么都没有。 有关此问题的更多信息,我希望您查看此页面。 因为有办法解决它。

http://www.cpearson.com/excel/BetterUnion.aspx

(如果你调试你的代码,你会在加入union之前看到,如果你检查的第一个单元格不满足加入rng_temp的要求,则rng和rng_temp都没有,但是请参阅上面的页面更多信息)。另外一个小问题是你的rng从一开始就一直是空的。所以你需要检查它是否为空/什么都没有,如果是空的,你可能想要放入你刚检查过的东西,制作rng = rng_temp。通过以下检查

If rng is Nothing Then

希望它有所帮助, 最诚挚的问候