0

我有一张用颜色编码的桌子。我想循环浏览每一行,并返回一个字符串,该字符串表示该行中的哪些列是彩色的。我的方法是定义要循环通过的垂直单元格范围,然后为该范围内的每个单元格定义要循环通过的水平范围。我得到的错误表明 For 变量已在使用中。这是我正在使用的代码:

Public Sub Months()

Dim Tally As String
Dim R1 As Range
Dim R2 As Range
Dim Col As String

Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
Set R1 = Range(Selection.Address)

For Each cell In R1
    cell.Activate
    Range(Selection, Selection.End(xlRight)).Select
    Set R2 = Range(Selection.Address)
    For Each cell In R2
        If cell.Interior.ColorIndex > 0 Then
            Col = Split(ActiveCell(1).Address(1, 0), "$")(0)
            If Tally Is Nothing Then
                Set Tally = Col
            Else
                Set Tally = Tally + ";" + Col
            End If
            Range("DF" & (ActiveCell.Row)).Select
            ActiveCell.Value = Tally
        End If
    Next
Next

End Sub

有什么想法吗?

非常感谢。

4

3 回答 3

2

与往常一样,Option Explicit将帮助您确定此错误的原因。

对于初学者,您不需要多个范围,只需要一个定义整个表格的范围。我将在下面向您展示如何做到这一点。

至于直接的问题

在上下文中,For each cell in ... R1wherecell不是特殊关键字,它是正在使用的隐含变量。当您稍后执行此操作For each cell in R2时,Excel 会对您大笑,因为cell上面的循环已经启动。

即,如果我们使用伪关键字以外的东西,问题可能会更明显cell

For i = 1 to 10
    For i = 3 to 44
        Msgbox i
    Next
Next

如果编译器可以到达消息框行,i您希望它显示什么值?这是错误的原因。您的迭代器已在使用中,您无法重复使用它。

声明所有变量,并Option Explicit在以后避免这些错误:)

定义表格范围的更好方法

但是,简单地定义一个范围会更有效,而不是随意尝试为表中的每一行或每一列定义和重新定义行范围。尝试这样的事情。

Option Explicit
Public Sub Months()
Dim Tally As String
Dim tbl As Range
Dim r As Range
Dim c As Range
Dim cl As Range
Dim Col As String

Set tbl = Range(Range("A2").End(xlDown), Range("A2").End(xlToRight))

For Each r In tbl.Rows
    For Each c In tbl.Columns
        Set cl = tbl.Cells(r, c)
        If cl.Interior.ColorIndex > 0 Then
            Col = Split(cl.Address(1, 0), "$")(0)
'            If Tally Is Nothing Then
'                Set Tally = Col
'            Else
'                Set Tally = Tally + ";" + Col
'            End If
            Range("DF" & (cl.Row)).Select
            cl.Value = Tally
        End If
    Next
Next

End Sub

笔记:

我已经注释掉了与Tally变量有关的代码块,因为有几个错误:

  • Tally是一个字符串变量。不要使用关键字Set来分配字符串变量。
  • Tally是一个字符串变量,因此Is Nothing会不匹配。检查Tally = vbNullStringLen(Tally) = 0代替。
  • 虽然该运算符+可能允许字符串连接,但我相信 VBA 中的首选运算符是&,因此尽管这可能不会导致错误,但您可能会更改它以消除歧义。
于 2013-06-07T17:49:06.477 回答
1

您在嵌套的 For 循环中使用相同的变量名称:

For Each cell In R1
...
    For Each cell In R2

将第二个循环中的“cell”变量更改为其他内容。

另外,这一行:

If Tally Is Nothing Then

会破裂。Tally 被定义为一个字符串,而不是一个对象,所以你应该使用 "If Tally <> "" Then"

于 2013-06-07T17:49:42.323 回答
1

如果可能的话,你应该避免做出选择。

未经测试:

Public Sub Months()

Dim Tally As String
Dim R1 As Range
Dim R2 As Range
Dim Col As String
Dim c As Range, c2 As Range

    With ActiveSheet
        Set R1 = .Range(.Range("A2"), .Range("A2").End(xlDown))
    End With

    For Each c In R1.Cells
        Tally = ""
        Set R2 = ActiveSheet.Range(c, c.End(xlToRight)) 'not xlRight...
        For Each c2 In R2.Cells
            If c2.Interior.ColorIndex > 0 Then
                Col = Split(c2.Address(), "$")(0)
                Tally = Tally & IIf(Len(Tally) > 0, ";", "") & Col 'Set not required...
            End If
        Next
        ActiveSheet.Range("DF" & c.Row).Value = Tally
    Next

End Sub
于 2013-06-07T18:00:00.483 回答