VBA:无效的下一个控制变量参考

时间:2014-02-11 04:25:15

标签: excel vba excel-vba compiler-errors concatenation

基本上,我正在尝试使用代码拆分并为我的目的回收的代码来模仿连接结果。但是当脚本试图处理“Next T”idk时我遇到了问题,但我已经表示为Dim - Integer,而且似乎仍然没有做到这一点。

原始代码来源: Concatenate multiple ranges using vba

我在这一件事上遇到了很多问题,因为它似乎是我实际上一直试图在我的剧本中包含很长时间的唯一一件事。关闭If,调整Then,甚至退出循环都有编译错误。

我认为Next应该是我最后的担忧。

顺便说一句,rnumbers应该保留一个值/整数的位置,但我不完全确定这是否也正确完成。

    rnumbers = Rows(ActiveCell.Range("A3").End(xlDown)) + 3
    'or CellCount = ActiveCell.Range("A" & Rows.Count).End(xldown).Row

    Do While Rows(ActiveCell.Range("A3").End(xlDown)) > 3

        'For Q = 1 To 10 'This provides a column reference to concatenate - Outer For statement
        For T = 3 To rnumbers 'This provides a rows reference to concatenate - Inner for statement

            For Each Cell In Cells("A" & T) 'provides rows and column reference
                If Cell.Value = "" Then
                    GoTo Line1   'this tells the macro to continue until a blank cell is reached
                    Exit For
                End If
                x = x & Cell.Value & Chr(10)   'This provides the concatenated cell value and comma separator
            'Next ' this loops the range

        Next T  'This is the inner loop which dynamically changes the number of rows to loop until a blank cell is reached

        Line1:
        On Error GoTo Terminate 'Terminates if there are less columns (max 10) to concatenate

        ActiveCell.Value = Mid(x, 1, Len(x) - 1) 'This basically removes the last comma from the last concatenated cell e.g. you might get for a range 2,3,4, << this formula removes the last comma to
    'give 2,3,4

        ActiveCell.Offset(1, 0).Select 'Once the concatenated result is pasted into the cell this moves down to the next cell, e.g. from F1 to F2

        x = ""  'The all important, clears x value after finishing concatenation for a range before moving on to another column and range


        'Next Q 'After one range is done the second column loop kicks in to tell the macro to move to the next column and begin concatenation range again

    'rnumbers = 0
    'Next
    Exit Do
    'Resume
    Terminate:'error handler

2 个答案:

答案 0 :(得分:0)

再试一次......当我仔细查看你的代码时,我实际上使用了一个坏词。

你一直在与错误的人群挂钩,并且正在采取一些非常糟糕的代码结构思路。 GoTo后跟Exit For?永远无法达到后一种说法!跳出For循环是一件危险的事情(如果不是错误的话)。是的,您仍然需要Next For Each语句(带有匹配的控制参数 - Next T属于不同的For循环,而不是最内层的。)

无论如何 - 我感觉像the Cat In The Hat:“这个混乱是如此之大,如此之深,如此之高 - 我们无法捡起它,根本没有办法!”所以我决定为你建一座新房子。

我认为以下是您想要做的事情,而且非常优雅。看看它是否有意义,以及是否可以根据您的目的进行调整。我需要去睡觉,但是早上会看看你是否从这里想出来的。

Sub concAll()
Dim allRows As Range, target as range
Dim oneRow
Dim nc as Integer

Set allRows = Range("A3", "J10")  ' pick the real range here - dynamically, probably
nc = allRows.Columns.Count        ' need this number later to know where to put result

For Each oneRow In allRows.Rows   ' loop over one row of the range at a time
  Dim s As String
  s = ""                          ' start with empty string
  For Each c In oneRow.Cells      ' loop over all the cells in the row

    If Not IsEmpty(c) Then
      s = s & "," & c.Text
    Else
      Exit For                     ' done with this row: found empty cell
    End If

  Next c                           ' keep looping over the cells...

  Set target = oneRow.Cells(1).Offset(0, oneRow.Cells.Count) ' cell where we put result
  target.Value = Mid(s, 2)   ' put the concatenated value to the right of everything; 
                             ' skipping first comma (which came before first text)
Next oneRow                  ' repeat for all rows in source range


End Sub

答案 1 :(得分:0)

对不起,我应该解释一下我想要制作的东西,而不是要求修复我想做的事情。我在vba的经历是自学成才,我有点新寻求帮助。

Floris制作的剧本似乎有功能但不是预期的。原来我写的有点过时,需要擦除并重新启动。这实际上是我几个月前开始使用的一个旧脚本,它起源于Web查询。但是网站经历了一些变化,现在剧本到处都是。

我遇到的主要问题是编译错误“无效的下一个控制变量引用”,结果是由一个打开的'Do while'循环引起的,这似乎没有多少来自研究的退出点我抬起头来。应该使用另一个'If'命令。同时,当试图解决'Do While'时,我添加了一个额外的'Next'(因为我认为它们兼容),并且它与脚本搞混了。

很难解释..但是我使用的'Do While',我希望它只在值的数量更大时合并值

rnumbers = Rows(ActiveCell.Range("A3").End(xlDown)) + 3
'or CellCount = ActiveCell.Range("A" & Rows.Count).End(xldown).Row

Do While Rows(ActiveCell.Range("A3").End(xlDown)) > 3

但相反它应该是

Dim CellCount As Range

CellCount = ActiveCell.Range("A" & Rows.Count).End(xlDown).Row + 2
'cause its the active cell + two additional cells

If CellCount > 3

然后打开Floris提交的脚本。 (但由于上面所述,这也失败了。)

再次感谢,希望它解释一切......对不起,如果我浪费你的时间与那个Floris,真的很感激帮助。只是希望我早点请求帮助,这样可以为我节省很多我现在正在处理的挫折感。 &GT; _&GT;